From de2ae73d0c0f7b03f58033f499dc4bfd7a4b6f21 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Mon, 7 Oct 2024 10:20:20 -0700 Subject: [PATCH 01/22] feat(cwl): Initialize TailLogGroup command with Wizard (#5722) ## Problem CWL is planning on supporting a LiveTail experience in AWSToolkit for VSCode ## Solution Registers `aws.cwl.tailLogGroup` as a recognized command in AWS Toolkit. In this PR, running this command will simply take the user through a Wizard to collect the configuration for the tailing session, and logs it. In follow up PRs, I will take this Wizard input and use it to call CWL APIs and output streamed LogEvents to a TextDocument. This command will be able to be executed in the command pallet, or by pressing a "play button" icon when viewing LogGroups in the CloudWatch Logs explorer menu. --- .../awsService/cloudWatchLogs/activation.ts | 11 +- .../cloudWatchLogs/commands/tailLogGroup.ts | 108 ++++++++++++ .../liveTailLogStreamSubmenu.ts | 166 ++++++++++++++++++ packages/core/src/shared/constants.ts | 8 + .../commands/tailLogGroup.test.ts | 28 +++ .../liveTailLogStreamSubmenu.test.ts | 74 ++++++++ packages/toolkit/package.json | 22 +++ 7 files changed, 416 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts create mode 100644 packages/core/src/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.ts create mode 100644 packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts create mode 100644 packages/core/src/test/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.test.ts diff --git a/packages/core/src/awsService/cloudWatchLogs/activation.ts b/packages/core/src/awsService/cloudWatchLogs/activation.ts index a186a8ba983..03760b158e7 100644 --- a/packages/core/src/awsService/cloudWatchLogs/activation.ts +++ b/packages/core/src/awsService/cloudWatchLogs/activation.ts @@ -19,6 +19,7 @@ import { searchLogGroup } from './commands/searchLogGroup' import { changeLogSearchParams } from './changeLogSearch' import { CloudWatchLogsNode } from './explorer/cloudWatchLogsNode' import { loadAndOpenInitialLogStreamFile, LogStreamCodeLensProvider } from './document/logStreamsCodeLensProvider' +import { tailLogGroup } from './commands/tailLogGroup' export async function activate(context: vscode.ExtensionContext, configuration: Settings): Promise { const registry = LogDataRegistry.instance @@ -89,6 +90,14 @@ 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.cwl.tailLogGroup', async (node: LogGroupNode | CloudWatchLogsNode) => { + const logGroupInfo = + node instanceof LogGroupNode + ? { regionName: node.regionCode, groupName: node.logGroup.logGroupName! } + : undefined + await tailLogGroup(logGroupInfo) + }) ) } diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts new file mode 100644 index 00000000000..53903f9610d --- /dev/null +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -0,0 +1,108 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as nls from 'vscode-nls' +import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient' +import { createBackButton, createExitButton, createHelpButton } from '../../../shared/ui/buttons' +import { createInputBox } from '../../../shared/ui/inputPrompter' +import { DataQuickPickItem } from '../../../shared/ui/pickerPrompter' +import { Wizard } from '../../../shared/wizards/wizard' +import { CloudWatchLogsGroupInfo } from '../registry/logDataRegistry' +import { RegionSubmenu, RegionSubmenuResponse } from '../../../shared/ui/common/regionSubmenu' +import { CancellationError } from '../../../shared/utilities/timeoutUtils' +import { LogStreamFilterResponse, LogStreamFilterSubmenu } from '../liveTailLogStreamSubmenu' +import { getLogger, ToolkitError } from '../../../shared' +import { cwlFilterPatternHelpUrl } from '../../../shared/constants' + +const localize = nls.loadMessageBundle() + +export interface TailLogGroupWizardResponse { + regionLogGroupSubmenuResponse: RegionSubmenuResponse + logStreamFilter: LogStreamFilterResponse + filterPattern: string +} + +export async function tailLogGroup(logData?: { regionName: string; groupName: string }): Promise { + const wizard = new TailLogGroupWizard(logData) + const wizardResponse = await wizard.run() + if (!wizardResponse) { + throw new CancellationError('user') + } + + //TODO: Remove Log. For testing while we aren't yet consuming the wizardResponse. + getLogger().info(JSON.stringify(wizardResponse)) +} + +export class TailLogGroupWizard extends Wizard { + public constructor(logGroupInfo?: CloudWatchLogsGroupInfo) { + super({ + initState: { + regionLogGroupSubmenuResponse: logGroupInfo + ? { + data: logGroupInfo.groupName, + region: logGroupInfo.regionName, + } + : undefined, + }, + }) + this.form.regionLogGroupSubmenuResponse.bindPrompter(createRegionLogGroupSubmenu) + this.form.logStreamFilter.bindPrompter((state) => { + if (!state.regionLogGroupSubmenuResponse?.data) { + throw new ToolkitError('LogGroupName is null') + } + return new LogStreamFilterSubmenu( + state.regionLogGroupSubmenuResponse.data, + state.regionLogGroupSubmenuResponse.region + ) + }) + this.form.filterPattern.bindPrompter((state) => createFilterPatternPrompter()) + } +} + +export function createRegionLogGroupSubmenu(): RegionSubmenu { + return new RegionSubmenu( + getLogGroupQuickPickOptions, + { + title: localize('AWS.cwl.tailLogGroup.logGroupPromptTitle', 'Select Log Group to tail'), + buttons: [createExitButton()], + }, + { title: localize('AWS.cwl.tailLogGroup.regionPromptTitle', 'Select Region for Log Group') }, + 'LogGroups' + ) +} + +async function getLogGroupQuickPickOptions(regionCode: string): Promise[]> { + const client = new DefaultCloudWatchLogsClient(regionCode) + const logGroups = client.describeLogGroups() + + const logGroupsOptions: DataQuickPickItem[] = [] + + for await (const logGroupObject of logGroups) { + if (!logGroupObject.arn || !logGroupObject.logGroupName) { + throw new ToolkitError('LogGroupObject name or arn undefined') + } + + logGroupsOptions.push({ + label: logGroupObject.logGroupName, + data: formatLogGroupArn(logGroupObject.arn), + }) + } + + return logGroupsOptions +} + +function formatLogGroupArn(logGroupArn: string): string { + return logGroupArn.endsWith(':*') ? logGroupArn.substring(0, logGroupArn.length - 2) : logGroupArn +} + +export function createFilterPatternPrompter() { + const helpUri = cwlFilterPatternHelpUrl + return createInputBox({ + title: 'Provide log event filter pattern', + placeholder: 'filter pattern (case sensitive; empty matches all)', + prompt: 'Optional pattern to use to filter the results to include only log events that match the pattern.', + buttons: [createHelpButton(helpUri), createBackButton(), createExitButton()], + }) +} diff --git a/packages/core/src/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.ts b/packages/core/src/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.ts new file mode 100644 index 00000000000..e39cd1b8282 --- /dev/null +++ b/packages/core/src/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.ts @@ -0,0 +1,166 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import { Prompter, PromptResult } from '../../shared/ui/prompter' +import { DefaultCloudWatchLogsClient } from '../../shared/clients/cloudWatchLogsClient' +import { createCommonButtons } from '../../shared/ui/buttons' +import { createInputBox, InputBoxPrompter } from '../../shared/ui/inputPrompter' +import { createQuickPick, DataQuickPickItem, QuickPickPrompter } from '../../shared/ui/pickerPrompter' +import { pageableToCollection } from '../../shared/utilities/collectionUtils' +import { CloudWatchLogs } from 'aws-sdk' +import { isValidResponse, StepEstimator } from '../../shared/wizards/wizard' +import { isNonNullable } from '../../shared/utilities/tsUtils' +import { + startLiveTailHelpUrl, + startLiveTailLogStreamNamesHelpUrl, + startLiveTailLogStreamPrefixHelpUrl, +} from '../../shared/constants' + +export type LogStreamFilterType = 'menu' | 'prefix' | 'specific' | 'all' + +export interface LogStreamFilterResponse { + readonly filter?: string + readonly type: LogStreamFilterType +} + +export class LogStreamFilterSubmenu extends Prompter { + private logStreamPrefixRegEx = /^[^:*]*$/ + private currentState: LogStreamFilterType = 'menu' + private steps?: [current: number, total: number] + private region: string + private logGroupArn: string + public defaultPrompter: QuickPickPrompter = this.createMenuPrompter() + + public constructor(logGroupArn: string, region: string) { + super() + this.region = region + this.logGroupArn = logGroupArn + } + + public createMenuPrompter() { + const helpUri = startLiveTailHelpUrl + const prompter = createQuickPick(this.menuOptions, { + title: 'Select LogStream filter type', + buttons: createCommonButtons(helpUri), + }) + return prompter + } + + private get menuOptions(): DataQuickPickItem[] { + const options: DataQuickPickItem[] = [] + options.push({ + label: 'All', + detail: 'Include log events from all LogStreams in the selected LogGroup', + data: 'all', + }) + options.push({ + label: 'Specific', + detail: 'Include log events from only a specific LogStream', + data: 'specific', + }) + options.push({ + label: 'Prefix', + detail: 'Include log events from LogStreams that begin with a provided prefix', + data: 'prefix', + }) + return options + } + + public createLogStreamPrefixBox(): InputBoxPrompter { + const helpUri = startLiveTailLogStreamPrefixHelpUrl + return createInputBox({ + title: 'Enter LogStream prefix', + placeholder: 'logStream prefix (case sensitive; empty matches all)', + prompt: 'Only log events in the LogStreams that have names that start with the prefix that you specify here are included in the Live Tail session', + validateInput: (input) => this.validateLogStreamPrefix(input), + buttons: createCommonButtons(helpUri), + }) + } + + public validateLogStreamPrefix(prefix: string) { + if (prefix.length > 512) { + return 'LogStream prefix cannot be longer than 512 characters' + } + + if (!this.logStreamPrefixRegEx.test(prefix)) { + return 'LogStream prefix must match pattern: [^:*]*' + } + } + + public createLogStreamSelector(): QuickPickPrompter { + const helpUri = startLiveTailLogStreamNamesHelpUrl + const client = new DefaultCloudWatchLogsClient(this.region) + const request: CloudWatchLogs.DescribeLogStreamsRequest = { + logGroupIdentifier: this.logGroupArn, + orderBy: 'LastEventTime', + descending: true, + } + const requester = (request: CloudWatchLogs.DescribeLogStreamsRequest) => client.describeLogStreams(request) + const collection = pageableToCollection(requester, request, 'nextToken', 'logStreams') + + const items = collection + .filter(isNonNullable) + .map((streams) => streams!.map((stream) => ({ data: stream.logStreamName!, label: stream.logStreamName! }))) + + return createQuickPick(items, { + title: 'Select LogStream', + buttons: createCommonButtons(helpUri), + }) + } + + private switchState(newState: LogStreamFilterType) { + this.currentState = newState + } + + protected async promptUser(): Promise> { + while (true) { + switch (this.currentState) { + case 'menu': { + const prompter = this.createMenuPrompter() + this.steps && prompter.setSteps(this.steps[0], this.steps[1]) + + const resp = await prompter.prompt() + if (resp === 'prefix') { + this.switchState('prefix') + } else if (resp === 'specific') { + this.switchState('specific') + } else if (resp === 'all') { + return { filter: undefined, type: resp } + } else { + return undefined + } + + break + } + case 'prefix': { + const resp = await this.createLogStreamPrefixBox().prompt() + if (isValidResponse(resp)) { + return { filter: resp, type: 'prefix' } + } + this.switchState('menu') + break + } + case 'specific': { + const resp = await this.createLogStreamSelector().prompt() + if (isValidResponse(resp)) { + return { filter: resp, type: 'specific' } + } + this.switchState('menu') + break + } + } + } + } + + public setSteps(current: number, total: number): void { + this.steps = [current, total] + } + + // Unused + public get recentItem(): any { + return + } + public set recentItem(response: any) {} + public setStepEstimator(estimator: StepEstimator): void {} +} diff --git a/packages/core/src/shared/constants.ts b/packages/core/src/shared/constants.ts index 6d6cf842552..9ab654222e8 100644 --- a/packages/core/src/shared/constants.ts +++ b/packages/core/src/shared/constants.ts @@ -130,6 +130,14 @@ export const ecsIamPermissionsUrl = vscode.Uri.parse( export const CLOUDWATCH_LOGS_SCHEME = 'aws-cwl' // eslint-disable-line @typescript-eslint/naming-convention export const AWS_SCHEME = 'aws' // eslint-disable-line @typescript-eslint/naming-convention +export const startLiveTailHelpUrl = + 'https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartLiveTail.html' +export const startLiveTailLogStreamPrefixHelpUrl = `${startLiveTailHelpUrl}#CWL-StartLiveTail-request-logStreamNamePrefixes` +export const startLiveTailLogStreamNamesHelpUrl = `${startLiveTailHelpUrl}#CWL-StartLiveTail-request-logStreamNames` + +export const cwlFilterPatternHelpUrl = + 'https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html' + export const lambdaPackageTypeImage = 'Image' // URLs for App Runner diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts new file mode 100644 index 00000000000..4b2e382f38c --- /dev/null +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -0,0 +1,28 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { TailLogGroupWizard } from '../../../../awsService/cloudWatchLogs/commands/tailLogGroup' +import { createWizardTester } from '../../../shared/wizards/wizardTestUtils' + +describe('TailLogGroupWizard', async function () { + it('prompts regionLogGroup submenu first if context not provided', async function () { + const wizard = new TailLogGroupWizard() + const tester = await createWizardTester(wizard) + tester.regionLogGroupSubmenuResponse.assertShowFirst() + tester.logStreamFilter.assertShowSecond() + tester.filterPattern.assertShowThird() + }) + + it('skips regionLogGroup submenu if context provided', async function () { + const wizard = new TailLogGroupWizard({ + groupName: 'test-groupName', + regionName: 'test-regionName', + }) + const tester = await createWizardTester(wizard) + tester.regionLogGroupSubmenuResponse.assertDoesNotShow() + tester.logStreamFilter.assertShowFirst() + tester.filterPattern.assertShowSecond() + }) +}) diff --git a/packages/core/src/test/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.test.ts new file mode 100644 index 00000000000..0ac71141b7a --- /dev/null +++ b/packages/core/src/test/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.test.ts @@ -0,0 +1,74 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import assert from 'assert' +import { LogStreamFilterSubmenu } from '../../../awsService/cloudWatchLogs/liveTailLogStreamSubmenu' +import { createQuickPickPrompterTester, QuickPickPrompterTester } from '../../shared/ui/testUtils' +import { getTestWindow } from '../../shared/vscode/window' + +describe('liveTailLogStreamSubmenu', async function () { + let logStreamFilterSubmenu: LogStreamFilterSubmenu + let logStreamMenuPrompter: QuickPickPrompterTester + const testRegion = 'us-east-1' + const testLogGroupArn = 'my-log-group-arn' + + beforeEach(async function () { + logStreamFilterSubmenu = new LogStreamFilterSubmenu(testRegion, testLogGroupArn) + logStreamMenuPrompter = createQuickPickPrompterTester(logStreamFilterSubmenu.defaultPrompter) + }) + + describe('Menu prompter', async function () { + it('gives option for each filter type', async function () { + logStreamMenuPrompter.assertContainsItems('All', 'Specific', 'Prefix') + logStreamMenuPrompter.acceptItem('All') + await logStreamMenuPrompter.result() + }) + }) + + describe('LogStream Prefix Submenu', function () { + it('accepts valid input', async function () { + const validInput = 'my-log-stream' + getTestWindow().onDidShowInputBox((input) => { + input.acceptValue(validInput) + }) + const inputBox = logStreamFilterSubmenu.createLogStreamPrefixBox() + const result = inputBox.prompt() + assert.strictEqual(await result, validInput) + }) + + it('rejects invalid input (:)', async function () { + const invalidInput = 'my-log-stream:' + getTestWindow().onDidShowInputBox((input) => { + input.acceptValue(invalidInput) + assert.deepEqual(input.validationMessage, 'LogStream prefix must match pattern: [^:*]*') + input.hide() + }) + const inputBox = logStreamFilterSubmenu.createLogStreamPrefixBox() + await inputBox.prompt() + }) + + it('rejects invalid input (*)', async function () { + const invalidInput = 'my-log-stream*' + getTestWindow().onDidShowInputBox((input) => { + input.acceptValue(invalidInput) + assert.deepEqual(input.validationMessage, 'LogStream prefix must match pattern: [^:*]*') + input.hide() + }) + const inputBox = logStreamFilterSubmenu.createLogStreamPrefixBox() + await inputBox.prompt() + }) + + it('rejects invalid input (length)', async function () { + const invalidInput = 'a'.repeat(520) + getTestWindow().onDidShowInputBox((input) => { + input.acceptValue(invalidInput) + assert.deepEqual(input.validationMessage, 'LogStream prefix cannot be longer than 512 characters') + input.hide() + }) + const inputBox = logStreamFilterSubmenu.createLogStreamPrefixBox() + await inputBox.prompt() + }) + }) +}) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 3e957178a01..8054cb1a30e 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -1730,6 +1730,16 @@ "group": "inline@1", "when": "view == aws.explorer && viewItem =~ /^awsCloudWatchLogNode|awsCloudWatchLogParentNode$/" }, + { + "command": "aws.cwl.tailLogGroup", + "group": "0@1", + "when": "view == aws.explorer && viewItem =~ /^awsCloudWatchLogNode|awsCloudWatchLogParentNode$/" + }, + { + "command": "aws.cwl.tailLogGroup", + "group": "inline@1", + "when": "view == aws.explorer && viewItem =~ /^awsCloudWatchLogNode|awsCloudWatchLogParentNode$/" + }, { "command": "aws.apig.copyUrl", "when": "view == aws.explorer && viewItem =~ /^(awsApiGatewayNode)$/", @@ -3123,6 +3133,18 @@ } } }, + { + "command": "aws.cwl.tailLogGroup", + "title": "%AWS.command.cloudWatchLogs.tailLogGroup%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": "$(notebook-execute)", + "cloud9": { + "cn": { + "category": "%AWS.title.cn%" + } + } + }, { "command": "aws.saveCurrentLogDataContent", "title": "%AWS.command.saveCurrentLogDataContent%", From 78cb83cda4ef804b6ece8a4933add4a8528e1432 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Tue, 15 Oct 2024 06:55:27 -0700 Subject: [PATCH 02/22] feat(cwl): Create LiveTailSession object and registry. Adds MaxLine configuration (#5738) ## Problem 1. On the client side, VSCode needs to be aware of some additional context of a running LiveTail session, other than just the response from the StartLiveTail API call (Abort Controller, Max Lines config, TextDocument URI, etc). 2. Additionally, we want to be able to have multiple LiveTail sessions running, and have a way to organize all of them. ## Solution 1. Create a LiveTailSession class in AWSToolkit that will persist all of the metadata and context the LiveTail feature needs to operate. 2. Create a LiveTailSessionRegistry that maps a vscode URI to a LiveTailSession. The URI for a LiveTailSession is composed of the API request elements. This will allow us to tell when a user is making a duplicate request. This URI will also be used as the URI of the TextDocument to display the session results. ## Additional Changes * Adds VSCode preference config for LiveTail max events. This will be used to cap the number of live tail events can be in the TextDocument at a given time. When the limit is reached, the oldest log events will be dropped in order to fit new events streaming in. * Adds a missing String for "Tail Log Group" --- package-lock.json | 5539 ++++++++++------- packages/core/package.json | 1 + packages/core/package.nls.json | 2 + .../cloudWatchLogs/cloudWatchLogsUtils.ts | 5 +- .../registry/liveTailSession.ts | 93 + .../registry/liveTailSessionRegistry.ts | 48 + packages/core/src/shared/constants.ts | 2 + .../core/src/shared/settings-toolkit.gen.ts | 1 + .../registry/liveTailRegistry.test.ts | 136 + packages/toolkit/package.json | 7 + 10 files changed, 3648 insertions(+), 2186 deletions(-) create mode 100644 packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts create mode 100644 packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts create mode 100644 packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts diff --git a/package-lock.json b/package-lock.json index bd06c2c49e5..96d057dea54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,186 +61,267 @@ "resolved": "src.gen/@amzn/codewhisperer-streaming", "link": true }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.637.0", + "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-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", + "@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/@aws-crypto/sha256-browser": { - "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/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.5.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/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-crypto/crc32/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "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": { + "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-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/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/sha256-browser/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "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-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": { + "@aws-crypto/util": "^5.2.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/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "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/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-js/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "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/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/types": "^3.3.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/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/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@aws-sdk/types": "^3.222.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.6.2" + } + }, + "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/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/util/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "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-sdk/client-cloudwatch-logs": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.666.0.tgz", + "integrity": "sha512-6LHXxGtpDjpay9oO89chJAL7CZjhF3FTJ7I5GFc7TwVXzM+/1fYXJKAF17aV85OA0g1P+sXd/h9Qg4ZpyedZgw==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.666.0", + "@aws-sdk/client-sts": "3.666.0", + "@aws-sdk/core": "3.666.0", + "@aws-sdk/credential-provider-node": "3.666.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.666.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.666.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/eventstream-serde-browser": "^3.0.10", + "@smithy/eventstream-serde-config-resolver": "^3.0.7", + "@smithy/eventstream-serde-node": "^3.0.9", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" + "@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", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.666.0.tgz", + "integrity": "sha512-+h5Xk64dM4on1MwjTYxlwtI8ilytU7zjTVRzMAYOysmH71Bc8YsLOfonFHvzhF/AXpKJu3f1BhM65S0tasPcrw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.666.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.666.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.666.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" }, @@ -248,262 +329,459 @@ "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-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.666.0.tgz", + "integrity": "sha512-mW//v5EvHMU2SulW1FqmjJJPDNhzySRb/YUU+jq9AFDIYUdjF6j6wM+iavCW/4gLqOct0RT7B62z8jqyHkUCEQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.666.0", + "@aws-sdk/credential-provider-node": "3.666.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.666.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.666.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.666.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sts": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.666.0.tgz", + "integrity": "sha512-tw8yxcxvaj0d/A4YJXIh3mISzsQe8rThIVKvpyhEdl1lEoz81skCccX5u3gHajciSdga/V0DxhBbsO+eE1bZkw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.666.0", + "@aws-sdk/core": "3.666.0", + "@aws-sdk/credential-provider-node": "3.666.0", + "@aws-sdk/middleware-host-header": "3.664.0", + "@aws-sdk/middleware-logger": "3.664.0", + "@aws-sdk/middleware-recursion-detection": "3.664.0", + "@aws-sdk/middleware-user-agent": "3.666.0", + "@aws-sdk/region-config-resolver": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.0", + "@aws-sdk/util-user-agent-browser": "3.664.0", + "@aws-sdk/util-user-agent-node": "3.666.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/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/core": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.666.0.tgz", + "integrity": "sha512-jxNjs0sAVX+CWwoa4kHUENLHuBwjT1EILBoctmQoiIb1v5KpKwZnSByHTpvUkFmbuwWQPEnJkJCqzIHjEmjisA==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.664.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-content-length": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.664.0.tgz", + "integrity": "sha512-95rE+9Voaco0nmKJrXqfJAxSSkSWqlBy76zomiZrUrv7YuijQtHCW8jte6v6UHAFAaBzgFsY7QqBxs15u9SM7g==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.664.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/middleware-endpoint": { - "version": "3.1.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.666.0.tgz", + "integrity": "sha512-j1Cob+tYmJ/m9agSsFPdAhLfILBqZzolF17XJvmEzQC2edltQ6NR0Wd09GQvtiAFZy7gn1l40bKuxX6Tq5U6XQ==", "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", + "@aws-sdk/types": "3.664.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.666.0.tgz", + "integrity": "sha512-u09aUZJQNK8zVAKJKEOQ2mLsv39YxR20US00/WAPNW9sMWWhl4raT97tsalOUc6ZTHOEqHHmEVZXuscINnkaww==", "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" + "@aws-sdk/credential-provider-env": "3.664.0", + "@aws-sdk/credential-provider-http": "3.666.0", + "@aws-sdk/credential-provider-process": "3.664.0", + "@aws-sdk/credential-provider-sso": "3.666.0", + "@aws-sdk/credential-provider-web-identity": "3.664.0", + "@aws-sdk/types": "3.664.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.666.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-serde": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.666.0.tgz", + "integrity": "sha512-C43L9kxAb2lvIZ+eKVuyX9xYrkpg+Zyq0fLasK1wekC6M/Qj/uqE1KFz9ddDE8Dv1HwiE+UZk5psM0KatQpPGQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/credential-provider-env": "3.664.0", + "@aws-sdk/credential-provider-http": "3.666.0", + "@aws-sdk/credential-provider-ini": "3.666.0", + "@aws-sdk/credential-provider-process": "3.664.0", + "@aws-sdk/credential-provider-sso": "3.666.0", + "@aws-sdk/credential-provider-web-identity": "3.664.0", + "@aws-sdk/types": "3.664.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.664.0.tgz", + "integrity": "sha512-sQicIw/qWTsmMw8EUQNJXdrWV5SXaZc2zGdCQsQxhR6wwNO2/rZ5JmzdcwUADmleBVyPYk3KGLhcofF/qXT2Ng==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.664.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/node-config-provider": { - "version": "3.1.4", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.666.0.tgz", + "integrity": "sha512-aaa5Ig8hI7lSh1CSQP0oaLvjylz6+3mKUgdvw69zv0MdX3TUZiQRDCsfqK0P3VNsj/QSvBytSjuNDuSaYcACJg==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", + "@aws-sdk/client-sso": "3.666.0", + "@aws-sdk/token-providers": "3.664.0", + "@aws-sdk/types": "3.664.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/node-http-handler": { - "version": "3.1.4", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.664.0.tgz", + "integrity": "sha512-10ltP1BfSKRJVXd8Yr5oLbo+VSDskWbps0X3szSsxTk0Dju1xvkz7hoIjylWLvtGbvQ+yb2pmsJYKCudW/4DJg==", "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", + "@aws-sdk/types": "3.664.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.664.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.664.0.tgz", + "integrity": "sha512-4tCXJ+DZWTq38eLmFgnEmO8X4jfWpgPbWoCyVYpRHCPHq6xbrU65gfwS9jGx25L4YdEce641ChI9TKLryuUgRA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.664.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-logger": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.664.0.tgz", + "integrity": "sha512-eNykMqQuv7eg9pAcaLro44fscIe1VkFfhm+gYnlxd+PH6xqapRki1E68VHehnIptnVBdqnWfEqLUSLGm9suqhg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.664.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/querystring-builder": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.664.0.tgz", + "integrity": "sha512-jq27WMZhm+dY8BWZ9Ipy3eXtZj0lJzpaKQE3A3tH5AOIlUV/gqrmnJ9CdqVVef4EJsq9Yil4ZzQjKKmPsxveQg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", + "@aws-sdk/types": "3.664.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/querystring-parser": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.666.0.tgz", + "integrity": "sha512-d8XJ103SGCMsFIKEowpOaZr0W8AkLNd+3CS7W95yb6YmN7lcNGL54RtTSy3m8YJI6W2jXftPFN2oLG4K3aywVQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/core": "3.666.0", + "@aws-sdk/types": "3.664.0", + "@aws-sdk/util-endpoints": "3.664.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/service-error-classification": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.664.0.tgz", + "integrity": "sha512-o/B8dg8K+9714RGYPgMxZgAChPe/MTSMkf/eHXTUFHNik5i1HgVKfac22njV2iictGy/6GhpFsKa1OWNYAkcUg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0" + "@aws-sdk/types": "3.664.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/shared-ini-file-loader": { - "version": "3.1.4", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/token-providers": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.664.0.tgz", + "integrity": "sha512-dBAvXW2/6bAxidvKARFxyCY2uCynYBKRFN00NhS1T5ggxm3sUnuTpWw1DTjl02CVPkacBOocZf10h8pQbHSK8w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.664.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.664.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { - "version": "3.2.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/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/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/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", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-endpoints": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.664.0.tgz", + "integrity": "sha512-KrXoHz6zmAahVHkyWMRT+P6xJaxItgmklxEDrT+npsUB4d5C/lhw16Crcp9TDi828fiZK3GYKRAmmNhvmzvBNg==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.664.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/url-parser": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.664.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.664.0.tgz", + "integrity": "sha512-c/PV3+f1ss4PpskHbcOxTZ6fntV2oXy/xcDR9nW+kVaz5cM1G702gF0rvGLKPqoBwkj2rWGe6KZvEBeLzynTUQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@aws-sdk/types": "3.664.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.666.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.666.0.tgz", + "integrity": "sha512-DzbOMcAqrn51Z0fz5FvofaYmQA+sOJKO2cb8zQrix3TkzsTw1vRLo/cgQUJuJRGptbQCe1gnj7+21Gd5hpU6Ag==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/middleware-user-agent": "3.666.0", + "@aws-sdk/types": "3.664.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-base64/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", "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/util-body-length-browser": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/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": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-node": { + "node_modules/@aws-sdk/client-cloudwatch-logs/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" @@ -512,357 +790,383 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/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-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/middleware-retry": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.23.tgz", + "integrity": "sha512-x9PbGXxkcXIpm6L26qRSCC+eaYcHwybRmqU8LO/WM2RRlW0g8lz6FIiKbKgGvHuoK3dLZRiQVSQJveiCzwnA5A==", "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" + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/service-error-classification": "^3.0.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">= 10.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/middleware-serde": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/middleware-stack": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { - "version": "3.1.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/node-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", "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/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "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/util-uri-escape": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/querystring-builder": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^3.5.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", "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-lambda": { - "version": "3.637.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/service-error-classification": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.7.tgz", + "integrity": "sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" + "@smithy/types": "^3.5.0" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/crc32": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "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-lambda/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-lambda/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/smithy-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", "license": "Apache-2.0", "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-crypto/util": { - "version": "5.2.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/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": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.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/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/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/util-buffer-from": "^2.2.0", + "@smithy/is-array-buffer": "^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", + "node_modules/@aws-sdk/client-cloudwatch-logs/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/types": "^3.3.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", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/config-resolver": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-retry": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.7.tgz", + "integrity": "sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug==", "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/service-error-classification": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-stream": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "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", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-codec": { - "version": "3.1.2", + "node_modules/@aws-sdk/client-cloudwatch-logs/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": { - "@aws-crypto/crc32": "5.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-browser": { - "version": "3.0.6", + "node_modules/@aws-sdk/client-cloudwatch-logs/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/eventstream-serde-universal": "^3.0.5", - "@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/eventstream-serde-config-resolver": { - "version": "3.0.3", + "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-lambda/node_modules/@smithy/eventstream-serde-node": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-serde-universal": "^3.0.5", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -870,11 +1174,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/eventstream-serde-universal": { - "version": "3.0.5", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/abort-controller": { + "version": "3.1.1", "license": "Apache-2.0", "dependencies": { - "@smithy/eventstream-codec": "^3.1.2", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -882,7 +1185,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/fetch-http-handler": { "version": "3.2.4", "license": "Apache-2.0", "dependencies": { @@ -893,78 +1196,34 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/hash-node": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { + "version": "3.0.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/middleware-endpoint": { + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-lambda/node_modules/@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-lambda/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-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": { - "version": "3.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { + "version": "3.0.15", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", @@ -981,7 +1240,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 +1251,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 +1262,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 +1275,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 +1289,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 +1300,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 +1311,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 +1323,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 +1334,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 +1344,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 +1355,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 +1370,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 +1380,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 +1389,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 +1401,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 +1412,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 +1422,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 +1433,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 +1445,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 +1462,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 +1473,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 +1483,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 +1494,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 +1505,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 +1526,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,259 +1551,75 @@ "@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", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "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-crypto/sha256-js": { - "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/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", + "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "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", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.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" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { + "version": "3.0.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-sso-oidc/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { + "@smithy/middleware-serde": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-middleware": "^3.0.3", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso-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": { - "version": "3.1.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-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 +1637,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 +1648,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 +1659,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 +1672,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 +1686,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 +1697,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 +1708,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 +1720,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 +1731,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 +1741,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 +1752,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 +1767,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 +1777,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 +1786,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 +1798,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 +1809,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 +1819,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 +1830,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 +1842,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 +1859,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 +1870,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 +1880,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 +1891,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 +1902,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 +2033,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 +2043,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 +2059,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 +2077,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 +2088,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 +2099,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 +2112,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 +2126,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 +2137,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 +2148,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 +2160,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 +2171,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 +2181,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 +2192,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 +2207,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 +2217,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 +2226,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 +2238,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,64 +2249,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": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-hex-encoding": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2386,7 +2259,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-middleware": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2397,7 +2270,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-retry": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-retry": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2409,7 +2282,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-stream": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -2426,7 +2299,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-stream/node_modules/@smithy/util-buffer-from": { + "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": { @@ -2437,7 +2310,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-uri-escape": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2447,7 +2320,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2458,7 +2331,7 @@ "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-oidc/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2469,119 +2342,7 @@ "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-crypto/sha256-browser": { - "version": "5.2.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "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-sts/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-sts/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-sts/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-sts/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-sts/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { "version": "3.609.0", "license": "Apache-2.0", "dependencies": { @@ -2592,7 +2353,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/abort-controller": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/abort-controller": { "version": "3.1.1", "license": "Apache-2.0", "dependencies": { @@ -2603,35 +2364,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { "version": "3.2.4", "license": "Apache-2.0", "dependencies": { @@ -2642,39 +2375,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/hash-node": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/hash-node/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2684,19 +2385,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { "version": "3.1.0", "license": "Apache-2.0", "dependencies": { @@ -2712,7 +2401,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-retry": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { "version": "3.0.15", "license": "Apache-2.0", "dependencies": { @@ -2730,7 +2419,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2741,7 +2430,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2752,7 +2441,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -2765,7 +2454,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -2779,7 +2468,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -2790,7 +2479,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { "version": "4.1.0", "license": "Apache-2.0", "dependencies": { @@ -2801,7 +2490,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-builder": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2813,7 +2502,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/querystring-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2824,7 +2513,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/service-error-classification": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/service-error-classification": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2834,7 +2523,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -2845,7 +2534,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { "version": "3.2.0", "license": "Apache-2.0", "dependencies": { @@ -2860,7 +2549,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { "version": "3.3.0", "license": "Apache-2.0", "dependencies": { @@ -2870,7 +2559,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -2879,7 +2568,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2891,7 +2580,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-base64/node_modules/@smithy/util-buffer-from": { + "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": { @@ -2902,64 +2591,68 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-sso/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-sts/node_modules/@smithy/util-config-provider": { - "version": "3.0.0", + "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" }, "engines": { "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-sso/node_modules/@smithy/util-stream": { + "version": "3.1.3", "license": "Apache-2.0", "dependencies": { - "@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", - "bowser": "^2.11.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-sts/node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.15", + "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/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": { + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-uri-escape": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2969,39 +2662,70 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-middleware": { - "version": "3.0.3", + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-retry": { - "version": "3.0.3", + "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/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-stream": { - "version": "3.1.3", + "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-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^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" }, @@ -3009,69 +2733,18 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/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-sts/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-sts/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-sts/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/core": { - "version": "3.635.0", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/abort-controller": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/abort-controller": { "version": "3.1.1", "license": "Apache-2.0", "dependencies": { @@ -3082,7 +2755,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { "version": "3.2.4", "license": "Apache-2.0", "dependencies": { @@ -3093,7 +2766,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3103,7 +2776,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-endpoint": { "version": "3.1.0", "license": "Apache-2.0", "dependencies": { @@ -3119,7 +2792,25 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-serde": { + "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": { @@ -3130,7 +2821,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/middleware-stack": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3141,7 +2832,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-config-provider": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -3154,7 +2845,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/node-http-handler": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -3168,7 +2859,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/property-provider": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -3179,7 +2870,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/protocol-http": { "version": "4.1.0", "license": "Apache-2.0", "dependencies": { @@ -3190,7 +2881,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-builder": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3202,7 +2893,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/querystring-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3213,7 +2904,17 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/shared-ini-file-loader": { + "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": { @@ -3224,7 +2925,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/smithy-client": { "version": "3.2.0", "license": "Apache-2.0", "dependencies": { @@ -3239,7 +2940,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/types": { "version": "3.3.0", "license": "Apache-2.0", "dependencies": { @@ -3249,7 +2950,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/url-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3258,7 +2959,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-base64": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3270,7 +2971,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/util-buffer-from": { + "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": { @@ -3281,7 +2982,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/util-hex-encoding": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3291,7 +2992,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-middleware": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3302,7 +3003,19 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/util-stream": { + "node_modules/@aws-sdk/client-sts/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" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-stream": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -3319,76 +3032,69 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/core/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/client-sts/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/core/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-uri-escape": { "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/credential-provider-env": { - "version": "3.46.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/property-provider": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { - "version": "3.46.0", - "license": "Apache-2.0", - "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/core": { + "version": "3.635.0", "license": "Apache-2.0", "dependencies": { + "@smithy/core": "^2.4.0", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/signature-v4": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", + "@smithy/util-middleware": "^3.0.3", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/abort-controller": { + "node_modules/@aws-sdk/core/node_modules/@smithy/abort-controller": { "version": "3.1.1", "license": "Apache-2.0", "dependencies": { @@ -3399,7 +3105,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/core/node_modules/@smithy/fetch-http-handler": { "version": "3.2.4", "license": "Apache-2.0", "dependencies": { @@ -3410,7 +3116,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/core/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3420,7 +3126,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-endpoint": { "version": "3.1.0", "license": "Apache-2.0", "dependencies": { @@ -3436,7 +3142,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-serde": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3447,7 +3153,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/core/node_modules/@smithy/middleware-stack": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3458,7 +3164,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/core/node_modules/@smithy/node-config-provider": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -3471,7 +3177,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/core/node_modules/@smithy/node-http-handler": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -3485,7 +3191,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/core/node_modules/@smithy/property-provider": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -3496,7 +3202,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/core/node_modules/@smithy/protocol-http": { "version": "4.1.0", "license": "Apache-2.0", "dependencies": { @@ -3507,7 +3213,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-builder": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3519,7 +3225,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/core/node_modules/@smithy/querystring-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3530,7 +3236,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/core/node_modules/@smithy/shared-ini-file-loader": { "version": "3.1.4", "license": "Apache-2.0", "dependencies": { @@ -3541,7 +3247,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/core/node_modules/@smithy/smithy-client": { "version": "3.2.0", "license": "Apache-2.0", "dependencies": { @@ -3556,7 +3262,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { + "node_modules/@aws-sdk/core/node_modules/@smithy/types": { "version": "3.3.0", "license": "Apache-2.0", "dependencies": { @@ -3566,7 +3272,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/core/node_modules/@smithy/url-parser": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3575,7 +3281,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/core/node_modules/@smithy/util-base64": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3587,7 +3293,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/core/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3598,7 +3304,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-hex-encoding": { + "node_modules/@aws-sdk/core/node_modules/@smithy/util-hex-encoding": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3608,7 +3314,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/core/node_modules/@smithy/util-middleware": { "version": "3.0.3", "license": "Apache-2.0", "dependencies": { @@ -3619,7 +3325,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-stream": { + "node_modules/@aws-sdk/core/node_modules/@smithy/util-stream": { "version": "3.1.3", "license": "Apache-2.0", "dependencies": { @@ -3636,7 +3342,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/core/node_modules/@smithy/util-uri-escape": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3646,7 +3352,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/core/node_modules/@smithy/util-utf8": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3657,368 +3363,338 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds": { + "node_modules/@aws-sdk/credential-provider-env": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/node-config-provider": "3.46.0", "@aws-sdk/property-provider": "3.46.0", "@aws-sdk/types": "3.46.0", - "@aws-sdk/url-parser": "3.46.0", "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/node-config-provider": { + "node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { "version": "3.46.0", "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/property-provider": "3.46.0", - "@aws-sdk/shared-ini-file-loader": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" - }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/querystring-parser": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.635.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "@aws-sdk/types": "3.609.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/property-provider": "^3.1.3", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/util-stream": "^3.1.3", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { + "version": "3.609.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/types": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/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": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/url-parser": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/querystring-parser": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.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" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.46.0", - "@aws-sdk/credential-provider-imds": "3.46.0", - "@aws-sdk/credential-provider-sso": "3.46.0", - "@aws-sdk/credential-provider-web-identity": "3.46.0", - "@aws-sdk/property-provider": "3.46.0", - "@aws-sdk/shared-ini-file-loader": "3.46.0", - "@aws-sdk/types": "3.46.0", - "@aws-sdk/util-credentials": "3.46.0", - "tslib": "^2.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/ie11-detection": { - "version": "2.0.2", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^1.11.1" + "@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/credential-provider-ini/node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-browser": { - "version": "2.0.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/ie11-detection": "^2.0.0", - "@aws-crypto/sha256-js": "^2.0.0", - "@aws-crypto/supports-web-crypto": "^2.0.0", - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-js": { - "version": "2.0.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/util": "^2.0.0", - "@aws-sdk/types": "^3.1.0", - "tslib": "^1.11.1" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-js/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/supports-web-crypto": { - "version": "2.0.2", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "tslib": "^1.11.1" + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/util": { - "version": "2.0.2", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.110.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@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/credential-provider-ini/node_modules/@aws-crypto/util/node_modules/@aws-sdk/types": { - "version": "3.342.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { + "version": "3.1.3", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/util/node_modules/@aws-sdk/types/node_modules/tslib": { - "version": "2.5.3", - "license": "0BSD" - }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/util/node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" - }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/abort-controller": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { + "version": "4.1.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/client-sso": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-builder": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "2.0.0", - "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.46.0", - "@aws-sdk/fetch-http-handler": "3.46.0", - "@aws-sdk/hash-node": "3.46.0", - "@aws-sdk/invalid-dependency": "3.46.0", - "@aws-sdk/middleware-content-length": "3.46.0", - "@aws-sdk/middleware-host-header": "3.46.0", - "@aws-sdk/middleware-logger": "3.46.0", - "@aws-sdk/middleware-retry": "3.46.0", - "@aws-sdk/middleware-serde": "3.46.0", - "@aws-sdk/middleware-stack": "3.46.0", - "@aws-sdk/middleware-user-agent": "3.46.0", - "@aws-sdk/node-config-provider": "3.46.0", - "@aws-sdk/node-http-handler": "3.46.0", - "@aws-sdk/protocol-http": "3.46.0", - "@aws-sdk/smithy-client": "3.46.0", - "@aws-sdk/types": "3.46.0", - "@aws-sdk/url-parser": "3.46.0", - "@aws-sdk/util-base64-browser": "3.46.0", - "@aws-sdk/util-base64-node": "3.46.0", - "@aws-sdk/util-body-length-browser": "3.46.0", - "@aws-sdk/util-body-length-node": "3.46.0", - "@aws-sdk/util-user-agent-browser": "3.46.0", - "@aws-sdk/util-user-agent-node": "3.46.0", - "@aws-sdk/util-utf8-browser": "3.46.0", - "@aws-sdk/util-utf8-node": "3.46.0", - "tslib": "^2.3.0" + "@smithy/types": "^3.3.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/config-resolver": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/querystring-parser": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/signature-v4": "3.46.0", - "@aws-sdk/types": "3.46.0", - "@aws-sdk/util-config-provider": "3.46.0", - "tslib": "^2.3.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.46.0", - "@aws-sdk/property-provider": "3.46.0", - "@aws-sdk/shared-ini-file-loader": "3.46.0", - "@aws-sdk/types": "3.46.0", - "@aws-sdk/util-credentials": "3.46.0", - "tslib": "^2.3.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { + "version": "3.2.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/protocol-http": "3.46.0", - "@aws-sdk/querystring-builder": "3.46.0", - "@aws-sdk/types": "3.46.0", - "@aws-sdk/util-base64-browser": "3.46.0", - "tslib": "^2.3.0" + "@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/credential-provider-ini/node_modules/@aws-sdk/hash-node": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { + "version": "3.3.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", - "@aws-sdk/util-buffer-from": "3.46.0", - "tslib": "^2.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/invalid-dependency": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "@smithy/querystring-parser": "^3.0.3", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/is-array-buffer": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-base64": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.0" + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-content-length": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/protocol-http": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/protocol-http": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-logger": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { + "version": "3.0.3", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-retry": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-stream": { + "version": "3.1.3", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/protocol-http": "3.46.0", - "@aws-sdk/service-error-classification": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0", - "uuid": "^8.3.2" + "@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": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-serde": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-stack": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 12.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/credential-provider-imds": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/node-config-provider": "3.46.0", + "@aws-sdk/property-provider": "3.46.0", "@aws-sdk/types": "3.46.0", + "@aws-sdk/url-parser": "3.46.0", "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/node-config-provider": { + "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/node-config-provider": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { @@ -4031,13 +3707,10 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/node-http-handler": { + "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/querystring-parser": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/abort-controller": "3.46.0", - "@aws-sdk/protocol-http": "3.46.0", - "@aws-sdk/querystring-builder": "3.46.0", "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" }, @@ -4045,455 +3718,508 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/protocol-http": { + "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/shared-ini-file-loader": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/querystring-builder": { + "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/types": { "version": "3.46.0", "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.46.0", - "@aws-sdk/util-uri-escape": "3.46.0", - "tslib": "^2.3.0" - }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/querystring-parser": { + "node_modules/@aws-sdk/credential-provider-imds/node_modules/@aws-sdk/url-parser": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/querystring-parser": "3.46.0", "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" - }, - "engines": { - "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/service-error-classification": { + "node_modules/@aws-sdk/credential-provider-ini": { "version": "3.46.0", "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.46.0", + "@aws-sdk/credential-provider-imds": "3.46.0", + "@aws-sdk/credential-provider-sso": "3.46.0", + "@aws-sdk/credential-provider-web-identity": "3.46.0", + "@aws-sdk/property-provider": "3.46.0", + "@aws-sdk/shared-ini-file-loader": "3.46.0", + "@aws-sdk/types": "3.46.0", + "@aws-sdk/util-credentials": "3.46.0", + "tslib": "^2.3.0" + }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/ie11-detection": { + "version": "2.0.2", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">= 12.0.0" + "tslib": "^1.11.1" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/smithy-client": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-browser": { + "version": "2.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-stack": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" - }, - "engines": { - "node": ">= 12.0.0" + "@aws-crypto/ie11-detection": "^2.0.0", + "@aws-crypto/sha256-js": "^2.0.0", + "@aws-crypto/supports-web-crypto": "^2.0.0", + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-js": { + "version": "2.0.0", "license": "Apache-2.0", - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "@aws-crypto/util": "^2.0.0", + "@aws-sdk/types": "^3.1.0", + "tslib": "^1.11.1" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/url-parser": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/supports-web-crypto": { + "version": "2.0.2", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/querystring-parser": "3.46.0", - "@aws-sdk/types": "3.46.0", - "tslib": "^2.3.0" + "tslib": "^1.11.1" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/util": { + "version": "2.0.2", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.0" + "@aws-sdk/types": "^3.110.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-body-length-node": { - "version": "3.46.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/util/node_modules/@aws-sdk/types": { + "version": "3.342.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.0" + "tslib": "^2.5.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-buffer-from": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/util/node_modules/@aws-sdk/types/node_modules/tslib": { + "version": "2.5.3", + "license": "0BSD" + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/abort-controller": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/is-array-buffer": "3.46.0", + "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-config-provider": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/client-sso": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "2.0.0", + "@aws-crypto/sha256-js": "2.0.0", + "@aws-sdk/config-resolver": "3.46.0", + "@aws-sdk/fetch-http-handler": "3.46.0", + "@aws-sdk/hash-node": "3.46.0", + "@aws-sdk/invalid-dependency": "3.46.0", + "@aws-sdk/middleware-content-length": "3.46.0", + "@aws-sdk/middleware-host-header": "3.46.0", + "@aws-sdk/middleware-logger": "3.46.0", + "@aws-sdk/middleware-retry": "3.46.0", + "@aws-sdk/middleware-serde": "3.46.0", + "@aws-sdk/middleware-stack": "3.46.0", + "@aws-sdk/middleware-user-agent": "3.46.0", + "@aws-sdk/node-config-provider": "3.46.0", + "@aws-sdk/node-http-handler": "3.46.0", + "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/smithy-client": "3.46.0", + "@aws-sdk/types": "3.46.0", + "@aws-sdk/url-parser": "3.46.0", + "@aws-sdk/util-base64-browser": "3.46.0", + "@aws-sdk/util-base64-node": "3.46.0", + "@aws-sdk/util-body-length-browser": "3.46.0", + "@aws-sdk/util-body-length-node": "3.46.0", + "@aws-sdk/util-user-agent-browser": "3.46.0", + "@aws-sdk/util-user-agent-node": "3.46.0", + "@aws-sdk/util-utf8-browser": "3.46.0", + "@aws-sdk/util-utf8-node": "3.46.0", "tslib": "^2.3.0" }, "engines": { - "node": ">= 12.0.0" + "node": ">=12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-credentials": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/config-resolver": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/shared-ini-file-loader": "3.46.0", + "@aws-sdk/signature-v4": "3.46.0", + "@aws-sdk/types": "3.46.0", + "@aws-sdk/util-config-provider": "3.46.0", "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-uri-escape": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/client-sso": "3.46.0", + "@aws-sdk/property-provider": "3.46.0", + "@aws-sdk/shared-ini-file-loader": "3.46.0", + "@aws-sdk/types": "3.46.0", + "@aws-sdk/util-credentials": "3.46.0", "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/fetch-http-handler": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/querystring-builder": "3.46.0", "@aws-sdk/types": "3.46.0", - "bowser": "^2.11.0", + "@aws-sdk/util-base64-browser": "3.46.0", "tslib": "^2.3.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/hash-node": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/node-config-provider": "3.46.0", "@aws-sdk/types": "3.46.0", + "@aws-sdk/util-buffer-from": "3.46.0", "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-utf8-browser": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/invalid-dependency": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" } }, - "node_modules/@aws-sdk/credential-provider-ini/node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/is-array-buffer": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-content-length": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.637.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-logger": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-retry": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/service-error-classification": "3.46.0", + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0", + "uuid": "^8.3.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-serde": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.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-ini/node_modules/@aws-sdk/middleware-stack": { + "version": "3.46.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" + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.46.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", - "tslib": "^2.6.2" + "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/node-config-provider": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/property-provider": "3.46.0", + "@aws-sdk/shared-ini-file-loader": "3.46.0", + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/node-http-handler": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/abort-controller": "3.46.0", + "@aws-sdk/protocol-http": "3.46.0", + "@aws-sdk/querystring-builder": "3.46.0", + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/protocol-http": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/querystring-builder": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@aws-sdk/types": "3.46.0", + "@aws-sdk/util-uri-escape": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/url-parser": { - "version": "3.0.3", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/querystring-parser": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.37.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/service-error-classification": { + "version": "3.46.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/property-provider": "3.37.0", - "@aws-sdk/shared-ini-file-loader": "3.37.0", - "@aws-sdk/types": "3.37.0", - "@aws-sdk/util-credentials": "3.37.0", "tslib": "^2.3.0" }, "engines": { - "node": ">= 10.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/property-provider": { - "version": "3.37.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/smithy-client": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.37.0", + "@aws-sdk/middleware-stack": "3.46.0", + "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" }, "engines": { - "node": ">= 10.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.37.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { + "version": "3.46.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/url-parser": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/querystring-parser": "3.46.0", + "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" - }, - "engines": { - "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-body-length-browser": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-body-length-node": { + "version": "3.46.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-buffer-from": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/is-array-buffer": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-config-provider": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-credentials": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/shared-ini-file-loader": "3.46.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-uri-escape": { + "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/property-provider": "3.46.0", + "@aws-sdk/types": "3.46.0", + "bowser": "^2.11.0", + "tslib": "^2.3.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.46.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/node-config-provider": "3.46.0", "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" }, @@ -4501,19 +4227,34 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/util-utf8-browser": { "version": "3.46.0", "license": "Apache-2.0", - "engines": { - "node": ">= 12.0.0" + "dependencies": { + "tslib": "^2.3.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", + "node_modules/@aws-sdk/credential-provider-ini/node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.637.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-ini": "3.637.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.637.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -4521,10 +4262,12 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.620.1", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -4532,40 +4275,60 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.637.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/credential-provider-env": "3.620.1", + "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-process": "3.620.1", + "@aws-sdk/credential-provider-sso": "3.637.0", + "@aws-sdk/credential-provider-web-identity": "3.621.0", + "@aws-sdk/types": "3.609.0", + "@smithy/credential-provider-imds": "^3.2.0", + "@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" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.637.0" } }, - "node_modules/@aws-sdk/middleware-host-header/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.620.1", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.609.0", + "@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/middleware-logger": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.621.0", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", + "@smithy/property-provider": "^3.1.3", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.621.0" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { "version": "3.609.0", "license": "Apache-2.0", "dependencies": { @@ -4576,22 +4339,21 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-logger/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@aws-sdk/credential-provider-node/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/middleware-recursion-detection": { - "version": "3.620.0", + "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.4", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -4599,55 +4361,60 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "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/middleware-recursion-detection/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.37.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" + "@aws-sdk/property-provider": "3.37.0", + "@aws-sdk/shared-ini-file-loader": "3.37.0", + "@aws-sdk/types": "3.37.0", + "@aws-sdk/util-credentials": "3.37.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/property-provider": { + "version": "3.37.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.6.2" + "@aws-sdk/types": "3.37.0", + "tslib": "^2.3.0" }, "engines": { - "node": ">=16.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/middleware-stack": { - "version": "3.342.0", + "node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/shared-ini-file-loader": { + "version": "3.37.0", "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.3.0" }, "engines": { - "node": ">=14.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/credential-provider-sso": { "version": "3.637.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/client-sso": "3.637.0", + "@aws-sdk/token-providers": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", + "@smithy/property-provider": "^3.1.3", + "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -4655,7 +4422,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { "version": "3.609.0", "license": "Apache-2.0", "dependencies": { @@ -4666,8 +4433,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { + "version": "3.1.3", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", @@ -4677,7 +4444,18 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent/node_modules/@smithy/types": { + "node_modules/@aws-sdk/credential-provider-sso/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-sso/node_modules/@smithy/types": { "version": "3.3.0", "license": "Apache-2.0", "dependencies": { @@ -4687,10 +4465,11 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/property-provider": { + "node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.46.0", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/property-provider": "3.46.0", "@aws-sdk/types": "3.46.0", "tslib": "^2.3.0" }, @@ -4698,15 +4477,212 @@ "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/property-provider/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { "version": "3.46.0", "license": "Apache-2.0", "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/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/middleware-host-header/node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header/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/middleware-logger": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger/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/middleware-logger/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/middleware-recursion-detection": { + "version": "3.620.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/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/middleware-recursion-detection/node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection/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/middleware-stack": { + "version": "3.342.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.637.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@smithy/protocol-http": "^4.1.0", + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/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/middleware-user-agent/node_modules/@smithy/protocol-http": { + "version": "4.1.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent/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/property-provider": { + "version": "3.46.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.46.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/property-provider/node_modules/@aws-sdk/types": { + "version": "3.46.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.614.0", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", @@ -4776,16 +4752,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", @@ -5778,174 +5744,1314 @@ "run-parallel": "^1.1.9" }, "engines": { - "node": ">= 8" + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@playwright/browser-chromium": { + "version": "1.43.1", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.43.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@playwright/browser-chromium/node_modules/playwright-core": { + "version": "1.43.1", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.1", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@smithy/abort-controller": { + "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/config-resolver": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.9.tgz", + "integrity": "sha512-5d9oBf40qC7n2xUoHmntKLdqsyTMMo/r49+eqSIjJ73eDfEtljAxEhzIQ3bkgXJtR3xiv7YzMT/3FF3ORkjWdg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/config-resolver/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.4.8.tgz", + "integrity": "sha512-x4qWk7p/a4dcf7Vxb2MODIf4OIcqNbK182WxRvZ/3oKPrf/6Fdic5sSElhO1UtXpWKBazWfqg0ZEK9xN1DsuHA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "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/core/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/middleware-retry": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.23.tgz", + "integrity": "sha512-x9PbGXxkcXIpm6L26qRSCC+eaYcHwybRmqU8LO/WM2RRlW0g8lz6FIiKbKgGvHuoK3dLZRiQVSQJveiCzwnA5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/service-error-classification": "^3.0.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/middleware-serde": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/middleware-stack": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/node-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/querystring-builder": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "@smithy/util-uri-escape": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/service-error-classification": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.7.tgz", + "integrity": "sha512-91PRkTfiBf9hxkIchhRKJfl1rsplRDyBnmyFca3y0Z3x/q0JJN480S83LBd8R6sBCkm2bBbqw2FHp0Mbh+ecSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/smithy-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-base64": { + "version": "3.0.0", + "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/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/is-array-buffer": "^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", + "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/core/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-retry": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.7.tgz", + "integrity": "sha512-nh1ZO1vTeo2YX1plFPSe/OXaHkLAHza5jpokNiiKX2M5YpNUv6RxGJZhpfmiR4jSvVHCjIDmILjrxKmP+/Ghug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/core/node_modules/@smithy/util-stream": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@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-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/credential-provider-imds": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.4.tgz", + "integrity": "sha512-S9bb0EIokfYEuar4kEbLta+ivlKCWOCFsLZuilkNy9i0uEUEHSi47IFLPaxqqCl+0ftKmcOTHayY5nQhAuq7+w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-3.1.6.tgz", + "integrity": "sha512-SBiOYPBH+5wOyPS7lfI150ePfGLhnp/eTu5RnV9xvhGvRiKfnl6HzRK9wehBph+il8FxS9KTeadx7Rcmf1GLPQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/crc32": "5.2.0", + "@smithy/types": "^3.5.0", + "@smithy/util-hex-encoding": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/eventstream-codec/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-3.0.10.tgz", + "integrity": "sha512-1i9aMY6Pl/SmA6NjvidxnfBLHMPzhKu2BP148pEt5VwhMdmXn36PE2kWKGa9Hj8b0XGtCTRucpCncylevCtI7g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.9", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.0.7.tgz", + "integrity": "sha512-eVzhGQBPEqXXYHvIUku0jMTxd4gDvenRzUQPTmKVWdRvp9JUCKrbAXGQRYiGxUYq9+cqQckRm0wq3kTWnNtDhw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-3.0.9.tgz", + "integrity": "sha512-JE0Guqvt0xsmfQ5y1EI342/qtJqznBv8cJqkHZV10PwC8GWGU5KNgFbQnsVCcX+xF+qIqwwfRmeWoJCjuOLmng==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-serde-universal": "^3.0.9", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-3.0.9.tgz", + "integrity": "sha512-bydfgSisfepCufw9kCEnWRxqxJFzX/o8ysXWv+W9F2FIyiaEwZ/D8bBKINbh4ONz3i05QJ1xE7A5OKYvgJsXaw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/eventstream-codec": "^3.1.6", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "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.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.7.tgz", + "integrity": "sha512-SAGHN+QkrwcHFjfWzs/czX94ZEjPJ0CrWJS3M43WswDXVEuP4AVy9gJ3+AF6JQHZD13bojmuf/Ap/ItDeZ+Qfw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/hash-node/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "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.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "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.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.7.tgz", + "integrity": "sha512-Bq00GsAhHeYSuZX8Kpu4sbI9agH2BNYnqUmmbTGWOhki9NVsWn2jFr896vvoTMH8KAjNX/ErC/8t5QHuEXG+IA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@smithy/invalid-dependency/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "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.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.9.tgz", + "integrity": "sha512-t97PidoGElF9hTtLCrof32wfWMqC5g2SEJNxaVH3NjlatuNGsdxXRYO/t+RPnxA15RpYiS0f+zG7FuE2DeGgjA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@smithy/middleware-content-length/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "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": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.5.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.3.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "@smithy/util-uri-escape": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.2.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.1.5", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.4.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.0.tgz", + "integrity": "sha512-LafbclHNKnsorMgUkKm7Tk7oJ7xizsZ1VwqhGKqoCIrXh4fqDDp73fK99HOEEgcsQbtemmeY/BPv0vTVYYUNEQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-uri-escape": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", + "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", + "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", + "license": "Apache-2.0", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 8" + "node": ">=16.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, + "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14" + "node": ">=16.0.0" } }, - "node_modules/@pkgr/core": { - "version": "0.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, - "funding": { - "url": "https://opencollective.com/unts" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@playwright/browser-chromium": { - "version": "1.43.1", - "dev": true, - "hasInstallScript": true, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-hex-encoding": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.43.1" + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@playwright/browser-chromium/node_modules/playwright-core": { - "version": "1.43.1", - "dev": true, + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16" + "node": ">=16.0.0" } }, - "node_modules/@sindresorhus/is": { - "version": "4.2.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-uri-escape": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.3", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/signature-v4/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "type-detect": "4.0.8" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/smithy-client": { + "version": "2.5.1", + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^2.0.0" + "@smithy/middleware-endpoint": "^2.5.1", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-stream": "^2.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/types": { + "version": "2.12.0", + "license": "Apache-2.0", "dependencies": { - "type-detect": "4.0.8" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.1", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/@smithy/url-parser": { + "version": "2.2.0", + "license": "Apache-2.0", "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "@smithy/querystring-parser": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@smithy/abort-controller": { - "version": "2.2.0", + "node_modules/@smithy/util-base64": { + "version": "2.3.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/@smithy/core": { - "version": "2.4.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/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", "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/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/types": "^3.3.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/util-buffer-from": { + "version": "2.2.0", "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/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/is-array-buffer": { + "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": { "tslib": "^2.6.2" @@ -5954,259 +7060,302 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.23.tgz", + "integrity": "sha512-Y07qslyRtXDP/C5aWKqxTPBl4YxplEELG3xRrz2dnAQ6Lq/FgNrcKWmV561nNaZmFH+EzeGOX3ZRMbU8p1T6Nw==", "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", + "@smithy/property-provider": "^3.1.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/middleware-retry": { - "version": "3.0.15", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", "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.5.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/util-defaults-mode-browser/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.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": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/middleware-stack": { - "version": "3.0.3", + "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": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/node-config-provider": { + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-endpoint": { "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", "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/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/node-http-handler": { - "version": "3.1.4", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/middleware-serde": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", "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.5.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/util-defaults-mode-browser/node_modules/@smithy/middleware-stack": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/querystring-builder": { - "version": "3.0.3", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/node-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/querystring-parser": { - "version": "3.0.3", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.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/util-defaults-mode-browser/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0" + "@smithy/types": "^3.5.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/util-defaults-mode-browser/node_modules/@smithy/querystring-builder": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", + "@smithy/util-uri-escape": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/smithy-client": { - "version": "3.2.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", "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", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/url-parser": { - "version": "3.0.3", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/smithy-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-base64": { - "version": "3.0.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "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/core/node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", "license": "Apache-2.0", "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-buffer-from": { + "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": { - "@smithy/is-array-buffer": "^3.0.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/util-hex-encoding": { + "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": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-middleware": { - "version": "3.0.3", + "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": { - "@smithy/types": "^3.3.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/util-defaults-mode-browser/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-stream": { - "version": "3.1.3", + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-stream": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "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/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", "@smithy/util-base64": "^3.0.0", "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-hex-encoding": "^3.0.0", @@ -6217,8 +7366,10 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-uri-escape": { + "node_modules/@smithy/util-defaults-mode-browser/node_modules/@smithy/util-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" @@ -6227,8 +7378,10 @@ "node": ">=16.0.0" } }, - "node_modules/@smithy/core/node_modules/@smithy/util-utf8": { + "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": { "@smithy/util-buffer-from": "^3.0.0", @@ -6238,340 +7391,347 @@ "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/is-array-buffer": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-node": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.23.tgz", + "integrity": "sha512-9Y4WH7f0vnDGuHUa4lGX9e2p+sMwODibsceSV6rfkZOvMC+BY3StB2LdO1NHafpsyHJLpwAgChxQ38tFyd6vkg==", "license": "Apache-2.0", "dependencies": { + "@smithy/config-resolver": "^3.0.9", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">= 10.0.0" } }, - "node_modules/@smithy/middleware-endpoint": { - "version": "2.5.1", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/abort-controller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.5.tgz", + "integrity": "sha512-DhNPnqTqPoG8aZ5dWkFOgsuY+i0GQ3CI6hMmvCoduNsnU9gUZWZBwGfDQsTTB7NvFPkom1df7jMIJWU90kuXXg==", "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", + "@smithy/types": "^3.5.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": ">=16.0.0" } }, - "node_modules/@smithy/middleware-serde": { - "version": "2.3.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz", + "integrity": "sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" } }, - "node_modules/@smithy/middleware-stack": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/node-config-provider": { - "version": "2.3.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-endpoint": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.4.tgz", + "integrity": "sha512-/ChcVHekAyzUbyPRI8CzPPLj6y8QRAfJngWcLMgsWxKVzw/RzBV69mSOzJYDD3pRwushA1+5tHtPF8fjmzBnrQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^2.2.0", - "@smithy/shared-ini-file-loader": "^2.4.0", - "@smithy/types": "^2.12.0", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-middleware": "^3.0.7", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/node-http-handler": { - "version": "2.5.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-serde": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.7.tgz", + "integrity": "sha512-VytaagsQqtH2OugzVTq4qvjkLNbWehHfGcGr0JLJmlDRrNCeZoWkWsSOw1nhS/4hyUUWF/TLGGml4X/OnEep5g==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/querystring-builder": "^2.2.0", - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/property-provider": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/middleware-stack": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.7.tgz", + "integrity": "sha512-EyTbMCdqS1DoeQsO4gI7z2Gzq1MoRFAeS8GkFYIwbedB7Lp5zlLHJdg+56tllIIG5Hnf9ZWX48YKSHlsKvugGA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/protocol-http": { - "version": "3.3.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-config-provider": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/querystring-builder": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/node-http-handler": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.2.4.tgz", + "integrity": "sha512-49reY3+JgLMFNm7uTAKBWiKCA6XSvkNp9FqhVmusm2jpVnHORYFeFZ704LShtqWfjZW/nhX+7Iexyb6zQfXYIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", - "@smithy/util-uri-escape": "^2.2.0", + "@smithy/abort-controller": "^3.1.5", + "@smithy/protocol-http": "^4.1.4", + "@smithy/querystring-builder": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/querystring-parser": { - "version": "2.2.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/property-provider": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "2.1.5", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^2.12.0" - }, - "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.4.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/protocol-http": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.4.tgz", + "integrity": "sha512-MlWK8eqj0JlpZBnWmjQLqmFp71Ug00P+m72/1xQB3YByXD4zZ+y9N4hYrR0EDmrUCZIkyATWHOXFgtavwGDTzQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^2.12.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-builder": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.7.tgz", + "integrity": "sha512-65RXGZZ20rzqqxTsChdqSpbhA6tdt5IFNgG6o7e1lnPVLCe6TNWQq4rTl4N87hTDD8mV4IxJJnvyE7brbnRkQw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", + "@smithy/types": "^3.5.0", "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/querystring-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.7.tgz", + "integrity": "sha512-Fouw4KJVWqqUVIu1gZW8BH2HakwLz6dvdrAhXeXfeymOBrZw+hcqaWs+cS1AZPVp4nlbeIujYrKA921ZW2WMPA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/protocol-http": { - "version": "4.1.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/types": { - "version": "3.3.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/smithy-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.4.0.tgz", + "integrity": "sha512-nOfJ1nVQsxiP6srKt43r2My0Gp5PLWCW2ASqUioxIiGmu6d32v4Nekidiv5qOmmtzIrmaD+ADX5SKHUuhReeBQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/types": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/url-parser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.7.tgz", + "integrity": "sha512-70UbSSR8J97c1rHZOWhl+VKiZDqHWxs/iW8ZHrHp5fCCPLSBE7GcUlUvKSle3Ca+J9LLbYCj/A79BxztBvAfpA==", "license": "Apache-2.0", "dependencies": { + "@smithy/querystring-parser": "^3.0.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" } }, - "node_modules/@smithy/signature-v4/node_modules/@smithy/util-middleware": { - "version": "3.0.3", + "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/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/signature-v4/node_modules/@smithy/util-uri-escape": { + "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/signature-v4/node_modules/@smithy/util-utf8": { + "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": { - "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@smithy/smithy-client": { - "version": "2.5.1", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-middleware": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.7.tgz", + "integrity": "sha512-OVA6fv/3o7TMJTpTgOi1H5OTwnuUa8hzRzhSFDtZyNxi6OZ70L/FHattSmhE212I7b6WSOJAAmbYnvcjTHOJCA==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-endpoint": "^2.5.1", - "@smithy/middleware-stack": "^2.2.0", - "@smithy/protocol-http": "^3.3.0", - "@smithy/types": "^2.12.0", - "@smithy/util-stream": "^2.2.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/types": { - "version": "2.12.0", + "node_modules/@smithy/util-defaults-mode-node/node_modules/@smithy/util-stream": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.9.tgz", + "integrity": "sha512-7YAR0Ub3MwTMjDfjnup4qa6W8gygZMxikBhFMPESi6ASsl/rZJhwLpF/0k9TuezScCojsM0FryGdz4LZtjKPPQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/types": "^3.5.0", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-buffer-from": "^3.0.0", + "@smithy/util-hex-encoding": "^3.0.0", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "2.2.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^2.2.0", - "@smithy/types": "^2.12.0", - "tslib": "^2.6.2" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-base64": { - "version": "2.3.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": { - "@smithy/util-buffer-from": "^2.2.0", - "@smithy/util-utf8": "^2.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, - "node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", + "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/is-array-buffer": "^2.2.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.3.tgz", + "integrity": "sha512-34eACeKov6jZdHqS5hxBMJ4KyWKztTMulhuQ2UdOoP6vVxMLrOKUqIXAwJe/wiWMhXhydLW664B02CNpQBQ4Aw==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6579,12 +7739,14 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/node-config-provider": { - "version": "3.1.4", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.8.tgz", + "integrity": "sha512-E0rU0DglpeJn5ge64mk8wTGEXcQwmpUTY5Zr7IzTpDLmHKiIamINERNZYrPQjg58Ck236sEKSwRSHA4CwshU6Q==", "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/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6592,10 +7754,12 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/property-provider": { - "version": "3.1.3", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.7.tgz", + "integrity": "sha512-QfzLi1GPMisY7bAM5hOUqBdGYnY5S2JAlr201pghksrQv139f8iiiMalXtjczIP5f6owxFn3MINLNUNvUkgtPw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6603,10 +7767,12 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.8.tgz", + "integrity": "sha512-0NHdQiSkeGl0ICQKcJQ2lCOKH23Nb0EaAa7RDRId6ZqwXkw4LJyIyZ0t3iusD4bnKYDPLGy2/5e2rfUhrt0Acw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { @@ -6614,7 +7780,9 @@ } }, "node_modules/@smithy/util-endpoints/node_modules/@smithy/types": { - "version": "3.3.0", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.5.0.tgz", + "integrity": "sha512-QN0twHNfe8mNJdH9unwsCK13GURU7oEAZqkBI+rsvpv1jrmserO+WnLE7jidR9W/1dxwZ0u/CB01mV2Gms/K2Q==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -19267,7 +20435,7 @@ "devDependencies": {}, "engines": { "npm": "^10.1.0", - "vscode": "^1.68.0" + "vscode": "^1.83.0" } }, "packages/core": { @@ -19277,6 +20445,7 @@ "license": "Apache-2.0", "dependencies": { "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", + "@aws-sdk/client-cloudwatch-logs": "^3.666.0", "@aws-sdk/client-cognito-identity": "^3.637.0", "@aws-sdk/client-lambda": "^3.637.0", "@aws-sdk/client-sso": "^3.342.0", @@ -19428,7 +20597,7 @@ "devDependencies": {}, "engines": { "npm": "^10.1.0", - "vscode": "^1.68.0" + "vscode": "^1.83.0" } }, "plugins/eslint-plugin-aws-toolkits": { diff --git a/packages/core/package.json b/packages/core/package.json index c549bbd9e53..6bfaaa20fde 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -459,6 +459,7 @@ }, "dependencies": { "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", + "@aws-sdk/client-cloudwatch-logs": "^3.666.0", "@aws-sdk/client-cognito-identity": "^3.637.0", "@aws-sdk/client-lambda": "^3.637.0", "@aws-sdk/client-sso": "^3.342.0", diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index 94dcd9c8832..9188e027081 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -154,6 +154,7 @@ "AWS.command.downloadSchemaItemCode": "Download Code Bindings", "AWS.command.viewLogs": "View Logs", "AWS.command.cloudWatchLogs.searchLogGroup": "Search Log Group", + "AWS.command.cloudWatchLogs.tailLogGroup": "Tail Log Group", "AWS.command.sam.newTemplate": "Create new SAM Template", "AWS.command.cloudFormation.newTemplate": "Create new CloudFormation Template", "AWS.command.quickStart": "View Quick Start", @@ -231,6 +232,7 @@ "AWS.cdk.explorerTitle": "CDK", "AWS.codecatalyst.explorerTitle": "CodeCatalyst", "AWS.cwl.limit.desc": "Maximum amount of log entries pulled per request from CloudWatch Logs (max 10000)", + "AWS.cwl.liveTailMaxEvents.desc": "Maximum amount of log entries that can be kept in a single live tail session. When the limit is reached, the oldest events will be removed to accomodate new events (min 1000; max 10000)", "AWS.samcli.deploy.bucket.recentlyUsed": "Buckets recently used for SAM deployments", "AWS.submenu.amazonqEditorContextSubmenu.title": "Amazon Q", "AWS.submenu.auth.title": "Authentication", diff --git a/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts b/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts index b8c769e92f8..7b9cdcd5afd 100644 --- a/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts +++ b/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts @@ -126,4 +126,7 @@ export function createURIFromArgs( return vscode.Uri.parse(uriStr) } -export class CloudWatchLogsSettings extends fromExtensionManifest('aws.cwl', { limit: Number }) {} +export class CloudWatchLogsSettings extends fromExtensionManifest('aws.cwl', { + limit: Number, + liveTailMaxEvents: Number, +}) {} diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts new file mode 100644 index 00000000000..fe116e54621 --- /dev/null +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -0,0 +1,93 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import { CloudWatchLogsClient, StartLiveTailCommand, StartLiveTailCommandOutput } from '@aws-sdk/client-cloudwatch-logs' +import { LogStreamFilterResponse } from '../liveTailLogStreamSubmenu' +import { CloudWatchLogsSettings } from '../cloudWatchLogsUtils' +import { Settings, ToolkitError } from '../../../shared' +import { createLiveTailURIFromArgs } from './liveTailSessionRegistry' + +export type LiveTailSessionConfiguration = { + logGroupName: string + logStreamFilter?: LogStreamFilterResponse + logEventFilterPattern?: string + region: string +} + +export type LiveTailSessionClient = { + cwlClient: CloudWatchLogsClient + abortController: AbortController +} + +export class LiveTailSession { + private liveTailClient: LiveTailSessionClient + private _logGroupName: string + private logStreamFilter?: LogStreamFilterResponse + private logEventFilterPattern?: string + private _maxLines: number + private _uri: vscode.Uri + + static settings = new CloudWatchLogsSettings(Settings.instance) + + public constructor(configuration: LiveTailSessionConfiguration) { + this._logGroupName = configuration.logGroupName + this.logStreamFilter = configuration.logStreamFilter + this.liveTailClient = { + cwlClient: new CloudWatchLogsClient({ region: configuration.region }), + abortController: new AbortController(), + } + this._maxLines = LiveTailSession.settings.get('liveTailMaxEvents', 10000) + this._uri = createLiveTailURIFromArgs(configuration) + } + + public get maxLines() { + return this._maxLines + } + + public get uri() { + return this._uri + } + + public get logGroupName() { + return this._logGroupName + } + + public startLiveTailSession(): Promise { + const command = this.buildStartLiveTailCommand() + try { + return this.liveTailClient.cwlClient.send(command, { + abortSignal: this.liveTailClient.abortController.signal, + }) + } catch (e) { + throw new ToolkitError('Encountered error while trying to start LiveTail session.') + } + } + + public stopLiveTailSession() { + this.liveTailClient.abortController.abort() + this.liveTailClient.cwlClient.destroy() + } + + private buildStartLiveTailCommand(): StartLiveTailCommand { + let logStreamNamePrefix = undefined + let logStreamName = undefined + if (this.logStreamFilter) { + if (this.logStreamFilter.type === 'prefix') { + logStreamNamePrefix = this.logStreamFilter.filter + logStreamName = undefined + } else if (this.logStreamFilter.type === 'specific') { + logStreamName = this.logStreamFilter.filter + logStreamNamePrefix = undefined + } + } + + return new StartLiveTailCommand({ + logGroupIdentifiers: [this.logGroupName], + logStreamNamePrefixes: logStreamNamePrefix ? [logStreamNamePrefix] : undefined, + logStreamNames: logStreamName ? [logStreamName] : undefined, + logEventFilterPattern: this.logEventFilterPattern ? this.logEventFilterPattern : undefined, + }) + } +} diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts new file mode 100644 index 00000000000..1c8484bfbb1 --- /dev/null +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts @@ -0,0 +1,48 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import { CLOUDWATCH_LOGS_LIVETAIL_SCHEME } from '../../../shared/constants' +import { LiveTailSession, LiveTailSessionConfiguration } from './liveTailSession' +import { ToolkitError } from '../../../shared' +import { NestedMap } from '../../../shared/utilities/map' + +export class LiveTailSessionRegistry extends NestedMap { + static #instance: LiveTailSessionRegistry + + public static get instance() { + return (this.#instance ??= new this()) + } + + public constructor() { + super() + } + + protected override hash(uri: vscode.Uri): string { + return uri.toString() + } + + protected override get name(): string { + return LiveTailSessionRegistry.name + } + + protected override get default(): LiveTailSession { + throw new ToolkitError('No LiveTailSession found for provided uri.') + } +} + +export function createLiveTailURIFromArgs(sessionData: LiveTailSessionConfiguration): vscode.Uri { + let uriStr = `${CLOUDWATCH_LOGS_LIVETAIL_SCHEME}:${sessionData.region}:${sessionData.logGroupName}` + + if (sessionData.logStreamFilter) { + if (sessionData.logStreamFilter.type !== 'all') { + uriStr += `:${sessionData.logStreamFilter.type}:${sessionData.logStreamFilter.filter}` + } else { + uriStr += `:${sessionData.logStreamFilter.type}` + } + } + uriStr += sessionData.logEventFilterPattern ? `:${sessionData.logEventFilterPattern}` : '' + + return vscode.Uri.parse(uriStr) +} diff --git a/packages/core/src/shared/constants.ts b/packages/core/src/shared/constants.ts index d79e38c7aef..846479c8521 100644 --- a/packages/core/src/shared/constants.ts +++ b/packages/core/src/shared/constants.ts @@ -128,6 +128,8 @@ export const ecsIamPermissionsUrl = vscode.Uri.parse( * URI scheme for CloudWatch Logs Virtual Documents */ export const CLOUDWATCH_LOGS_SCHEME = 'aws-cwl' // eslint-disable-line @typescript-eslint/naming-convention +export const CLOUDWATCH_LOGS_LIVETAIL_SCHEME = 'aws-cwl-lt' // eslint-disable-line @typescript-eslint/naming-convention + export const AWS_SCHEME = 'aws' // eslint-disable-line @typescript-eslint/naming-convention export const amazonQDiffScheme = 'amazon-q-diff' diff --git a/packages/core/src/shared/settings-toolkit.gen.ts b/packages/core/src/shared/settings-toolkit.gen.ts index ea291352701..62b2bbb1bc4 100644 --- a/packages/core/src/shared/settings-toolkit.gen.ts +++ b/packages/core/src/shared/settings-toolkit.gen.ts @@ -22,6 +22,7 @@ export const toolkitSettings = { "aws.stepfunctions.asl.maxItemsComputed": {}, "aws.ssmDocument.ssm.maxItemsComputed": {}, "aws.cwl.limit": {}, + "aws.cwl.liveTailMaxEvents": {}, "aws.samcli.manuallySelectedBuckets": {}, "aws.samcli.enableCodeLenses": {}, "aws.suppressPrompts": { diff --git a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts new file mode 100644 index 00000000000..cdddb6673a5 --- /dev/null +++ b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts @@ -0,0 +1,136 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import * as vscode from 'vscode' +import assert from 'assert' +import { + LiveTailSession, + LiveTailSessionConfiguration, +} from '../../../../awsService/cloudWatchLogs/registry/liveTailSession' +import { + createLiveTailURIFromArgs, + LiveTailSessionRegistry, +} from '../../../../awsService/cloudWatchLogs/registry/liveTailSessionRegistry' +import { CLOUDWATCH_LOGS_LIVETAIL_SCHEME } from '../../../../shared/constants' + +/** + * Exposes protected methods so we can test them + */ +class TestLiveTailSessionRegistry extends LiveTailSessionRegistry { + constructor() { + super() + } + + override hash(uri: vscode.Uri): string { + return super.hash(uri) + } + + override get default(): LiveTailSession { + return super.default + } +} + +describe('LiveTailRegistry', async function () { + const session = new LiveTailSession({ + logGroupName: 'test-log-group', + region: 'test-region', + }) + + let liveTailSessionRegistry: TestLiveTailSessionRegistry + + beforeEach(function () { + liveTailSessionRegistry = new TestLiveTailSessionRegistry() + }) + + it('hash()', function () { + assert.deepStrictEqual(liveTailSessionRegistry.hash(session.uri), session.uri.toString()) + }) + + it('default()', function () { + assert.throws(() => liveTailSessionRegistry.default) + }) +}) + +describe('LiveTailSession URI', async function () { + const testLogGroupName = 'test-log-group' + const testRegion = 'test-region' + const expectedUriBase = `${CLOUDWATCH_LOGS_LIVETAIL_SCHEME}:${testRegion}:${testLogGroupName}` + + it('is correct with no logStream filter, no filter pattern', function () { + const config: LiveTailSessionConfiguration = { + logGroupName: testLogGroupName, + region: testRegion, + } + const expectedUri = vscode.Uri.parse(expectedUriBase) + const uri = createLiveTailURIFromArgs(config) + assert.deepEqual(uri, expectedUri) + }) + + it('is correct with no logStream filter, with filter pattern', function () { + const config: LiveTailSessionConfiguration = { + logGroupName: testLogGroupName, + region: testRegion, + logEventFilterPattern: 'test-filter', + } + const expectedUri = vscode.Uri.parse(`${expectedUriBase}:test-filter`) + const uri = createLiveTailURIFromArgs(config) + assert.deepEqual(uri, expectedUri) + }) + + it('is correct with ALL logStream filter', function () { + const config: LiveTailSessionConfiguration = { + logGroupName: testLogGroupName, + region: testRegion, + logStreamFilter: { + type: 'all', + }, + } + const expectedUri = vscode.Uri.parse(`${expectedUriBase}:all`) + const uri = createLiveTailURIFromArgs(config) + assert.deepEqual(uri, expectedUri) + }) + + it('is correct with prefix logStream filter', function () { + const config: LiveTailSessionConfiguration = { + logGroupName: testLogGroupName, + region: testRegion, + logStreamFilter: { + type: 'prefix', + filter: 'test-prefix', + }, + } + const expectedUri = vscode.Uri.parse(`${expectedUriBase}:prefix:test-prefix`) + const uri = createLiveTailURIFromArgs(config) + assert.deepEqual(uri, expectedUri) + }) + + it('is correct with specific logStream filter', function () { + const config: LiveTailSessionConfiguration = { + logGroupName: testLogGroupName, + region: testRegion, + logStreamFilter: { + type: 'specific', + filter: 'test-stream', + }, + } + const expectedUri = vscode.Uri.parse(`${expectedUriBase}:specific:test-stream`) + const uri = createLiveTailURIFromArgs(config) + assert.deepEqual(uri, expectedUri) + }) + + it('is correct with specific logStream filter and filter pattern', function () { + const config: LiveTailSessionConfiguration = { + logGroupName: testLogGroupName, + region: testRegion, + logStreamFilter: { + type: 'specific', + filter: 'test-stream', + }, + logEventFilterPattern: 'test-filter', + } + const expectedUri = vscode.Uri.parse(`${expectedUriBase}:specific:test-stream:test-filter`) + const uri = createLiveTailURIFromArgs(config) + assert.deepEqual(uri, expectedUri) + }) +}) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index a0066f36cab..000dc1808dd 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -162,6 +162,13 @@ "description": "%AWS.cwl.limit.desc%", "maximum": 10000 }, + "aws.cwl.liveTailMaxEvents": { + "type": "number", + "default": 10000, + "description": "%AWS.cwl.liveTailMaxEvents.desc%", + "minimum": 1000, + "maximum": 10000 + }, "aws.samcli.manuallySelectedBuckets": { "type": "object", "description": "%AWS.samcli.deploy.bucket.recentlyUsed%", From ccf60331953575d25ad0bd2fdc8f90e5fbe3f241 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Tue, 15 Oct 2024 13:52:00 -0700 Subject: [PATCH 03/22] refactor(cwl): lift TailLogGroupWizard into its own class #5785 ## Problem Wizard code intermixed with command logic ## Solution Refactor out the Wizard so the TailLogGroup command class can focus only on command logic. * Additionally adds the AWSToolkit for VSCode UserAgent to the CWL LiveTail client. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 93 +----------------- .../registry/liveTailSession.ts | 8 +- .../{ => wizard}/liveTailLogStreamSubmenu.ts | 18 ++-- .../wizard/tailLogGroupWizard.ts | 96 +++++++++++++++++++ .../liveTailLogStreamSubmenu.test.ts | 6 +- .../tailLogGroupWizard.test.ts} | 2 +- 6 files changed, 117 insertions(+), 106 deletions(-) rename packages/core/src/awsService/cloudWatchLogs/{ => wizard}/liveTailLogStreamSubmenu.ts (90%) create mode 100644 packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts rename packages/core/src/test/awsService/cloudWatchLogs/{ => wizard}/liveTailLogStreamSubmenu.test.ts (93%) rename packages/core/src/test/awsService/cloudWatchLogs/{commands/tailLogGroup.test.ts => wizard/tailLogGroupWizard.test.ts} (96%) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 53903f9610d..129d22760ee 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -3,26 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as nls from 'vscode-nls' -import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient' -import { createBackButton, createExitButton, createHelpButton } from '../../../shared/ui/buttons' -import { createInputBox } from '../../../shared/ui/inputPrompter' -import { DataQuickPickItem } from '../../../shared/ui/pickerPrompter' -import { Wizard } from '../../../shared/wizards/wizard' -import { CloudWatchLogsGroupInfo } from '../registry/logDataRegistry' -import { RegionSubmenu, RegionSubmenuResponse } from '../../../shared/ui/common/regionSubmenu' +import { TailLogGroupWizard } from '../wizard/tailLogGroupWizard' +import { getLogger } from '../../../shared' import { CancellationError } from '../../../shared/utilities/timeoutUtils' -import { LogStreamFilterResponse, LogStreamFilterSubmenu } from '../liveTailLogStreamSubmenu' -import { getLogger, ToolkitError } from '../../../shared' -import { cwlFilterPatternHelpUrl } from '../../../shared/constants' - -const localize = nls.loadMessageBundle() - -export interface TailLogGroupWizardResponse { - regionLogGroupSubmenuResponse: RegionSubmenuResponse - logStreamFilter: LogStreamFilterResponse - filterPattern: string -} export async function tailLogGroup(logData?: { regionName: string; groupName: string }): Promise { const wizard = new TailLogGroupWizard(logData) @@ -34,75 +17,3 @@ export async function tailLogGroup(logData?: { regionName: string; groupName: st //TODO: Remove Log. For testing while we aren't yet consuming the wizardResponse. getLogger().info(JSON.stringify(wizardResponse)) } - -export class TailLogGroupWizard extends Wizard { - public constructor(logGroupInfo?: CloudWatchLogsGroupInfo) { - super({ - initState: { - regionLogGroupSubmenuResponse: logGroupInfo - ? { - data: logGroupInfo.groupName, - region: logGroupInfo.regionName, - } - : undefined, - }, - }) - this.form.regionLogGroupSubmenuResponse.bindPrompter(createRegionLogGroupSubmenu) - this.form.logStreamFilter.bindPrompter((state) => { - if (!state.regionLogGroupSubmenuResponse?.data) { - throw new ToolkitError('LogGroupName is null') - } - return new LogStreamFilterSubmenu( - state.regionLogGroupSubmenuResponse.data, - state.regionLogGroupSubmenuResponse.region - ) - }) - this.form.filterPattern.bindPrompter((state) => createFilterPatternPrompter()) - } -} - -export function createRegionLogGroupSubmenu(): RegionSubmenu { - return new RegionSubmenu( - getLogGroupQuickPickOptions, - { - title: localize('AWS.cwl.tailLogGroup.logGroupPromptTitle', 'Select Log Group to tail'), - buttons: [createExitButton()], - }, - { title: localize('AWS.cwl.tailLogGroup.regionPromptTitle', 'Select Region for Log Group') }, - 'LogGroups' - ) -} - -async function getLogGroupQuickPickOptions(regionCode: string): Promise[]> { - const client = new DefaultCloudWatchLogsClient(regionCode) - const logGroups = client.describeLogGroups() - - const logGroupsOptions: DataQuickPickItem[] = [] - - for await (const logGroupObject of logGroups) { - if (!logGroupObject.arn || !logGroupObject.logGroupName) { - throw new ToolkitError('LogGroupObject name or arn undefined') - } - - logGroupsOptions.push({ - label: logGroupObject.logGroupName, - data: formatLogGroupArn(logGroupObject.arn), - }) - } - - return logGroupsOptions -} - -function formatLogGroupArn(logGroupArn: string): string { - return logGroupArn.endsWith(':*') ? logGroupArn.substring(0, logGroupArn.length - 2) : logGroupArn -} - -export function createFilterPatternPrompter() { - const helpUri = cwlFilterPatternHelpUrl - return createInputBox({ - title: 'Provide log event filter pattern', - placeholder: 'filter pattern (case sensitive; empty matches all)', - prompt: 'Optional pattern to use to filter the results to include only log events that match the pattern.', - buttons: [createHelpButton(helpUri), createBackButton(), createExitButton()], - }) -} diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index fe116e54621..ff2b044616d 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -4,10 +4,11 @@ */ import * as vscode from 'vscode' import { CloudWatchLogsClient, StartLiveTailCommand, StartLiveTailCommandOutput } from '@aws-sdk/client-cloudwatch-logs' -import { LogStreamFilterResponse } from '../liveTailLogStreamSubmenu' +import { LogStreamFilterResponse } from '../wizard/liveTailLogStreamSubmenu' import { CloudWatchLogsSettings } from '../cloudWatchLogsUtils' import { Settings, ToolkitError } from '../../../shared' import { createLiveTailURIFromArgs } from './liveTailSessionRegistry' +import { getUserAgent } from '../../../shared/telemetry/util' export type LiveTailSessionConfiguration = { logGroupName: string @@ -35,7 +36,10 @@ export class LiveTailSession { this._logGroupName = configuration.logGroupName this.logStreamFilter = configuration.logStreamFilter this.liveTailClient = { - cwlClient: new CloudWatchLogsClient({ region: configuration.region }), + cwlClient: new CloudWatchLogsClient({ + region: configuration.region, + customUserAgent: getUserAgent(), + }), abortController: new AbortController(), } this._maxLines = LiveTailSession.settings.get('liveTailMaxEvents', 10000) diff --git a/packages/core/src/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.ts b/packages/core/src/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.ts similarity index 90% rename from packages/core/src/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.ts rename to packages/core/src/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.ts index e39cd1b8282..a76ec8861e4 100644 --- a/packages/core/src/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.ts +++ b/packages/core/src/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.ts @@ -2,20 +2,20 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -import { Prompter, PromptResult } from '../../shared/ui/prompter' -import { DefaultCloudWatchLogsClient } from '../../shared/clients/cloudWatchLogsClient' -import { createCommonButtons } from '../../shared/ui/buttons' -import { createInputBox, InputBoxPrompter } from '../../shared/ui/inputPrompter' -import { createQuickPick, DataQuickPickItem, QuickPickPrompter } from '../../shared/ui/pickerPrompter' -import { pageableToCollection } from '../../shared/utilities/collectionUtils' +import { Prompter, PromptResult } from '../../../shared/ui/prompter' +import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient' +import { createCommonButtons } from '../../../shared/ui/buttons' +import { createInputBox, InputBoxPrompter } from '../../../shared/ui/inputPrompter' +import { createQuickPick, DataQuickPickItem, QuickPickPrompter } from '../../../shared/ui/pickerPrompter' +import { pageableToCollection } from '../../../shared/utilities/collectionUtils' import { CloudWatchLogs } from 'aws-sdk' -import { isValidResponse, StepEstimator } from '../../shared/wizards/wizard' -import { isNonNullable } from '../../shared/utilities/tsUtils' +import { isValidResponse, StepEstimator } from '../../../shared/wizards/wizard' +import { isNonNullable } from '../../../shared/utilities/tsUtils' import { startLiveTailHelpUrl, startLiveTailLogStreamNamesHelpUrl, startLiveTailLogStreamPrefixHelpUrl, -} from '../../shared/constants' +} from '../../../shared/constants' export type LogStreamFilterType = 'menu' | 'prefix' | 'specific' | 'all' diff --git a/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts b/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts new file mode 100644 index 00000000000..c0ba4bdc3af --- /dev/null +++ b/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts @@ -0,0 +1,96 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as nls from 'vscode-nls' +import { ToolkitError } from '../../../shared' +import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient' +import { cwlFilterPatternHelpUrl } from '../../../shared/constants' +import { createBackButton, createExitButton, createHelpButton } from '../../../shared/ui/buttons' +import { RegionSubmenu, RegionSubmenuResponse } from '../../../shared/ui/common/regionSubmenu' +import { createInputBox } from '../../../shared/ui/inputPrompter' +import { DataQuickPickItem } from '../../../shared/ui/pickerPrompter' +import { Wizard } from '../../../shared/wizards/wizard' +import { CloudWatchLogsGroupInfo } from '../registry/logDataRegistry' +import { LogStreamFilterResponse, LogStreamFilterSubmenu } from './liveTailLogStreamSubmenu' + +const localize = nls.loadMessageBundle() + +export interface TailLogGroupWizardResponse { + regionLogGroupSubmenuResponse: RegionSubmenuResponse + logStreamFilter: LogStreamFilterResponse + filterPattern: string +} + +export class TailLogGroupWizard extends Wizard { + public constructor(logGroupInfo?: CloudWatchLogsGroupInfo) { + super({ + initState: { + regionLogGroupSubmenuResponse: logGroupInfo + ? { + data: logGroupInfo.groupName, + region: logGroupInfo.regionName, + } + : undefined, + }, + }) + this.form.regionLogGroupSubmenuResponse.bindPrompter(createRegionLogGroupSubmenu) + this.form.logStreamFilter.bindPrompter((state) => { + if (!state.regionLogGroupSubmenuResponse?.data) { + throw new ToolkitError('LogGroupName is null') + } + return new LogStreamFilterSubmenu( + state.regionLogGroupSubmenuResponse.data, + state.regionLogGroupSubmenuResponse.region + ) + }) + this.form.filterPattern.bindPrompter((state) => createFilterPatternPrompter()) + } +} + +export function createRegionLogGroupSubmenu(): RegionSubmenu { + return new RegionSubmenu( + getLogGroupQuickPickOptions, + { + title: localize('AWS.cwl.tailLogGroup.logGroupPromptTitle', 'Select Log Group to tail'), + buttons: [createExitButton()], + }, + { title: localize('AWS.cwl.tailLogGroup.regionPromptTitle', 'Select Region for Log Group') }, + 'LogGroups' + ) +} + +async function getLogGroupQuickPickOptions(regionCode: string): Promise[]> { + const client = new DefaultCloudWatchLogsClient(regionCode) + const logGroups = client.describeLogGroups() + + const logGroupsOptions: DataQuickPickItem[] = [] + + for await (const logGroupObject of logGroups) { + if (!logGroupObject.arn || !logGroupObject.logGroupName) { + throw new ToolkitError('LogGroupObject name or arn undefined') + } + + logGroupsOptions.push({ + label: logGroupObject.logGroupName, + data: formatLogGroupArn(logGroupObject.arn), + }) + } + + return logGroupsOptions +} + +function formatLogGroupArn(logGroupArn: string): string { + return logGroupArn.endsWith(':*') ? logGroupArn.substring(0, logGroupArn.length - 2) : logGroupArn +} + +export function createFilterPatternPrompter() { + const helpUri = cwlFilterPatternHelpUrl + return createInputBox({ + title: 'Provide log event filter pattern', + placeholder: 'filter pattern (case sensitive; empty matches all)', + prompt: 'Optional pattern to use to filter the results to include only log events that match the pattern.', + buttons: [createHelpButton(helpUri), createBackButton(), createExitButton()], + }) +} diff --git a/packages/core/src/test/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.test.ts similarity index 93% rename from packages/core/src/test/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.test.ts rename to packages/core/src/test/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.test.ts index 0ac71141b7a..7918817dd91 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/liveTailLogStreamSubmenu.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.test.ts @@ -4,9 +4,9 @@ */ import assert from 'assert' -import { LogStreamFilterSubmenu } from '../../../awsService/cloudWatchLogs/liveTailLogStreamSubmenu' -import { createQuickPickPrompterTester, QuickPickPrompterTester } from '../../shared/ui/testUtils' -import { getTestWindow } from '../../shared/vscode/window' +import { LogStreamFilterSubmenu } from '../../../../awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu' +import { createQuickPickPrompterTester, QuickPickPrompterTester } from '../../../shared/ui/testUtils' +import { getTestWindow } from '../../../shared/vscode/window' describe('liveTailLogStreamSubmenu', async function () { let logStreamFilterSubmenu: LogStreamFilterSubmenu diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.test.ts similarity index 96% rename from packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts rename to packages/core/src/test/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.test.ts index 4b2e382f38c..137b372438e 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.test.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { TailLogGroupWizard } from '../../../../awsService/cloudWatchLogs/commands/tailLogGroup' +import { TailLogGroupWizard } from '../../../../awsService/cloudWatchLogs/wizard/tailLogGroupWizard' import { createWizardTester } from '../../../shared/wizards/wizardTestUtils' describe('TailLogGroupWizard', async function () { From 56b7efd65c2d4f49a972511bdaf03f9c3ddace8f Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Tue, 15 Oct 2024 15:16:29 -0700 Subject: [PATCH 04/22] refactor(cwl): change LiveTailRegistry to standard map #5789 ## Problem The nestedMap implementation of the registry was forcing a defined Default item. This doesn't fit the usecase I am aiming to provide by this registry. There is no default object to be returned. If an item doesn't exist in the registry, we should handle an undefined object, and not a placeholder. In other words, there is no concept of a placeholder/default value for a LiveTailSession. Additionally, `set` on the NestedMap would perform a deep merge. I am wanting to replace the object. Originally I defined the default object to an exception, but the NestedMap `set` operation calls `get`. And if there isn't already a value in the map, it would throw the exception defined as the default object. This means we could never add any item to the map. ## Solution Swap the underlying implementation of the registry to a basic Map. I am still defining a `LiveTailSessionRegistry` class so we can statically initialize a registry singleton, as well as leaving the possibility open to override or extend the `Map` class. Also so we can pass around the type `LiveTailSessionRegistry` instead of `Map`. --- .../registry/liveTailSessionRegistry.ts | 16 +------ .../registry/liveTailRegistry.test.ts | 48 +------------------ 2 files changed, 3 insertions(+), 61 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts index 1c8484bfbb1..4e23b3cbe6f 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts @@ -5,10 +5,8 @@ import * as vscode from 'vscode' import { CLOUDWATCH_LOGS_LIVETAIL_SCHEME } from '../../../shared/constants' import { LiveTailSession, LiveTailSessionConfiguration } from './liveTailSession' -import { ToolkitError } from '../../../shared' -import { NestedMap } from '../../../shared/utilities/map' -export class LiveTailSessionRegistry extends NestedMap { +export class LiveTailSessionRegistry extends Map { static #instance: LiveTailSessionRegistry public static get instance() { @@ -18,18 +16,6 @@ export class LiveTailSessionRegistry extends NestedMap liveTailSessionRegistry.default) - }) -}) - describe('LiveTailSession URI', async function () { const testLogGroupName = 'test-log-group' const testRegion = 'test-region' From 405f4561ed17733fcc490bc90a64a380e88f6cdd Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Mon, 21 Oct 2024 07:30:26 -0700 Subject: [PATCH 05/22] feat(cwl): initialize tailLogGroup command. starts stream and prints logEvents to textDocument (#5790) ## Problem TailLogGroup currently is just logging the Users WizardResponse. It does not start a LiveTail stream or print results to the VSCode editor ## Solution * Creates a `LiveTailSession` with the input params from the TailLogGroupWizard * Registers the LiveTailSession in the `LiveTailSessionRegistry` * Iterates the Response Stream and prints new LogEvents to a TextDocument * If there are no open tabs for a given session's TextDocument, the stream will be closed by triggering its AbortController and disposing its client. We will use a new URI Scheme for LiveTail text documents so we can identify a LiveTail session vs a Cloudwatch SearchLogGroup/ViewLogStream document. In the future, we will register LiveTail specific CodeLenses that depend upon this URI scheme. Defining a new URI scheme for a Text Document requires a Document Provider. In this use case, it is empty given that the response handling that writes to the document lives within the TailLogGroup command itself. --- .../awsService/cloudWatchLogs/activation.ts | 12 +- .../cloudWatchLogs/commands/tailLogGroup.ts | 145 +++++++++++++++- .../document/liveTailDocumentProvider.ts | 13 ++ .../registry/liveTailSession.ts | 14 +- .../commands/tailLogGroup.test.ts | 158 ++++++++++++++++++ 5 files changed, 333 insertions(+), 9 deletions(-) create mode 100644 packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts create mode 100644 packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts diff --git a/packages/core/src/awsService/cloudWatchLogs/activation.ts b/packages/core/src/awsService/cloudWatchLogs/activation.ts index 03760b158e7..065cb9a7958 100644 --- a/packages/core/src/awsService/cloudWatchLogs/activation.ts +++ b/packages/core/src/awsService/cloudWatchLogs/activation.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import { CLOUDWATCH_LOGS_SCHEME } from '../../shared/constants' +import { CLOUDWATCH_LOGS_LIVETAIL_SCHEME, CLOUDWATCH_LOGS_SCHEME } from '../../shared/constants' import { Settings } from '../../shared/settings' import { addLogEvents } from './commands/addLogEvents' import { copyLogResource } from './commands/copyLogResource' @@ -20,11 +20,15 @@ import { changeLogSearchParams } from './changeLogSearch' import { CloudWatchLogsNode } from './explorer/cloudWatchLogsNode' import { loadAndOpenInitialLogStreamFile, LogStreamCodeLensProvider } from './document/logStreamsCodeLensProvider' import { tailLogGroup } from './commands/tailLogGroup' +import { LiveTailDocumentProvider } from './document/liveTailDocumentProvider' +import { LiveTailSessionRegistry } from './registry/liveTailSessionRegistry' export async function activate(context: vscode.ExtensionContext, configuration: Settings): Promise { const registry = LogDataRegistry.instance + const liveTailRegistry = LiveTailSessionRegistry.instance const documentProvider = new LogDataDocumentProvider(registry) + const liveTailDocumentProvider = new LiveTailDocumentProvider() context.subscriptions.push( vscode.languages.registerCodeLensProvider( @@ -40,6 +44,10 @@ export async function activate(context: vscode.ExtensionContext, configuration: vscode.workspace.registerTextDocumentContentProvider(CLOUDWATCH_LOGS_SCHEME, documentProvider) ) + context.subscriptions.push( + vscode.workspace.registerTextDocumentContentProvider(CLOUDWATCH_LOGS_LIVETAIL_SCHEME, liveTailDocumentProvider) + ) + context.subscriptions.push( vscode.workspace.onDidCloseTextDocument((doc) => { if (doc.isClosed && doc.uri.scheme === CLOUDWATCH_LOGS_SCHEME) { @@ -97,7 +105,7 @@ export async function activate(context: vscode.ExtensionContext, configuration: node instanceof LogGroupNode ? { regionName: node.regionCode, groupName: node.logGroup.logGroupName! } : undefined - await tailLogGroup(logGroupInfo) + await tailLogGroup(liveTailRegistry, logGroupInfo) }) ) } diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 129d22760ee..0480bd38877 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -3,17 +3,154 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as vscode from 'vscode' import { TailLogGroupWizard } from '../wizard/tailLogGroupWizard' -import { getLogger } from '../../../shared' import { CancellationError } from '../../../shared/utilities/timeoutUtils' +import { LiveTailSession, LiveTailSessionConfiguration } from '../registry/liveTailSession' +import { LiveTailSessionRegistry } from '../registry/liveTailSessionRegistry' +import { LiveTailSessionLogEvent, StartLiveTailResponseStream } from '@aws-sdk/client-cloudwatch-logs' +import { ToolkitError } from '../../../shared' -export async function tailLogGroup(logData?: { regionName: string; groupName: string }): Promise { +export async function tailLogGroup( + registry: LiveTailSessionRegistry, + logData?: { regionName: string; groupName: string } +): Promise { const wizard = new TailLogGroupWizard(logData) const wizardResponse = await wizard.run() if (!wizardResponse) { throw new CancellationError('user') } - //TODO: Remove Log. For testing while we aren't yet consuming the wizardResponse. - getLogger().info(JSON.stringify(wizardResponse)) + const liveTailSessionConfig: LiveTailSessionConfiguration = { + logGroupName: wizardResponse.regionLogGroupSubmenuResponse.data, + logStreamFilter: wizardResponse.logStreamFilter, + logEventFilterPattern: wizardResponse.filterPattern, + region: wizardResponse.regionLogGroupSubmenuResponse.region, + } + const session = new LiveTailSession(liveTailSessionConfig) + if (registry.has(session.uri)) { + await prepareDocument(session) + return + } + registry.set(session.uri, session) + + const document = await prepareDocument(session) + registerTabChangeCallback(session, registry, document) + const stream = await session.startLiveTailSession() + + await handleSessionStream(stream, document, session) +} + +export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry) { + const session = registry.get(sessionUri) + if (session === undefined) { + throw new ToolkitError(`No LiveTail session found for URI: ${sessionUri.toString()}`) + } + session.stopLiveTailSession() + registry.delete(sessionUri) +} + +export async function clearDocument(textDocument: vscode.TextDocument) { + const edit = new vscode.WorkspaceEdit() + const startPosition = new vscode.Position(0, 0) + const endPosition = new vscode.Position(textDocument.lineCount, 0) + edit.delete(textDocument.uri, new vscode.Range(startPosition, endPosition)) + await vscode.workspace.applyEdit(edit) +} + +async function prepareDocument(session: LiveTailSession): Promise { + const textDocument = await vscode.workspace.openTextDocument(session.uri) + await clearDocument(textDocument) + await vscode.window.showTextDocument(textDocument, { preview: false }) + await vscode.languages.setTextDocumentLanguage(textDocument, 'log') + return textDocument +} + +async function handleSessionStream( + stream: AsyncIterable, + document: vscode.TextDocument, + session: LiveTailSession +) { + try { + for await (const event of stream) { + if (event.sessionUpdate !== undefined && event.sessionUpdate.sessionResults !== undefined) { + const formattedLogEvents = event.sessionUpdate.sessionResults.map((logEvent) => + formatLogEvent(logEvent) + ) + if (formattedLogEvents.length !== 0) { + await updateTextDocumentWithNewLogEvents(formattedLogEvents, document, session.maxLines) + } + } + } + } catch (err) { + throw new ToolkitError('Caught on-stream exception') + } +} + +function formatLogEvent(logEvent: LiveTailSessionLogEvent): string { + if (!logEvent.timestamp || !logEvent.message) { + return '' + } + const timestamp = new Date(logEvent.timestamp).toLocaleTimeString('en', { + timeStyle: 'medium', + hour12: false, + timeZone: 'UTC', + }) + let line = timestamp.concat('\t', logEvent.message) + if (!line.endsWith('\n')) { + line = line.concat('\n') + } + return line +} + +async function updateTextDocumentWithNewLogEvents( + formattedLogEvents: string[], + document: vscode.TextDocument, + maxLines: number +) { + const edit = new vscode.WorkspaceEdit() + formattedLogEvents.forEach((formattedLogEvent) => + edit.insert(document.uri, new vscode.Position(document.lineCount, 0), formattedLogEvent) + ) + await vscode.workspace.applyEdit(edit) +} + +/** + * The LiveTail session should be automatically closed if the user does not have the session's + * document in any Tab in their editor. + * + * `onDidCloseTextDocument` doesn't work for our case because the tailLogGroup command will keep the stream + * writing to the doc even when all its tabs/editors are closed, seemingly keeping the doc 'open'. + * Also there is no guarantee that this event fires when an editor tab is closed + * + * `onDidChangeVisibleTextEditors` returns editors that the user can see its contents. An editor that is open, but hidden + * from view, will not be returned. Meaning a Tab that is created (shown in top bar), but not open, will not be returned. Even if + * the tab isn't visible, we want to continue writing to the doc, and keep the session alive. + */ +function registerTabChangeCallback( + session: LiveTailSession, + registry: LiveTailSessionRegistry, + document: vscode.TextDocument +) { + vscode.window.tabGroups.onDidChangeTabs((tabEvent) => { + const isOpen = isLiveTailSessionOpenInAnyTab(session) + if (!isOpen) { + closeSession(session.uri, registry) + void clearDocument(document) + } + }) +} + +function isLiveTailSessionOpenInAnyTab(liveTailSession: LiveTailSession) { + let isOpen = false + vscode.window.tabGroups.all.forEach(async (tabGroup) => { + tabGroup.tabs.forEach((tab) => { + if (tab.input instanceof vscode.TabInputText) { + if (liveTailSession.uri.toString() === tab.input.uri.toString()) { + isOpen = true + } + } + }) + }) + return isOpen } diff --git a/packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts new file mode 100644 index 00000000000..fe909579ae3 --- /dev/null +++ b/packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts @@ -0,0 +1,13 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' + +export class LiveTailDocumentProvider implements vscode.TextDocumentContentProvider { + provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult { + //Content will be written to the document via handling a LiveTail response stream in the TailLogGroup command. + return '' + } +} diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index ff2b044616d..e277f766054 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -3,7 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ import * as vscode from 'vscode' -import { CloudWatchLogsClient, StartLiveTailCommand, StartLiveTailCommandOutput } from '@aws-sdk/client-cloudwatch-logs' +import { + CloudWatchLogsClient, + StartLiveTailCommand, + StartLiveTailResponseStream, +} from '@aws-sdk/client-cloudwatch-logs' import { LogStreamFilterResponse } from '../wizard/liveTailLogStreamSubmenu' import { CloudWatchLogsSettings } from '../cloudWatchLogsUtils' import { Settings, ToolkitError } from '../../../shared' @@ -58,12 +62,16 @@ export class LiveTailSession { return this._logGroupName } - public startLiveTailSession(): Promise { + public async startLiveTailSession(): Promise> { const command = this.buildStartLiveTailCommand() try { - return this.liveTailClient.cwlClient.send(command, { + const commandOutput = await this.liveTailClient.cwlClient.send(command, { abortSignal: this.liveTailClient.abortController.signal, }) + if (!commandOutput.responseStream) { + throw new ToolkitError('LiveTail session response stream is undefined.') + } + return commandOutput.responseStream } catch (e) { throw new ToolkitError('Encountered error while trying to start LiveTail session.') } diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts new file mode 100644 index 00000000000..c5061ffde1f --- /dev/null +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -0,0 +1,158 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as sinon from 'sinon' +import * as vscode from 'vscode' + +import assert from 'assert' +import { clearDocument, closeSession, tailLogGroup } from '../../../../awsService/cloudWatchLogs/commands/tailLogGroup' +import { StartLiveTailResponseStream } from '@aws-sdk/client-cloudwatch-logs' +import { LiveTailSessionRegistry } from '../../../../awsService/cloudWatchLogs/registry/liveTailSessionRegistry' +import { LiveTailSession } from '../../../../awsService/cloudWatchLogs/registry/liveTailSession' +import { asyncGenerator } from '../../../../shared/utilities/collectionUtils' +import { + TailLogGroupWizard, + TailLogGroupWizardResponse, +} from '../../../../awsService/cloudWatchLogs/wizard/tailLogGroupWizard' +import { getTestWindow } from '../../../shared/vscode/window' + +describe('TailLogGroup', function () { + const testLogGroup = 'test-log-group' + const testRegion = 'test-region' + const testMessage = 'test-message' + + let sandbox: sinon.SinonSandbox + let registry: LiveTailSessionRegistry + let startLiveTailSessionSpy: sinon.SinonSpy + let stopLiveTailSessionSpy: sinon.SinonSpy + let wizardSpy: sinon.SinonSpy + + beforeEach(function () { + sandbox = sinon.createSandbox() + registry = new LiveTailSessionRegistry() + }) + + afterEach(function () { + sandbox.restore() + }) + + it('starts LiveTailSession and writes to document. Closes tab and asserts session gets closed.', async function () { + wizardSpy = sandbox.stub(TailLogGroupWizard.prototype, 'run').callsFake(async function () { + return getTestWizardResponse() + }) + startLiveTailSessionSpy = sandbox + .stub(LiveTailSession.prototype, 'startLiveTailSession') + .callsFake(async function () { + return getTestResponseStream() + }) + stopLiveTailSessionSpy = sandbox + .stub(LiveTailSession.prototype, 'stopLiveTailSession') + .callsFake(async function () { + return + }) + await tailLogGroup(registry, { + groupName: testLogGroup, + regionName: testRegion, + }) + assert.strictEqual(wizardSpy.calledOnce, true) + assert.strictEqual(startLiveTailSessionSpy.calledOnce, true) + assert.strictEqual(registry.size, 1) + + //registry is asserted to have only one entry, so this is assumed to be the session that was + //started in this test. + let sessionUri: vscode.Uri | undefined + registry.forEach((session) => (sessionUri = session.uri)) + if (sessionUri === undefined) { + throw Error + } + const document = getTestWindow().activeTextEditor?.document + assert.strictEqual(sessionUri.toString(), document?.uri.toString()) + assert.strictEqual(document?.getText().trim(), `12:00:00\t${testMessage}`) + + //Test that closing all tabs the session's document is open in will cause the session to close + const window = getTestWindow() + let tabs: vscode.Tab[] = [] + window.tabGroups.all.forEach((tabGroup) => { + tabs = tabs.concat(getLiveTailSessionTabsFromTabGroup(tabGroup, sessionUri!)) + }) + await Promise.all(tabs.map((tab) => window.tabGroups.close(tab))) + assert.strictEqual(registry.size, 0) + assert.strictEqual(stopLiveTailSessionSpy.calledOnce, true) + }) + + it('closeSession removes session from registry and calls underlying stopLiveTailSession function.', function () { + stopLiveTailSessionSpy = sandbox + .stub(LiveTailSession.prototype, 'stopLiveTailSession') + .callsFake(async function () { + return + }) + const session = new LiveTailSession({ + logGroupName: testLogGroup, + region: testRegion, + }) + registry.set(session.uri, session) + + closeSession(session.uri, registry) + assert.strictEqual(0, registry.size) + assert.strictEqual(true, stopLiveTailSessionSpy.calledOnce) + }) + + it('clearDocument clears all text from document', async function () { + const session = new LiveTailSession({ + logGroupName: testLogGroup, + region: testRegion, + }) + const testData = 'blah blah blah' + const document = await vscode.workspace.openTextDocument(session.uri) + const edit = new vscode.WorkspaceEdit() + edit.insert(document.uri, new vscode.Position(0, 0), testData) + await vscode.workspace.applyEdit(edit) + assert.strictEqual(document.getText(), testData) + + await clearDocument(document) + assert.strictEqual(document.getText(), '') + }) + + function getLiveTailSessionTabsFromTabGroup(tabGroup: vscode.TabGroup, sessionUri: vscode.Uri): vscode.Tab[] { + return tabGroup.tabs.filter((tab) => { + if (tab.input instanceof vscode.TabInputText) { + return sessionUri!.toString() === tab.input.uri.toString() + } + }) + } + + function getTestWizardResponse(): TailLogGroupWizardResponse { + return { + regionLogGroupSubmenuResponse: { + region: testRegion, + data: testLogGroup, + }, + filterPattern: '', + logStreamFilter: { + type: 'all', + }, + } + } + + function getTestResponseStream(): AsyncIterable { + const sessionStartFrame: StartLiveTailResponseStream = { + sessionStart: { + logGroupIdentifiers: [testLogGroup], + }, + sessionUpdate: undefined, + } + const sessionUpdateFrame: StartLiveTailResponseStream = { + sessionUpdate: { + sessionResults: [ + { + message: testMessage, + timestamp: 876830400000, + }, + ], + }, + } + return asyncGenerator([sessionStartFrame, sessionUpdateFrame]) + } +}) From 5ca462943c2dce25e745e25adc88ed4536ecce82 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Tue, 22 Oct 2024 14:49:51 -0700 Subject: [PATCH 06/22] refactor(cwl): remove LiveTail setting, re-use existing CWL setting #5831 * Remove CWL LiveTail limit setting. Instead pulls from existing limit preference. Updated description of limit preference to describe LiveTail line trimming behavior * Rename CWL Scheme variable to fit linting rules * Bubble up exception instead of rethrowing it. --- packages/core/package.nls.json | 3 +-- .../awsService/cloudWatchLogs/activation.ts | 4 ++-- .../cloudWatchLogs/cloudWatchLogsUtils.ts | 5 +---- .../cloudWatchLogs/commands/tailLogGroup.ts | 18 +++++++----------- .../cloudWatchLogs/registry/liveTailSession.ts | 2 +- .../registry/liveTailSessionRegistry.ts | 4 ++-- packages/core/src/shared/constants.ts | 2 +- .../core/src/shared/settings-toolkit.gen.ts | 1 - .../registry/liveTailRegistry.test.ts | 4 ++-- packages/toolkit/package.json | 7 ------- 10 files changed, 17 insertions(+), 33 deletions(-) diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index b029f874c53..20a1a035f29 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -232,8 +232,7 @@ "AWS.appcomposer.explorerTitle": "Infrastructure Composer", "AWS.cdk.explorerTitle": "CDK", "AWS.codecatalyst.explorerTitle": "CodeCatalyst", - "AWS.cwl.limit.desc": "Maximum amount of log entries pulled per request from CloudWatch Logs (max 10000)", - "AWS.cwl.liveTailMaxEvents.desc": "Maximum amount of log entries that can be kept in a single live tail session. When the limit is reached, the oldest events will be removed to accomodate new events (min 1000; max 10000)", + "AWS.cwl.limit.desc": "Maximum amount of log entries pulled per request from CloudWatch Logs. For LiveTail, when the limit is reached, the oldest events will be removed to accomodate new events. (max 10000)", "AWS.samcli.deploy.bucket.recentlyUsed": "Buckets recently used for SAM deployments", "AWS.submenu.amazonqEditorContextSubmenu.title": "Amazon Q", "AWS.submenu.auth.title": "Authentication", diff --git a/packages/core/src/awsService/cloudWatchLogs/activation.ts b/packages/core/src/awsService/cloudWatchLogs/activation.ts index 065cb9a7958..d2ff8fed2d7 100644 --- a/packages/core/src/awsService/cloudWatchLogs/activation.ts +++ b/packages/core/src/awsService/cloudWatchLogs/activation.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import { CLOUDWATCH_LOGS_LIVETAIL_SCHEME, CLOUDWATCH_LOGS_SCHEME } from '../../shared/constants' +import { cloudwatchLogsLiveTailScheme, CLOUDWATCH_LOGS_SCHEME } from '../../shared/constants' import { Settings } from '../../shared/settings' import { addLogEvents } from './commands/addLogEvents' import { copyLogResource } from './commands/copyLogResource' @@ -45,7 +45,7 @@ export async function activate(context: vscode.ExtensionContext, configuration: ) context.subscriptions.push( - vscode.workspace.registerTextDocumentContentProvider(CLOUDWATCH_LOGS_LIVETAIL_SCHEME, liveTailDocumentProvider) + vscode.workspace.registerTextDocumentContentProvider(cloudwatchLogsLiveTailScheme, liveTailDocumentProvider) ) context.subscriptions.push( diff --git a/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts b/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts index 294df856f03..e2356595153 100644 --- a/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts +++ b/packages/core/src/awsService/cloudWatchLogs/cloudWatchLogsUtils.ts @@ -111,7 +111,4 @@ function createURIFromArgs(args: CloudWatchLogsArgs): vscode.Uri { } export const cwlUriSchema = new UriSchema(parseCloudWatchLogsUri, createURIFromArgs) -export class CloudWatchLogsSettings extends fromExtensionManifest('aws.cwl', { - limit: Number, - liveTailMaxEvents: Number, -}) {} +export class CloudWatchLogsSettings extends fromExtensionManifest('aws.cwl', { limit: Number }) {} diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 0480bd38877..b2463309029 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -71,19 +71,15 @@ async function handleSessionStream( document: vscode.TextDocument, session: LiveTailSession ) { - try { - for await (const event of stream) { - if (event.sessionUpdate !== undefined && event.sessionUpdate.sessionResults !== undefined) { - const formattedLogEvents = event.sessionUpdate.sessionResults.map((logEvent) => - formatLogEvent(logEvent) - ) - if (formattedLogEvents.length !== 0) { - await updateTextDocumentWithNewLogEvents(formattedLogEvents, document, session.maxLines) - } + for await (const event of stream) { + if (event.sessionUpdate !== undefined && event.sessionUpdate.sessionResults !== undefined) { + const formattedLogEvents = event.sessionUpdate.sessionResults.map((logEvent) => + formatLogEvent(logEvent) + ) + if (formattedLogEvents.length !== 0) { + await updateTextDocumentWithNewLogEvents(formattedLogEvents, document, session.maxLines) } } - } catch (err) { - throw new ToolkitError('Caught on-stream exception') } } diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index e277f766054..ba6e0fdd27f 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -46,7 +46,7 @@ export class LiveTailSession { }), abortController: new AbortController(), } - this._maxLines = LiveTailSession.settings.get('liveTailMaxEvents', 10000) + this._maxLines = LiveTailSession.settings.get('limit', 10000) this._uri = createLiveTailURIFromArgs(configuration) } diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts index 4e23b3cbe6f..2fcb2731a9c 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import * as vscode from 'vscode' -import { CLOUDWATCH_LOGS_LIVETAIL_SCHEME } from '../../../shared/constants' +import { cloudwatchLogsLiveTailScheme } from '../../../shared/constants' import { LiveTailSession, LiveTailSessionConfiguration } from './liveTailSession' export class LiveTailSessionRegistry extends Map { @@ -19,7 +19,7 @@ export class LiveTailSessionRegistry extends Map { } export function createLiveTailURIFromArgs(sessionData: LiveTailSessionConfiguration): vscode.Uri { - let uriStr = `${CLOUDWATCH_LOGS_LIVETAIL_SCHEME}:${sessionData.region}:${sessionData.logGroupName}` + let uriStr = `${cloudwatchLogsLiveTailScheme}:${sessionData.region}:${sessionData.logGroupName}` if (sessionData.logStreamFilter) { if (sessionData.logStreamFilter.type !== 'all') { diff --git a/packages/core/src/shared/constants.ts b/packages/core/src/shared/constants.ts index 7bb24801542..84135666a66 100644 --- a/packages/core/src/shared/constants.ts +++ b/packages/core/src/shared/constants.ts @@ -128,7 +128,7 @@ export const ecsIamPermissionsUrl = vscode.Uri.parse( * URI scheme for CloudWatch Logs Virtual Documents */ export const CLOUDWATCH_LOGS_SCHEME = 'aws-cwl' // eslint-disable-line @typescript-eslint/naming-convention -export const CLOUDWATCH_LOGS_LIVETAIL_SCHEME = 'aws-cwl-lt' // eslint-disable-line @typescript-eslint/naming-convention +export const cloudwatchLogsLiveTailScheme = 'aws-cwl-lt' export const AWS_SCHEME = 'aws' // eslint-disable-line @typescript-eslint/naming-convention export const ec2LogsScheme = 'aws-ec2' diff --git a/packages/core/src/shared/settings-toolkit.gen.ts b/packages/core/src/shared/settings-toolkit.gen.ts index 62b2bbb1bc4..ea291352701 100644 --- a/packages/core/src/shared/settings-toolkit.gen.ts +++ b/packages/core/src/shared/settings-toolkit.gen.ts @@ -22,7 +22,6 @@ export const toolkitSettings = { "aws.stepfunctions.asl.maxItemsComputed": {}, "aws.ssmDocument.ssm.maxItemsComputed": {}, "aws.cwl.limit": {}, - "aws.cwl.liveTailMaxEvents": {}, "aws.samcli.manuallySelectedBuckets": {}, "aws.samcli.enableCodeLenses": {}, "aws.suppressPrompts": { diff --git a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts index edb586b4514..17ec44e0c07 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts @@ -6,12 +6,12 @@ import * as vscode from 'vscode' import assert from 'assert' import { LiveTailSessionConfiguration } from '../../../../awsService/cloudWatchLogs/registry/liveTailSession' import { createLiveTailURIFromArgs } from '../../../../awsService/cloudWatchLogs/registry/liveTailSessionRegistry' -import { CLOUDWATCH_LOGS_LIVETAIL_SCHEME } from '../../../../shared/constants' +import { cloudwatchLogsLiveTailScheme } from '../../../../shared/constants' describe('LiveTailSession URI', async function () { const testLogGroupName = 'test-log-group' const testRegion = 'test-region' - const expectedUriBase = `${CLOUDWATCH_LOGS_LIVETAIL_SCHEME}:${testRegion}:${testLogGroupName}` + const expectedUriBase = `${cloudwatchLogsLiveTailScheme}:${testRegion}:${testLogGroupName}` it('is correct with no logStream filter, no filter pattern', function () { const config: LiveTailSessionConfiguration = { diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 9b2fa7f18d5..8ebfb3e61a5 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -162,13 +162,6 @@ "description": "%AWS.cwl.limit.desc%", "maximum": 10000 }, - "aws.cwl.liveTailMaxEvents": { - "type": "number", - "default": 10000, - "description": "%AWS.cwl.liveTailMaxEvents.desc%", - "minimum": 1000, - "maximum": 10000 - }, "aws.samcli.manuallySelectedBuckets": { "type": "object", "description": "%AWS.samcli.deploy.bucket.recentlyUsed%", From 64ecf84cbb7dbf17c79dc811a868ee15cf305bf2 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Wed, 23 Oct 2024 17:49:06 -0700 Subject: [PATCH 07/22] feat(cwl): Add line trimming to LiveTail when limit is reached (#5837) ## Problem * LiveTail sessions can run for a long time, on LogGroups that have a high volume of LogEvents. We want to not infinitely add logs to a TextDocument, leading to memory issues within VSCode. ## Solution Users can configure a `limit` preference (default: 10000 , max 10000 , min: 1000). When the number of lines in a Live Tail session (number of LogEvents) reaches the limit, the 'N' oldest logEvents will be removed, to fit in the 'N' newest events coming in from the response stream. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 16 ++++++ .../commands/tailLogGroup.test.ts | 54 +++++++++++++------ 2 files changed, 55 insertions(+), 15 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index b2463309029..800a79a7554 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -108,9 +108,25 @@ async function updateTextDocumentWithNewLogEvents( formattedLogEvents.forEach((formattedLogEvent) => edit.insert(document.uri, new vscode.Position(document.lineCount, 0), formattedLogEvent) ) + if (document.lineCount + formattedLogEvents.length > maxLines) { + trimOldestLines(formattedLogEvents.length, maxLines, document, edit) + } await vscode.workspace.applyEdit(edit) } +function trimOldestLines( + numNewLines: number, + maxLines: number, + document: vscode.TextDocument, + edit: vscode.WorkspaceEdit +) { + const numLinesToTrim = document.lineCount + numNewLines - maxLines + const startPosition = new vscode.Position(0, 0) + const endPosition = new vscode.Position(numLinesToTrim, 0) + const range = new vscode.Range(startPosition, endPosition) + edit.delete(document.uri, range) +} + /** * The LiveTail session should be automatically closed if the user does not have the session's * document in any Tab in their editor. diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index c5061ffde1f..5e988c9d7cc 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode' import assert from 'assert' import { clearDocument, closeSession, tailLogGroup } from '../../../../awsService/cloudWatchLogs/commands/tailLogGroup' -import { StartLiveTailResponseStream } from '@aws-sdk/client-cloudwatch-logs' +import { LiveTailSessionLogEvent, StartLiveTailResponseStream } from '@aws-sdk/client-cloudwatch-logs' import { LiveTailSessionRegistry } from '../../../../awsService/cloudWatchLogs/registry/liveTailSessionRegistry' import { LiveTailSession } from '../../../../awsService/cloudWatchLogs/registry/liveTailSession' import { asyncGenerator } from '../../../../shared/utilities/collectionUtils' @@ -17,6 +17,7 @@ import { TailLogGroupWizardResponse, } from '../../../../awsService/cloudWatchLogs/wizard/tailLogGroupWizard' import { getTestWindow } from '../../../shared/vscode/window' +import { CloudWatchLogsSettings } from '../../../../awsService/cloudWatchLogs/cloudWatchLogsUtils' describe('TailLogGroup', function () { const testLogGroup = 'test-log-group' @@ -27,6 +28,7 @@ describe('TailLogGroup', function () { let registry: LiveTailSessionRegistry let startLiveTailSessionSpy: sinon.SinonSpy let stopLiveTailSessionSpy: sinon.SinonSpy + let cloudwatchSettingsSpy: sinon.SinonSpy let wizardSpy: sinon.SinonSpy beforeEach(function () { @@ -42,21 +44,42 @@ describe('TailLogGroup', function () { wizardSpy = sandbox.stub(TailLogGroupWizard.prototype, 'run').callsFake(async function () { return getTestWizardResponse() }) + const testMessage2 = `${testMessage}-2` + const testMessage3 = `${testMessage}-3` startLiveTailSessionSpy = sandbox .stub(LiveTailSession.prototype, 'startLiveTailSession') .callsFake(async function () { - return getTestResponseStream() + return getTestResponseStream([ + { + message: testMessage, + timestamp: 876830400000, + }, + { + message: testMessage2, + timestamp: 876830402000, + }, + { + message: testMessage3, + timestamp: 876830403000, + }, + ]) }) stopLiveTailSessionSpy = sandbox .stub(LiveTailSession.prototype, 'stopLiveTailSession') .callsFake(async function () { return }) + + //Set maxLines to 1. + cloudwatchSettingsSpy = sandbox.stub(CloudWatchLogsSettings.prototype, 'get').callsFake(() => { + return 1 + }) await tailLogGroup(registry, { groupName: testLogGroup, regionName: testRegion, }) assert.strictEqual(wizardSpy.calledOnce, true) + assert.strictEqual(cloudwatchSettingsSpy.calledOnce, true) assert.strictEqual(startLiveTailSessionSpy.calledOnce, true) assert.strictEqual(registry.size, 1) @@ -69,7 +92,8 @@ describe('TailLogGroup', function () { } const document = getTestWindow().activeTextEditor?.document assert.strictEqual(sessionUri.toString(), document?.uri.toString()) - assert.strictEqual(document?.getText().trim(), `12:00:00\t${testMessage}`) + //Test responseStream has 3 events, maxLines is set to 1. Only 3rd event should be in doc. + assert.strictEqual(document?.getText().trim(), `12:00:03\t${testMessage3}`) //Test that closing all tabs the session's document is open in will cause the session to close const window = getTestWindow() @@ -136,23 +160,23 @@ describe('TailLogGroup', function () { } } - function getTestResponseStream(): AsyncIterable { + //Creates a test response stream. Each log event provided will be its own "frame" of the input stream. + function getTestResponseStream(logEvents: LiveTailSessionLogEvent[]): AsyncIterable { const sessionStartFrame: StartLiveTailResponseStream = { sessionStart: { logGroupIdentifiers: [testLogGroup], }, sessionUpdate: undefined, } - const sessionUpdateFrame: StartLiveTailResponseStream = { - sessionUpdate: { - sessionResults: [ - { - message: testMessage, - timestamp: 876830400000, - }, - ], - }, - } - return asyncGenerator([sessionStartFrame, sessionUpdateFrame]) + + const updateFrames: StartLiveTailResponseStream[] = logEvents.map((event) => { + return { + sessionUpdate: { + sessionResults: [event], + }, + } + }) + + return asyncGenerator([sessionStartFrame, ...updateFrames]) } }) From 5de67b5c964358f85bea0987029f9d3f0647da89 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Mon, 28 Oct 2024 07:03:05 -0700 Subject: [PATCH 08/22] feat(cwl): Support autoscrolling live tail session's visible editors (#5857) ## Problem New log events in a LiveTail session are added to the end of a TextDocument. Session updates can contain multiple LogEvents, leading to the text document growing quickly past the user's view. requiring them to constantly be scrolling the document themselves. ## Solution To maintain parity with CWL console experience (and the classic `tail -f` experience), we want to auto scroll the customer's LiveTail session's visible editors to the bottom. This will only happen IF the end of file is already in view. Meaning, if a User scrolls UP (causing the end of file to not be in view), auto scrolling will not enable. However, if they scroll back down to EOF themselves, it will re-enable. Simply, if the end of file is in view, when new logEvents are added to the document, the editor will be autoscrolled back to the end of the file. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 800a79a7554..ce78f7736b8 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -77,7 +77,11 @@ async function handleSessionStream( formatLogEvent(logEvent) ) if (formattedLogEvents.length !== 0) { + //Determine should scroll before adding new lines to doc because adding large + //amount of new lines can push bottom of file out of view before scrolling. + const editorsToScroll = getTextEditorsToScroll(document) await updateTextDocumentWithNewLogEvents(formattedLogEvents, document, session.maxLines) + editorsToScroll.forEach(scrollTextEditorToBottom) } } } @@ -99,6 +103,22 @@ function formatLogEvent(logEvent: LiveTailSessionLogEvent): string { return line } +//Auto scroll visible LiveTail session editors if the end-of-file is in view. +//This allows for newly added log events to stay in view. +function getTextEditorsToScroll(document: vscode.TextDocument): vscode.TextEditor[] { + return vscode.window.visibleTextEditors.filter((editor) => { + if (editor.document !== document) { + return false + } + return editor.visibleRanges[0].contains(new vscode.Position(document.lineCount - 1, 0)) + }) +} + +function scrollTextEditorToBottom(editor: vscode.TextEditor) { + const position = new vscode.Position(Math.max(editor.document.lineCount - 2, 0), 0) + editor.revealRange(new vscode.Range(position, position), vscode.TextEditorRevealType.Default) +} + async function updateTextDocumentWithNewLogEvents( formattedLogEvents: string[], document: vscode.TextDocument, From a5a0aea3bed262659338ec0a7c11b940388c6714 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Thu, 7 Nov 2024 16:24:44 -0800 Subject: [PATCH 09/22] feat(cwl): LiveTail statusbar #5938 Problem As LiveTail session is running, we want to display to the user metadata about their session. Solution While a livetail session is the active editor, in the bottom status bar, we will display the duration the session has been running for, how many events per/s, and if the log data is being sampled or not. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 73 ++++++++++++++----- .../registry/liveTailSession.ts | 45 +++++++++++- .../commands/tailLogGroup.test.ts | 21 +++++- 3 files changed, 118 insertions(+), 21 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index ce78f7736b8..69ab4569186 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -8,8 +8,12 @@ import { TailLogGroupWizard } from '../wizard/tailLogGroupWizard' import { CancellationError } from '../../../shared/utilities/timeoutUtils' import { LiveTailSession, LiveTailSessionConfiguration } from '../registry/liveTailSession' import { LiveTailSessionRegistry } from '../registry/liveTailSessionRegistry' -import { LiveTailSessionLogEvent, StartLiveTailResponseStream } from '@aws-sdk/client-cloudwatch-logs' -import { ToolkitError } from '../../../shared' +import { + LiveTailSessionLogEvent, + LiveTailSessionUpdate, + StartLiveTailResponseStream, +} from '@aws-sdk/client-cloudwatch-logs' +import { globals, ToolkitError } from '../../../shared' export async function tailLogGroup( registry: LiveTailSessionRegistry, @@ -35,13 +39,19 @@ export async function tailLogGroup( registry.set(session.uri, session) const document = await prepareDocument(session) - registerTabChangeCallback(session, registry, document) + const timer = globals.clock.setInterval(() => { + session.updateStatusBarItemText() + }, 500) + hideShowStatusBarItemsOnActiveEditor(session, document) + registerTabChangeCallback(session, registry, document, timer) + const stream = await session.startLiveTailSession() - await handleSessionStream(stream, document, session) + await handleSessionStream(stream, document, session, timer) } -export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry) { +export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry, timer: NodeJS.Timer) { + globals.clock.clearInterval(timer) const session = registry.get(sessionUri) if (session === undefined) { throw new ToolkitError(`No LiveTail session found for URI: ${sessionUri.toString()}`) @@ -63,27 +73,35 @@ async function prepareDocument(session: LiveTailSession): Promise, document: vscode.TextDocument, - session: LiveTailSession + session: LiveTailSession, + timer: NodeJS.Timer ) { - for await (const event of stream) { - if (event.sessionUpdate !== undefined && event.sessionUpdate.sessionResults !== undefined) { - const formattedLogEvents = event.sessionUpdate.sessionResults.map((logEvent) => - formatLogEvent(logEvent) - ) - if (formattedLogEvents.length !== 0) { - //Determine should scroll before adding new lines to doc because adding large - //amount of new lines can push bottom of file out of view before scrolling. - const editorsToScroll = getTextEditorsToScroll(document) - await updateTextDocumentWithNewLogEvents(formattedLogEvents, document, session.maxLines) - editorsToScroll.forEach(scrollTextEditorToBottom) + try { + for await (const event of stream) { + if (event.sessionUpdate !== undefined && event.sessionUpdate.sessionResults !== undefined) { + const formattedLogEvents = event.sessionUpdate.sessionResults.map((logEvent) => + formatLogEvent(logEvent) + ) + if (formattedLogEvents.length !== 0) { + //Determine should scroll before adding new lines to doc because adding large + //amount of new lines can push bottom of file out of view before scrolling. + const editorsToScroll = getTextEditorsToScroll(document) + await updateTextDocumentWithNewLogEvents(formattedLogEvents, document, session.maxLines) + editorsToScroll.forEach(scrollTextEditorToBottom) + } + session.eventRate = eventRate(event.sessionUpdate) + session.isSampled = isSampled(event.sessionUpdate) } } + } finally { + globals.clock.clearInterval(timer) } } @@ -147,6 +165,22 @@ function trimOldestLines( edit.delete(document.uri, range) } +function isSampled(event: LiveTailSessionUpdate): boolean { + return event.sessionMetadata === undefined || event.sessionMetadata.sampled === undefined + ? false + : event.sessionMetadata.sampled +} + +function eventRate(event: LiveTailSessionUpdate): number { + return event.sessionResults === undefined ? 0 : event.sessionResults.length +} + +function hideShowStatusBarItemsOnActiveEditor(session: LiveTailSession, document: vscode.TextDocument) { + vscode.window.onDidChangeActiveTextEditor((editor) => { + session.showStatusBarItem(editor?.document === document) + }) +} + /** * The LiveTail session should be automatically closed if the user does not have the session's * document in any Tab in their editor. @@ -162,12 +196,13 @@ function trimOldestLines( function registerTabChangeCallback( session: LiveTailSession, registry: LiveTailSessionRegistry, - document: vscode.TextDocument + document: vscode.TextDocument, + timer: NodeJS.Timer ) { vscode.window.tabGroups.onDidChangeTabs((tabEvent) => { const isOpen = isLiveTailSessionOpenInAnyTab(session) if (!isOpen) { - closeSession(session.uri, registry) + closeSession(session.uri, registry, timer) void clearDocument(document) } }) diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index ba6e0fdd27f..7e4b64ccc57 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -10,7 +10,7 @@ import { } from '@aws-sdk/client-cloudwatch-logs' import { LogStreamFilterResponse } from '../wizard/liveTailLogStreamSubmenu' import { CloudWatchLogsSettings } from '../cloudWatchLogsUtils' -import { Settings, ToolkitError } from '../../../shared' +import { convertToTimeString, Settings, ToolkitError } from '../../../shared' import { createLiveTailURIFromArgs } from './liveTailSessionRegistry' import { getUserAgent } from '../../../shared/telemetry/util' @@ -33,6 +33,11 @@ export class LiveTailSession { private logEventFilterPattern?: string private _maxLines: number private _uri: vscode.Uri + private statusBarItem: vscode.StatusBarItem + private startTime: number | undefined + private endTime: number | undefined + private _eventRate: number + private _isSampled: boolean static settings = new CloudWatchLogsSettings(Settings.instance) @@ -48,6 +53,9 @@ export class LiveTailSession { } this._maxLines = LiveTailSession.settings.get('limit', 10000) this._uri = createLiveTailURIFromArgs(configuration) + this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 0) + this._eventRate = 0 + this._isSampled = false } public get maxLines() { @@ -62,6 +70,14 @@ export class LiveTailSession { return this._logGroupName } + public set eventRate(rate: number) { + this._eventRate = rate + } + + public set isSampled(isSampled: boolean) { + this._isSampled = isSampled + } + public async startLiveTailSession(): Promise> { const command = this.buildStartLiveTailCommand() try { @@ -71,6 +87,8 @@ export class LiveTailSession { if (!commandOutput.responseStream) { throw new ToolkitError('LiveTail session response stream is undefined.') } + this.startTime = Date.now() + this.endTime = undefined return commandOutput.responseStream } catch (e) { throw new ToolkitError('Encountered error while trying to start LiveTail session.') @@ -78,10 +96,24 @@ export class LiveTailSession { } public stopLiveTailSession() { + this.endTime = Date.now() + this.statusBarItem.dispose() this.liveTailClient.abortController.abort() this.liveTailClient.cwlClient.destroy() } + public getLiveTailSessionDuration(): number { + //Never started + if (this.startTime === undefined) { + return 0 + } + //Currently running + if (this.endTime === undefined) { + return Date.now() - this.startTime + } + return this.endTime - this.startTime + } + private buildStartLiveTailCommand(): StartLiveTailCommand { let logStreamNamePrefix = undefined let logStreamName = undefined @@ -102,4 +134,15 @@ export class LiveTailSession { logEventFilterPattern: this.logEventFilterPattern ? this.logEventFilterPattern : undefined, }) } + + public showStatusBarItem(shouldShow: boolean) { + shouldShow ? this.statusBarItem.show() : this.statusBarItem.hide() + } + + public updateStatusBarItemText() { + const elapsedTime = this.getLiveTailSessionDuration() + const timeString = convertToTimeString(elapsedTime) + const sampledString = this._isSampled ? 'Yes' : 'No' + this.statusBarItem.text = `Tailing: ${timeString}, ${this._eventRate} events/sec, Sampled: ${sampledString}` + } } diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index 5e988c9d7cc..2a5897db4cc 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -4,6 +4,7 @@ */ import * as sinon from 'sinon' +import * as FakeTimers from '@sinonjs/fake-timers' import * as vscode from 'vscode' import assert from 'assert' @@ -18,6 +19,7 @@ import { } from '../../../../awsService/cloudWatchLogs/wizard/tailLogGroupWizard' import { getTestWindow } from '../../../shared/vscode/window' import { CloudWatchLogsSettings } from '../../../../awsService/cloudWatchLogs/cloudWatchLogsUtils' +import { installFakeClock } from '../../../testUtil' describe('TailLogGroup', function () { const testLogGroup = 'test-log-group' @@ -31,11 +33,22 @@ describe('TailLogGroup', function () { let cloudwatchSettingsSpy: sinon.SinonSpy let wizardSpy: sinon.SinonSpy + let clock: FakeTimers.InstalledClock + + before(function () { + clock = installFakeClock() + }) + beforeEach(function () { + clock.reset() sandbox = sinon.createSandbox() registry = new LiveTailSessionRegistry() }) + after(function () { + clock.uninstall() + }) + afterEach(function () { sandbox.restore() }) @@ -112,15 +125,18 @@ describe('TailLogGroup', function () { .callsFake(async function () { return }) + // const fakeClock = installFakeClock() + const timer = setInterval(() => {}, 1000) const session = new LiveTailSession({ logGroupName: testLogGroup, region: testRegion, }) registry.set(session.uri, session) - closeSession(session.uri, registry) + closeSession(session.uri, registry, timer) assert.strictEqual(0, registry.size) assert.strictEqual(true, stopLiveTailSessionSpy.calledOnce) + assert.strictEqual(0, clock.countTimers()) }) it('clearDocument clears all text from document', async function () { @@ -172,6 +188,9 @@ describe('TailLogGroup', function () { const updateFrames: StartLiveTailResponseStream[] = logEvents.map((event) => { return { sessionUpdate: { + sessionMetadata: { + sampled: false, + }, sessionResults: [event], }, } From e6645d42d2daaf0df4b8e86823544adef7a0769f Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Fri, 8 Nov 2024 14:21:49 -0800 Subject: [PATCH 10/22] feat(cwl): "clear screen", "stop session" actions #5958 ## Problem Users may want to clear their screen during a tailing session. The liveTail document is read only. Users may want to stop their session without closing the document. ## Solution Provide a codeLens to clear the screen (make document empty) Provide a codeLens to stop the session without closing the document. Moves Interval Timer for updating the StatusBar to the LiveTailSession object so `stopLiveTailSession()` can interrupt it, and be guaranteed to be cleaned up. The TextDocument's URI and Session URI seem to not be equal. Looking up in the LiveTailSessionRegistry with a document URI causes a session to not be found. Converting with `toString` allows these URIs to match and the registry to work as intended. Improves Exception handling on-stream. Previously, stopping the session in an expected fashion (codeLens, Closing editors) would cause an exception to bubble up and appear to the User. New change recognizes when the Abort Controller triggers, signifying an error has not occured, and logs the event as opposed to surfacing an error. Exposing only `isAborted` so that a caller has to use `stopLiveTailSession` to trigger the abortController and guarantee that other clean up actions have taken place. --- .../awsService/cloudWatchLogs/activation.ts | 21 +++++++- .../cloudWatchLogs/commands/tailLogGroup.ts | 47 ++++++++++------- .../document/liveTailCodeLensProvider.ts | 52 +++++++++++++++++++ .../registry/liveTailSession.ts | 14 ++++- .../registry/liveTailSessionRegistry.ts | 2 +- .../commands/tailLogGroup.test.ts | 9 ++-- 6 files changed, 118 insertions(+), 27 deletions(-) create mode 100644 packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts diff --git a/packages/core/src/awsService/cloudWatchLogs/activation.ts b/packages/core/src/awsService/cloudWatchLogs/activation.ts index 75951604bea..de75d9e72a4 100644 --- a/packages/core/src/awsService/cloudWatchLogs/activation.ts +++ b/packages/core/src/awsService/cloudWatchLogs/activation.ts @@ -19,13 +19,14 @@ import { searchLogGroup } from './commands/searchLogGroup' import { changeLogSearchParams } from './changeLogSearch' import { CloudWatchLogsNode } from './explorer/cloudWatchLogsNode' import { loadAndOpenInitialLogStreamFile, LogStreamCodeLensProvider } from './document/logStreamsCodeLensProvider' -import { tailLogGroup } from './commands/tailLogGroup' +import { clearDocument, closeSession, tailLogGroup } from './commands/tailLogGroup' import { LiveTailDocumentProvider } from './document/liveTailDocumentProvider' import { LiveTailSessionRegistry } from './registry/liveTailSessionRegistry' import { DeployedResourceNode } from '../appBuilder/explorer/nodes/deployedNode' import { isTreeNode } from '../../shared/treeview/resourceTreeDataProvider' import { getLogger } from '../../shared/logger/logger' import { ToolkitError } from '../../shared' +import { LiveTailCodeLensProvider } from './document/liveTailCodeLensProvider' export async function activate(context: vscode.ExtensionContext, configuration: Settings): Promise { const registry = LogDataRegistry.instance @@ -48,6 +49,16 @@ export async function activate(context: vscode.ExtensionContext, configuration: vscode.workspace.registerTextDocumentContentProvider(CLOUDWATCH_LOGS_SCHEME, documentProvider) ) + context.subscriptions.push( + vscode.languages.registerCodeLensProvider( + { + language: 'log', + scheme: cloudwatchLogsLiveTailScheme, + }, + new LiveTailCodeLensProvider() + ) + ) + context.subscriptions.push( vscode.workspace.registerTextDocumentContentProvider(cloudwatchLogsLiveTailScheme, liveTailDocumentProvider) ) @@ -112,6 +123,14 @@ export async function activate(context: vscode.ExtensionContext, configuration: await tailLogGroup(liveTailRegistry, logGroupInfo) }), + Commands.register('aws.cwl.stopTailingLogGroup', async (document: vscode.TextDocument) => { + closeSession(document.uri, liveTailRegistry) + }), + + Commands.register('aws.cwl.clearDocument', async (document: vscode.TextDocument) => { + await clearDocument(document) + }), + Commands.register('aws.appBuilder.searchLogs', async (node: DeployedResourceNode) => { try { const logGroupInfo = isTreeNode(node) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 69ab4569186..74ac67fca33 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -13,7 +13,8 @@ import { LiveTailSessionUpdate, StartLiveTailResponseStream, } from '@aws-sdk/client-cloudwatch-logs' -import { globals, ToolkitError } from '../../../shared' +import { getLogger, ToolkitError } from '../../../shared' +import { uriToKey } from '../cloudWatchLogsUtils' export async function tailLogGroup( registry: LiveTailSessionRegistry, @@ -32,32 +33,29 @@ export async function tailLogGroup( region: wizardResponse.regionLogGroupSubmenuResponse.region, } const session = new LiveTailSession(liveTailSessionConfig) - if (registry.has(session.uri)) { + if (registry.has(uriToKey(session.uri))) { await prepareDocument(session) return } - registry.set(session.uri, session) + registry.set(uriToKey(session.uri), session) const document = await prepareDocument(session) - const timer = globals.clock.setInterval(() => { - session.updateStatusBarItemText() - }, 500) + hideShowStatusBarItemsOnActiveEditor(session, document) - registerTabChangeCallback(session, registry, document, timer) + registerTabChangeCallback(session, registry, document) const stream = await session.startLiveTailSession() - await handleSessionStream(stream, document, session, timer) + await handleSessionStream(stream, document, session) } -export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry, timer: NodeJS.Timer) { - globals.clock.clearInterval(timer) - const session = registry.get(sessionUri) +export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry) { + const session = registry.get(uriToKey(sessionUri)) if (session === undefined) { throw new ToolkitError(`No LiveTail session found for URI: ${sessionUri.toString()}`) } session.stopLiveTailSession() - registry.delete(sessionUri) + registry.delete(uriToKey(sessionUri)) } export async function clearDocument(textDocument: vscode.TextDocument) { @@ -80,8 +78,7 @@ async function prepareDocument(session: LiveTailSession): Promise, document: vscode.TextDocument, - session: LiveTailSession, - timer: NodeJS.Timer + session: LiveTailSession ) { try { for await (const event of stream) { @@ -100,8 +97,21 @@ async function handleSessionStream( session.isSampled = isSampled(event.sessionUpdate) } } - } finally { - globals.clock.clearInterval(timer) + } catch (e) { + if (session.isAborted) { + //Expected case. User action cancelled stream (CodeLens, Close Editor, etc.). + //AbortSignal interrupts the LiveTail stream, causing error to be thrown here. + //Can assume that stopLiveTailSession() has already been called - AbortSignal is only + //exposed through that method. + getLogger().info(`Session stopped: ${uriToKey(session.uri)}`) + } else { + //Unexpected exception. + session.stopLiveTailSession() + throw ToolkitError.chain( + e, + `Unexpected on-stream exception while tailing session: ${session.uri.toString()}` + ) + } } } @@ -196,13 +206,12 @@ function hideShowStatusBarItemsOnActiveEditor(session: LiveTailSession, document function registerTabChangeCallback( session: LiveTailSession, registry: LiveTailSessionRegistry, - document: vscode.TextDocument, - timer: NodeJS.Timer + document: vscode.TextDocument ) { vscode.window.tabGroups.onDidChangeTabs((tabEvent) => { const isOpen = isLiveTailSessionOpenInAnyTab(session) if (!isOpen) { - closeSession(session.uri, registry, timer) + closeSession(session.uri, registry) void clearDocument(document) } }) diff --git a/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts new file mode 100644 index 00000000000..7c7bb1cd74c --- /dev/null +++ b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts @@ -0,0 +1,52 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { cloudwatchLogsLiveTailScheme } from '../../../shared/constants' + +export class LiveTailCodeLensProvider implements vscode.CodeLensProvider { + onDidChangeCodeLenses?: vscode.Event | undefined + + provideCodeLenses( + document: vscode.TextDocument, + token: vscode.CancellationToken + ): vscode.ProviderResult { + const uri = document.uri + if (uri.scheme !== cloudwatchLogsLiveTailScheme) { + return [] + } + const codeLenses: vscode.CodeLens[] = [] + codeLenses.push(this.buildClearDocumentCodeLens(document)) + codeLenses.push(this.buildStopTailingCodeLens(document)) + return codeLenses + } + + private buildClearDocumentCodeLens(document: vscode.TextDocument): vscode.CodeLens { + const range = this.getBottomOfDocumentRange(document) + const command: vscode.Command = { + title: 'Clear document', + command: 'aws.cwl.clearDocument', + arguments: [document], + } + return new vscode.CodeLens(range, command) + } + + private buildStopTailingCodeLens(document: vscode.TextDocument): vscode.CodeLens { + const range = this.getBottomOfDocumentRange(document) + const command: vscode.Command = { + title: 'Stop tailing', + command: 'aws.cwl.stopTailingLogGroup', + arguments: [document], + } + return new vscode.CodeLens(range, command) + } + + private getBottomOfDocumentRange(document: vscode.TextDocument): vscode.Range { + return new vscode.Range( + new vscode.Position(document.lineCount - 1, 0), + new vscode.Position(document.lineCount - 1, 0) + ) + } +} diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index 7e4b64ccc57..f01e389bf3e 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -10,7 +10,7 @@ import { } from '@aws-sdk/client-cloudwatch-logs' import { LogStreamFilterResponse } from '../wizard/liveTailLogStreamSubmenu' import { CloudWatchLogsSettings } from '../cloudWatchLogsUtils' -import { convertToTimeString, Settings, ToolkitError } from '../../../shared' +import { convertToTimeString, globals, Settings, ToolkitError } from '../../../shared' import { createLiveTailURIFromArgs } from './liveTailSessionRegistry' import { getUserAgent } from '../../../shared/telemetry/util' @@ -39,6 +39,9 @@ export class LiveTailSession { private _eventRate: number private _isSampled: boolean + //While session is running, used to update the StatusBar each half second. + private statusBarUpdateTimer: NodeJS.Timer | undefined + static settings = new CloudWatchLogsSettings(Settings.instance) public constructor(configuration: LiveTailSessionConfiguration) { @@ -89,6 +92,10 @@ export class LiveTailSession { } this.startTime = Date.now() this.endTime = undefined + this.statusBarUpdateTimer = globals.clock.setInterval(() => { + this.updateStatusBarItemText() + }, 500) + return commandOutput.responseStream } catch (e) { throw new ToolkitError('Encountered error while trying to start LiveTail session.') @@ -98,6 +105,7 @@ export class LiveTailSession { public stopLiveTailSession() { this.endTime = Date.now() this.statusBarItem.dispose() + globals.clock.clearInterval(this.statusBarUpdateTimer) this.liveTailClient.abortController.abort() this.liveTailClient.cwlClient.destroy() } @@ -145,4 +153,8 @@ export class LiveTailSession { const sampledString = this._isSampled ? 'Yes' : 'No' this.statusBarItem.text = `Tailing: ${timeString}, ${this._eventRate} events/sec, Sampled: ${sampledString}` } + + public get isAborted() { + return this.liveTailClient.abortController.signal.aborted + } } diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts index 2fcb2731a9c..3d5bc5c59a8 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode' import { cloudwatchLogsLiveTailScheme } from '../../../shared/constants' import { LiveTailSession, LiveTailSessionConfiguration } from './liveTailSession' -export class LiveTailSessionRegistry extends Map { +export class LiveTailSessionRegistry extends Map { static #instance: LiveTailSessionRegistry public static get instance() { diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index 2a5897db4cc..e364c70ce34 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -18,7 +18,7 @@ import { TailLogGroupWizardResponse, } from '../../../../awsService/cloudWatchLogs/wizard/tailLogGroupWizard' import { getTestWindow } from '../../../shared/vscode/window' -import { CloudWatchLogsSettings } from '../../../../awsService/cloudWatchLogs/cloudWatchLogsUtils' +import { CloudWatchLogsSettings, uriToKey } from '../../../../awsService/cloudWatchLogs/cloudWatchLogsUtils' import { installFakeClock } from '../../../testUtil' describe('TailLogGroup', function () { @@ -125,15 +125,14 @@ describe('TailLogGroup', function () { .callsFake(async function () { return }) - // const fakeClock = installFakeClock() - const timer = setInterval(() => {}, 1000) + const session = new LiveTailSession({ logGroupName: testLogGroup, region: testRegion, }) - registry.set(session.uri, session) + registry.set(uriToKey(session.uri), session) - closeSession(session.uri, registry, timer) + closeSession(session.uri, registry) assert.strictEqual(0, registry.size) assert.strictEqual(true, stopLiveTailSessionSpy.calledOnce) assert.strictEqual(0, clock.countTimers()) From ca25202dd2f76f25acaa44a798f8012616aa17fd Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Mon, 11 Nov 2024 13:46:02 -0800 Subject: [PATCH 11/22] fix(cwl): remove unnecessary catch and rethrow for pre-stream (#5976) ## Problem Exceptions can occur pre-stream (the synchronous portion of a StartLiveTail call that establishes the streaming connection). Currently, we are calling StartLiveTail in a try-catch, catching errrors, and throwing them as a ToolkitException. These are not chaining the root exception. This means when an error occurs, its root cause is being swallowed - causing user's to not know *why* their LiveTall command is failing. ## Solution Given that we are just rethrowing `err`. There's probably no point to this catch. Removing it, and letting the root exception throw. Forced pre-stream exception to throw with an IAM permission violation and this change applied. More clear as to what the actual problem is: Pop-up: `Failed to run command: aws.cwl.tailLogGroup: User: arn:aws:sts::203607498903:assumed-role/NoLiveTail/keegani-Isengard is not authorized to perform: logs:StartLiveTail on resource: arn:aws:logs:us-east-1:203607498903:log-group:/aws/codebuild/BATSSandboxCodeBuildPr-bf0a23097fbc3948a2c5b26f1616f7d32b622cba because no identity-based policy allows the logs:StartLiveTail action` Full log: ``` 2024-11-11 13:00:04.310 [error] aws.cwl.tailLogGroup: [AccessDeniedException: User: arn:aws:sts::203607498903:assumed-role/NoLiveTail/keegani-Isengard is not authorized to perform: logs:StartLiveTail on resource: arn:aws:logs:us-east-1:203607498903:log-group:/aws/codebuild/BATSSandboxCodeBuildPr-bf0a23097fbc3948a2c5b26f1616f7d32b622cba because no identity-based policy allows the logs:StartLiveTail action at de_AccessDeniedExceptionRes (/Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/node_modules/@aws-sdk/client-cloudwatch-logs/dist-cjs/index.js:2249:21) at de_CommandError (/Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/node_modules/@aws-sdk/client-cloudwatch-logs/dist-cjs/index.js:2203:19) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async /Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/middleware-serde/dist-cjs/index.js:35:20 at async /Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/node_modules/@smithy/core/dist-cjs/index.js:168:18 at async /Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/middleware-retry/dist-cjs/index.js:320:38 at async /Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-logger/dist-cjs/index.js:34:22 at async LiveTailSession.startLiveTailSession (/Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/packages/core/dist/src/awsService/cloudWatchLogs/registry/liveTailSession.js:70:31) at async tailLogGroup (/Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/packages/core/dist/src/awsService/cloudWatchLogs/commands/tailLogGroup.js:58:20) at async /Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/packages/core/dist/src/awsService/cloudWatchLogs/activation.js:91:9 at async runCommand (/Users/keegani/workplace/aws-toolkit-vscode-release/aws-toolkit-vscode/packages/core/dist/src/shared/vscode/commands2.js:445:16) at async Y0.h (file:///Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js:114:32825)] { '$fault': 'client', '$metadata': [Object], __type: 'AccessDeniedException' } ``` --- License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Keegan Irby --- .../registry/liveTailSession.ts | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index f01e389bf3e..bb9aafe68db 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -82,24 +82,18 @@ export class LiveTailSession { } public async startLiveTailSession(): Promise> { - const command = this.buildStartLiveTailCommand() - try { - const commandOutput = await this.liveTailClient.cwlClient.send(command, { - abortSignal: this.liveTailClient.abortController.signal, - }) - if (!commandOutput.responseStream) { - throw new ToolkitError('LiveTail session response stream is undefined.') - } - this.startTime = Date.now() - this.endTime = undefined - this.statusBarUpdateTimer = globals.clock.setInterval(() => { - this.updateStatusBarItemText() - }, 500) - - return commandOutput.responseStream - } catch (e) { - throw new ToolkitError('Encountered error while trying to start LiveTail session.') + const commandOutput = await this.liveTailClient.cwlClient.send(this.buildStartLiveTailCommand(), { + abortSignal: this.liveTailClient.abortController.signal, + }) + if (!commandOutput.responseStream) { + throw new ToolkitError('LiveTail session response stream is undefined.') } + this.startTime = Date.now() + this.endTime = undefined + this.statusBarUpdateTimer = globals.clock.setInterval(() => { + this.updateStatusBarItemText() + }, 500) + return commandOutput.responseStream } public stopLiveTailSession() { From 5b80409542fd04411fbb9148537aac4a6c07bcf1 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Tue, 12 Nov 2024 13:34:03 -0800 Subject: [PATCH 12/22] fix(cwl): LiveTail fails to start when clicking with Play next to a LogGroup #5986 ## Problem Starting a LiveTail session by clicking Play next to a specific LogGroup in the explorer menu is failing. This is because the LogGroup name is passed into the Wizard response, and not a fully qualified Arn. StartLiveTail API request requires ARNs. ## Solution Detect if the context when initializing the TailLogGroup wizard is a LogGroup Name or Arn. If it is just a name, construct the Arn and set that in the Wizard response. Renames `LogGroupName` in `LiveTailSession` to `LogGroupArn` to make it more clear what is expected. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 2 +- .../registry/liveTailSession.ts | 17 ++++++----- .../registry/liveTailSessionRegistry.ts | 2 +- .../wizard/tailLogGroupWizard.ts | 17 +++++++++-- .../commands/tailLogGroup.test.ts | 7 +++-- .../registry/liveTailRegistry.test.ts | 12 ++++---- .../wizard/tailLogGroupWizard.test.ts | 30 +++++++++++++++++-- 7 files changed, 64 insertions(+), 23 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 74ac67fca33..6a41025be71 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -27,7 +27,7 @@ export async function tailLogGroup( } const liveTailSessionConfig: LiveTailSessionConfiguration = { - logGroupName: wizardResponse.regionLogGroupSubmenuResponse.data, + logGroupArn: wizardResponse.regionLogGroupSubmenuResponse.data, logStreamFilter: wizardResponse.logStreamFilter, logEventFilterPattern: wizardResponse.filterPattern, region: wizardResponse.regionLogGroupSubmenuResponse.region, diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index bb9aafe68db..e1e67be2a0b 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -9,13 +9,13 @@ import { StartLiveTailResponseStream, } from '@aws-sdk/client-cloudwatch-logs' import { LogStreamFilterResponse } from '../wizard/liveTailLogStreamSubmenu' -import { CloudWatchLogsSettings } from '../cloudWatchLogsUtils' -import { convertToTimeString, globals, Settings, ToolkitError } from '../../../shared' +import { CloudWatchLogsSettings, uriToKey } from '../cloudWatchLogsUtils' +import { convertToTimeString, getLogger, globals, Settings, ToolkitError } from '../../../shared' import { createLiveTailURIFromArgs } from './liveTailSessionRegistry' import { getUserAgent } from '../../../shared/telemetry/util' export type LiveTailSessionConfiguration = { - logGroupName: string + logGroupArn: string logStreamFilter?: LogStreamFilterResponse logEventFilterPattern?: string region: string @@ -28,7 +28,7 @@ export type LiveTailSessionClient = { export class LiveTailSession { private liveTailClient: LiveTailSessionClient - private _logGroupName: string + private _logGroupArn: string private logStreamFilter?: LogStreamFilterResponse private logEventFilterPattern?: string private _maxLines: number @@ -45,7 +45,7 @@ export class LiveTailSession { static settings = new CloudWatchLogsSettings(Settings.instance) public constructor(configuration: LiveTailSessionConfiguration) { - this._logGroupName = configuration.logGroupName + this._logGroupArn = configuration.logGroupArn this.logStreamFilter = configuration.logStreamFilter this.liveTailClient = { cwlClient: new CloudWatchLogsClient({ @@ -69,8 +69,8 @@ export class LiveTailSession { return this._uri } - public get logGroupName() { - return this._logGroupName + public get logGroupArn() { + return this._logGroupArn } public set eventRate(rate: number) { @@ -93,6 +93,7 @@ export class LiveTailSession { this.statusBarUpdateTimer = globals.clock.setInterval(() => { this.updateStatusBarItemText() }, 500) + getLogger().info(`LiveTail session started: ${uriToKey(this.uri)}`) return commandOutput.responseStream } @@ -130,7 +131,7 @@ export class LiveTailSession { } return new StartLiveTailCommand({ - logGroupIdentifiers: [this.logGroupName], + logGroupIdentifiers: [this.logGroupArn], logStreamNamePrefixes: logStreamNamePrefix ? [logStreamNamePrefix] : undefined, logStreamNames: logStreamName ? [logStreamName] : undefined, logEventFilterPattern: this.logEventFilterPattern ? this.logEventFilterPattern : undefined, diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts index 3d5bc5c59a8..988725edc87 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSessionRegistry.ts @@ -19,7 +19,7 @@ export class LiveTailSessionRegistry extends Map { } export function createLiveTailURIFromArgs(sessionData: LiveTailSessionConfiguration): vscode.Uri { - let uriStr = `${cloudwatchLogsLiveTailScheme}:${sessionData.region}:${sessionData.logGroupName}` + let uriStr = `${cloudwatchLogsLiveTailScheme}:${sessionData.region}:${sessionData.logGroupArn}` if (sessionData.logStreamFilter) { if (sessionData.logStreamFilter.type !== 'all') { diff --git a/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts b/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts index c0ba4bdc3af..cc07bc71961 100644 --- a/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts +++ b/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts @@ -4,7 +4,7 @@ */ import * as nls from 'vscode-nls' -import { ToolkitError } from '../../../shared' +import { globals, ToolkitError } from '../../../shared' import { DefaultCloudWatchLogsClient } from '../../../shared/clients/cloudWatchLogsClient' import { cwlFilterPatternHelpUrl } from '../../../shared/constants' import { createBackButton, createExitButton, createHelpButton } from '../../../shared/ui/buttons' @@ -29,7 +29,7 @@ export class TailLogGroupWizard extends Wizard { initState: { regionLogGroupSubmenuResponse: logGroupInfo ? { - data: logGroupInfo.groupName, + data: buildLogGroupArn(logGroupInfo.groupName, logGroupInfo.regionName), region: logGroupInfo.regionName, } : undefined, @@ -81,6 +81,19 @@ async function getLogGroupQuickPickOptions(regionCode: string): Promise Date: Wed, 13 Nov 2024 12:09:28 -0800 Subject: [PATCH 13/22] fix(cwl): pass credentials to LiveTail client #5993 ## Problem When creating the CloudWatchClient for a LiveTail session, we are not specifying which credentials to use. This is causing the client to always use the `Default` credential profile, even if a different AWS Credential profile is selected within AWSToolkit. ## Solution Resolve the active AWS credential from `globals.awsContext`, and supply that to the LiveTailSession constructor. These credentials are then use to construct the CWL client. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 8 ++++++-- .../registry/liveTailSession.ts | 3 +++ .../commands/tailLogGroup.test.ts | 20 ++++++++++++++++++- .../registry/liveTailRegistry.test.ts | 7 +++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 6a41025be71..f0ad31eb0fb 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -13,7 +13,7 @@ import { LiveTailSessionUpdate, StartLiveTailResponseStream, } from '@aws-sdk/client-cloudwatch-logs' -import { getLogger, ToolkitError } from '../../../shared' +import { getLogger, globals, ToolkitError } from '../../../shared' import { uriToKey } from '../cloudWatchLogsUtils' export async function tailLogGroup( @@ -25,12 +25,16 @@ export async function tailLogGroup( if (!wizardResponse) { throw new CancellationError('user') } - + const awsCredentials = await globals.awsContext.getCredentials() + if (awsCredentials === undefined) { + throw new ToolkitError('Failed to start LiveTail session: credentials are undefined.') + } const liveTailSessionConfig: LiveTailSessionConfiguration = { logGroupArn: wizardResponse.regionLogGroupSubmenuResponse.data, logStreamFilter: wizardResponse.logStreamFilter, logEventFilterPattern: wizardResponse.filterPattern, region: wizardResponse.regionLogGroupSubmenuResponse.region, + awsCredentials: awsCredentials, } const session = new LiveTailSession(liveTailSessionConfig) if (registry.has(uriToKey(session.uri))) { diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index e1e67be2a0b..3efbc349cf5 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ import * as vscode from 'vscode' +import * as AWS from '@aws-sdk/types' import { CloudWatchLogsClient, StartLiveTailCommand, @@ -19,6 +20,7 @@ export type LiveTailSessionConfiguration = { logStreamFilter?: LogStreamFilterResponse logEventFilterPattern?: string region: string + awsCredentials: AWS.Credentials } export type LiveTailSessionClient = { @@ -49,6 +51,7 @@ export class LiveTailSession { this.logStreamFilter = configuration.logStreamFilter this.liveTailClient = { cwlClient: new CloudWatchLogsClient({ + credentials: configuration.awsCredentials, region: configuration.region, customUserAgent: getUserAgent(), }), diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index e6a8dff30aa..56819d86a8a 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -20,13 +20,14 @@ import { import { getTestWindow } from '../../../shared/vscode/window' import { CloudWatchLogsSettings, uriToKey } from '../../../../awsService/cloudWatchLogs/cloudWatchLogsUtils' import { installFakeClock } from '../../../testUtil' -import { DefaultAwsContext } from '../../../../shared' +import { DefaultAwsContext, ToolkitError } from '../../../../shared' describe('TailLogGroup', function () { const testLogGroup = 'test-log-group' const testRegion = 'test-region' const testMessage = 'test-message' const testAwsAccountId = '1234' + const testAwsCredentials = {} as any as AWS.Credentials let sandbox: sinon.SinonSandbox let registry: LiveTailSessionRegistry @@ -57,6 +58,8 @@ describe('TailLogGroup', function () { it('starts LiveTailSession and writes to document. Closes tab and asserts session gets closed.', async function () { sandbox.stub(DefaultAwsContext.prototype, 'getCredentialAccountId').returns(testAwsAccountId) + sandbox.stub(DefaultAwsContext.prototype, 'getCredentials').returns(Promise.resolve(testAwsCredentials)) + wizardSpy = sandbox.stub(TailLogGroupWizard.prototype, 'run').callsFake(async function () { return getTestWizardResponse() }) @@ -122,6 +125,19 @@ describe('TailLogGroup', function () { assert.strictEqual(stopLiveTailSessionSpy.calledOnce, true) }) + it('throws if crendentials are undefined', async function () { + sandbox.stub(DefaultAwsContext.prototype, 'getCredentials').returns(Promise.resolve(undefined)) + wizardSpy = sandbox.stub(TailLogGroupWizard.prototype, 'run').callsFake(async function () { + return getTestWizardResponse() + }) + await assert.rejects(async () => { + await tailLogGroup(registry, { + groupName: testLogGroup, + regionName: testRegion, + }) + }, ToolkitError) + }) + it('closeSession removes session from registry and calls underlying stopLiveTailSession function.', function () { stopLiveTailSessionSpy = sandbox .stub(LiveTailSession.prototype, 'stopLiveTailSession') @@ -132,6 +148,7 @@ describe('TailLogGroup', function () { const session = new LiveTailSession({ logGroupArn: testLogGroup, region: testRegion, + awsCredentials: testAwsCredentials, }) registry.set(uriToKey(session.uri), session) @@ -145,6 +162,7 @@ describe('TailLogGroup', function () { const session = new LiveTailSession({ logGroupArn: testLogGroup, region: testRegion, + awsCredentials: testAwsCredentials, }) const testData = 'blah blah blah' const document = await vscode.workspace.openTextDocument(session.uri) diff --git a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts index 63cd5867998..1aeeec9e6ae 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailRegistry.test.ts @@ -11,12 +11,14 @@ import { cloudwatchLogsLiveTailScheme } from '../../../../shared/constants' describe('LiveTailSession URI', async function () { const testLogGroupName = 'test-log-group' const testRegion = 'test-region' + const testAwsCredentials = {} as any as AWS.Credentials const expectedUriBase = `${cloudwatchLogsLiveTailScheme}:${testRegion}:${testLogGroupName}` it('is correct with no logStream filter, no filter pattern', function () { const config: LiveTailSessionConfiguration = { logGroupArn: testLogGroupName, region: testRegion, + awsCredentials: testAwsCredentials, } const expectedUri = vscode.Uri.parse(expectedUriBase) const uri = createLiveTailURIFromArgs(config) @@ -28,6 +30,7 @@ describe('LiveTailSession URI', async function () { logGroupArn: testLogGroupName, region: testRegion, logEventFilterPattern: 'test-filter', + awsCredentials: testAwsCredentials, } const expectedUri = vscode.Uri.parse(`${expectedUriBase}:test-filter`) const uri = createLiveTailURIFromArgs(config) @@ -41,6 +44,7 @@ describe('LiveTailSession URI', async function () { logStreamFilter: { type: 'all', }, + awsCredentials: testAwsCredentials, } const expectedUri = vscode.Uri.parse(`${expectedUriBase}:all`) const uri = createLiveTailURIFromArgs(config) @@ -55,6 +59,7 @@ describe('LiveTailSession URI', async function () { type: 'prefix', filter: 'test-prefix', }, + awsCredentials: testAwsCredentials, } const expectedUri = vscode.Uri.parse(`${expectedUriBase}:prefix:test-prefix`) const uri = createLiveTailURIFromArgs(config) @@ -69,6 +74,7 @@ describe('LiveTailSession URI', async function () { type: 'specific', filter: 'test-stream', }, + awsCredentials: testAwsCredentials, } const expectedUri = vscode.Uri.parse(`${expectedUriBase}:specific:test-stream`) const uri = createLiveTailURIFromArgs(config) @@ -84,6 +90,7 @@ describe('LiveTailSession URI', async function () { filter: 'test-stream', }, logEventFilterPattern: 'test-filter', + awsCredentials: testAwsCredentials, } const expectedUri = vscode.Uri.parse(`${expectedUriBase}:specific:test-stream:test-filter`) const uri = createLiveTailURIFromArgs(config) From d56a8ac57265af6ff5fad1343b347fd97907afab Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Wed, 13 Nov 2024 15:29:38 -0800 Subject: [PATCH 14/22] fix(cwl): set LogEventFilter when constructing LiveTailSession #6008 ## Problem LogEventFilter is an optional configuration parameter when building a LiveTailSession. Currently, the Constructor is not actually setting this property so it is always undefined. This means that if a user sets a Filter pattern, it will not be applied. ## Solution Set the property in LiveTailSession Constructor. Add missing unit tests to validate that LiveTailSession config values are set properly. Testing via `buildStartLiveTailCommand` because this is what actually gets sent to the CWL backend to start a LiveTailSession. --- .../registry/liveTailSession.ts | 6 +- .../registry/liveTailSession.test.ts | 80 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index 3efbc349cf5..329da2f6f54 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -11,9 +11,10 @@ import { } from '@aws-sdk/client-cloudwatch-logs' import { LogStreamFilterResponse } from '../wizard/liveTailLogStreamSubmenu' import { CloudWatchLogsSettings, uriToKey } from '../cloudWatchLogsUtils' -import { convertToTimeString, getLogger, globals, Settings, ToolkitError } from '../../../shared' +import { getLogger, globals, Settings, ToolkitError } from '../../../shared' import { createLiveTailURIFromArgs } from './liveTailSessionRegistry' import { getUserAgent } from '../../../shared/telemetry/util' +import { convertToTimeString } from '../../../shared/datetime' export type LiveTailSessionConfiguration = { logGroupArn: string @@ -49,6 +50,7 @@ export class LiveTailSession { public constructor(configuration: LiveTailSessionConfiguration) { this._logGroupArn = configuration.logGroupArn this.logStreamFilter = configuration.logStreamFilter + this.logEventFilterPattern = configuration.logEventFilterPattern this.liveTailClient = { cwlClient: new CloudWatchLogsClient({ credentials: configuration.awsCredentials, @@ -120,7 +122,7 @@ export class LiveTailSession { return this.endTime - this.startTime } - private buildStartLiveTailCommand(): StartLiveTailCommand { + public buildStartLiveTailCommand(): StartLiveTailCommand { let logStreamNamePrefix = undefined let logStreamName = undefined if (this.logStreamFilter) { diff --git a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts new file mode 100644 index 00000000000..07bab07983a --- /dev/null +++ b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts @@ -0,0 +1,80 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ +import assert from 'assert' +import { LiveTailSession } from '../../../../awsService/cloudWatchLogs/registry/liveTailSession' +import { StartLiveTailCommand } from '@aws-sdk/client-cloudwatch-logs' +import { LogStreamFilterResponse } from '../../../../awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu' + +describe('LiveTailSession', async function () { + const testLogGroupArn = 'arn:aws:test-log-group' + const testRegion = 'test-region' + const testFilter = 'test-filter' + const testAwsCredentials = {} as any as AWS.Credentials + + it('builds StartLiveTailCommand: no stream Filter, no event filter.', function () { + const session = buildLiveTailSession({ type: 'all' }, undefined) + assert.deepStrictEqual( + session.buildStartLiveTailCommand().input, + new StartLiveTailCommand({ + logGroupIdentifiers: [testLogGroupArn], + logEventFilterPattern: undefined, + logStreamNamePrefixes: undefined, + logStreamNames: undefined, + }).input + ) + }) + + it('builds StartLiveTailCommand: with prefix stream Filter', function () { + const session = buildLiveTailSession({ type: 'prefix', filter: testFilter }, undefined) + assert.deepStrictEqual( + session.buildStartLiveTailCommand().input, + new StartLiveTailCommand({ + logGroupIdentifiers: [testLogGroupArn], + logEventFilterPattern: undefined, + logStreamNamePrefixes: [testFilter], + logStreamNames: undefined, + }).input + ) + }) + + it('builds StartLiveTailCommand: with specific stream Filter', function () { + const session = buildLiveTailSession({ type: 'specific', filter: testFilter }, undefined) + assert.deepStrictEqual( + session.buildStartLiveTailCommand().input, + new StartLiveTailCommand({ + logGroupIdentifiers: [testLogGroupArn], + logEventFilterPattern: undefined, + logStreamNamePrefixes: undefined, + logStreamNames: [testFilter], + }).input + ) + }) + + it('builds StartLiveTailCommand: with log event Filter', function () { + const session = buildLiveTailSession({ type: 'all' }, testFilter) + assert.deepStrictEqual( + session.buildStartLiveTailCommand().input, + new StartLiveTailCommand({ + logGroupIdentifiers: [testLogGroupArn], + logEventFilterPattern: testFilter, + logStreamNamePrefixes: undefined, + logStreamNames: undefined, + }).input + ) + }) + + function buildLiveTailSession( + logStreamFilter: LogStreamFilterResponse, + logEventFilterPattern: string | undefined + ): LiveTailSession { + return new LiveTailSession({ + logGroupArn: testLogGroupArn, + logStreamFilter: logStreamFilter, + logEventFilterPattern: logEventFilterPattern, + region: testRegion, + awsCredentials: testAwsCredentials, + }) + } +}) From 1e3fdcec07bb994d3e6abff13a1d5aa1da32fe01 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Wed, 20 Nov 2024 05:59:18 -0800 Subject: [PATCH 15/22] feat(cwl): Emit telemetry when starting and stopping liveTail sessions (#6047) ## Problem Cloudwatch wants to monitor usage metrics of the LiveTail integration ## Solution When starting a session emit telemetry for: * Session already started (this case happens when session is already running, and customer sends a new command that matches the already running session) * Has LogEventFilter * LogStream filter type * Source of the command (command palette, explorer) When closing a session: * Session duration * source of cancellation (ex: CodeLens, ClosingEditors) --- License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Keegan Irby --- package-lock.json | 8 +- package.json | 2 +- .../awsService/cloudWatchLogs/activation.ts | 7 +- .../cloudWatchLogs/commands/tailLogGroup.ts | 93 ++++++++++++------- .../document/liveTailCodeLensProvider.ts | 2 +- .../commands/tailLogGroup.test.ts | 7 +- 6 files changed, 72 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index a8110fbb3b1..1bb2e1050ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "vscode-nls-dev": "^4.0.4" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.282", + "@aws-toolkits/telemetry": "^1.0.284", "@playwright/browser-chromium": "^1.43.1", "@types/he": "^1.2.3", "@types/vscode": "^1.68.0", @@ -6046,9 +6046,9 @@ } }, "node_modules/@aws-toolkits/telemetry": { - "version": "1.0.282", - "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.282.tgz", - "integrity": "sha512-MHktYmucYHvEm4Sscr93UmKr83D9pKJIvETo1bZiNtCsE0jxcNglxZwqZruy13Fks5uk523ZhaIALW22TF0Zpg==", + "version": "1.0.284", + "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.284.tgz", + "integrity": "sha512-+3uHmr4St2cw8yuvVZOUY4Recv0wmzendGODCeUPIIUjsjCANF3H7G/qzIKRN3BHCoedcvzA/eSI+l4ENRXtiA==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/package.json b/package.json index 70f9d0f4c35..bc03c2b8395 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "generateNonCodeFiles": "npm run generateNonCodeFiles -w packages/ --if-present" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.282", + "@aws-toolkits/telemetry": "^1.0.284", "@playwright/browser-chromium": "^1.43.1", "@types/he": "^1.2.3", "@types/vscode": "^1.68.0", diff --git a/packages/core/src/awsService/cloudWatchLogs/activation.ts b/packages/core/src/awsService/cloudWatchLogs/activation.ts index de75d9e72a4..e0766ed7f5b 100644 --- a/packages/core/src/awsService/cloudWatchLogs/activation.ts +++ b/packages/core/src/awsService/cloudWatchLogs/activation.ts @@ -120,11 +120,12 @@ export async function activate(context: vscode.ExtensionContext, configuration: node instanceof LogGroupNode ? { regionName: node.regionCode, groupName: node.logGroup.logGroupName! } : undefined - await tailLogGroup(liveTailRegistry, logGroupInfo) + const source = node ? (logGroupInfo ? 'ExplorerLogGroupNode' : 'ExplorerServiceNode') : 'Command' + await tailLogGroup(liveTailRegistry, source, logGroupInfo) }), - Commands.register('aws.cwl.stopTailingLogGroup', async (document: vscode.TextDocument) => { - closeSession(document.uri, liveTailRegistry) + Commands.register('aws.cwl.stopTailingLogGroup', async (document: vscode.TextDocument, source: string) => { + closeSession(document.uri, liveTailRegistry, source) }), Commands.register('aws.cwl.clearDocument', async (document: vscode.TextDocument) => { diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index f0ad31eb0fb..c96d33dc15f 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -4,6 +4,7 @@ */ import * as vscode from 'vscode' +import { telemetry } from '../../../shared/telemetry/telemetry' import { TailLogGroupWizard } from '../wizard/tailLogGroupWizard' import { CancellationError } from '../../../shared/utilities/timeoutUtils' import { LiveTailSession, LiveTailSessionConfiguration } from '../registry/liveTailSession' @@ -18,48 +19,70 @@ import { uriToKey } from '../cloudWatchLogsUtils' export async function tailLogGroup( registry: LiveTailSessionRegistry, + source: string, logData?: { regionName: string; groupName: string } ): Promise { - const wizard = new TailLogGroupWizard(logData) - const wizardResponse = await wizard.run() - if (!wizardResponse) { - throw new CancellationError('user') - } - const awsCredentials = await globals.awsContext.getCredentials() - if (awsCredentials === undefined) { - throw new ToolkitError('Failed to start LiveTail session: credentials are undefined.') - } - const liveTailSessionConfig: LiveTailSessionConfiguration = { - logGroupArn: wizardResponse.regionLogGroupSubmenuResponse.data, - logStreamFilter: wizardResponse.logStreamFilter, - logEventFilterPattern: wizardResponse.filterPattern, - region: wizardResponse.regionLogGroupSubmenuResponse.region, - awsCredentials: awsCredentials, - } - const session = new LiveTailSession(liveTailSessionConfig) - if (registry.has(uriToKey(session.uri))) { - await prepareDocument(session) - return - } - registry.set(uriToKey(session.uri), session) + await telemetry.cwlLiveTail_Start.run(async (span) => { + const wizard = new TailLogGroupWizard(logData) + const wizardResponse = await wizard.run() + if (!wizardResponse) { + throw new CancellationError('user') + } + const awsCredentials = await globals.awsContext.getCredentials() + if (awsCredentials === undefined) { + throw new ToolkitError('Failed to start LiveTail session: credentials are undefined.') + } + const liveTailSessionConfig: LiveTailSessionConfiguration = { + logGroupArn: wizardResponse.regionLogGroupSubmenuResponse.data, + logStreamFilter: wizardResponse.logStreamFilter, + logEventFilterPattern: wizardResponse.filterPattern, + region: wizardResponse.regionLogGroupSubmenuResponse.region, + awsCredentials: awsCredentials, + } + const session = new LiveTailSession(liveTailSessionConfig) + if (registry.has(uriToKey(session.uri))) { + await prepareDocument(session) + span.record({ + result: 'Succeeded', + sessionAlreadyStarted: true, + source: source, + }) + return + } - const document = await prepareDocument(session) + registry.set(uriToKey(session.uri), session) - hideShowStatusBarItemsOnActiveEditor(session, document) - registerTabChangeCallback(session, registry, document) + const document = await prepareDocument(session) - const stream = await session.startLiveTailSession() + hideShowStatusBarItemsOnActiveEditor(session, document) + registerTabChangeCallback(session, registry, document) - await handleSessionStream(stream, document, session) + const stream = await session.startLiveTailSession() + span.record({ + source: source, + result: 'Succeeded', + sessionAlreadyStarted: false, + hasLogEventFilterPattern: Boolean(wizardResponse.filterPattern), + logStreamFilterType: wizardResponse.logStreamFilter.type, + }) + await handleSessionStream(stream, document, session) + }) } -export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry) { - const session = registry.get(uriToKey(sessionUri)) - if (session === undefined) { - throw new ToolkitError(`No LiveTail session found for URI: ${sessionUri.toString()}`) - } - session.stopLiveTailSession() - registry.delete(uriToKey(sessionUri)) +export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry, source: string) { + telemetry.cwlLiveTail_Stop.run((span) => { + const session = registry.get(uriToKey(sessionUri)) + if (session === undefined) { + throw new ToolkitError(`No LiveTail session found for URI: ${sessionUri.toString()}`) + } + session.stopLiveTailSession() + registry.delete(uriToKey(sessionUri)) + span.record({ + result: 'Succeeded', + source: source, + duration: session.getLiveTailSessionDuration(), + }) + }) } export async function clearDocument(textDocument: vscode.TextDocument) { @@ -215,7 +238,7 @@ function registerTabChangeCallback( vscode.window.tabGroups.onDidChangeTabs((tabEvent) => { const isOpen = isLiveTailSessionOpenInAnyTab(session) if (!isOpen) { - closeSession(session.uri, registry) + closeSession(session.uri, registry, 'ClosedEditors') void clearDocument(document) } }) diff --git a/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts index 7c7bb1cd74c..0e4edcf52aa 100644 --- a/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts +++ b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts @@ -38,7 +38,7 @@ export class LiveTailCodeLensProvider implements vscode.CodeLensProvider { const command: vscode.Command = { title: 'Stop tailing', command: 'aws.cwl.stopTailingLogGroup', - arguments: [document], + arguments: [document, 'codeLens'], } return new vscode.CodeLens(range, command) } diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index 56819d86a8a..90accf47711 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -27,6 +27,7 @@ describe('TailLogGroup', function () { const testRegion = 'test-region' const testMessage = 'test-message' const testAwsAccountId = '1234' + const testSource = 'test-source' const testAwsCredentials = {} as any as AWS.Credentials let sandbox: sinon.SinonSandbox @@ -93,7 +94,7 @@ describe('TailLogGroup', function () { cloudwatchSettingsSpy = sandbox.stub(CloudWatchLogsSettings.prototype, 'get').callsFake(() => { return 1 }) - await tailLogGroup(registry, { + await tailLogGroup(registry, testSource, { groupName: testLogGroup, regionName: testRegion, }) @@ -131,7 +132,7 @@ describe('TailLogGroup', function () { return getTestWizardResponse() }) await assert.rejects(async () => { - await tailLogGroup(registry, { + await tailLogGroup(registry, testSource, { groupName: testLogGroup, regionName: testRegion, }) @@ -152,7 +153,7 @@ describe('TailLogGroup', function () { }) registry.set(uriToKey(session.uri), session) - closeSession(session.uri, registry) + closeSession(session.uri, registry, testSource) assert.strictEqual(0, registry.size) assert.strictEqual(true, stopLiveTailSessionSpy.calledOnce) assert.strictEqual(0, clock.countTimers()) From aceebe1267f75b6fdcc12c7f9868635e5286ca7d Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Wed, 20 Nov 2024 10:36:58 -0800 Subject: [PATCH 16/22] fix(cwl): Hide LiveTail CodeLenses and display info message when closing session (#6063) ## Problem Currently after closing a session in a way that leaves the TextDocument open (`Stop tailing` CodeLens), the codeLenses remain visible. This means a user could click `Stop tailing` again, and receive an error for not being able to find the running LiveTail session for the given document. Additionally, there is no feedback when a session is closed. Clicking `Stop tailing` doesn't signal to the user that the session was actually stopped. ## Solution * Provide a `refresh` method in the LiveTail CodeLens provider. This fires an event to force recomputing the CodeLenses on a document. * Modify LiveTail Lens provider to return no Lenses if the session is not running (in the registry) * Display an information window when a Session is stopped * Changes wording/placement on some log statements for consistency. --- .../awsService/cloudWatchLogs/activation.ts | 8 +++---- .../cloudWatchLogs/commands/tailLogGroup.ts | 24 ++++++++++++++----- .../document/liveTailCodeLensProvider.ts | 16 ++++++++++--- .../registry/liveTailSession.ts | 5 ++-- .../commands/tailLogGroup.test.ts | 9 ++++--- 5 files changed, 43 insertions(+), 19 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/activation.ts b/packages/core/src/awsService/cloudWatchLogs/activation.ts index e0766ed7f5b..bfcaaf1d0e2 100644 --- a/packages/core/src/awsService/cloudWatchLogs/activation.ts +++ b/packages/core/src/awsService/cloudWatchLogs/activation.ts @@ -34,7 +34,7 @@ export async function activate(context: vscode.ExtensionContext, configuration: const documentProvider = new LogDataDocumentProvider(registry) const liveTailDocumentProvider = new LiveTailDocumentProvider() - + const liveTailCodeLensProvider = new LiveTailCodeLensProvider(liveTailRegistry) context.subscriptions.push( vscode.languages.registerCodeLensProvider( { @@ -55,7 +55,7 @@ export async function activate(context: vscode.ExtensionContext, configuration: language: 'log', scheme: cloudwatchLogsLiveTailScheme, }, - new LiveTailCodeLensProvider() + liveTailCodeLensProvider ) ) @@ -121,11 +121,11 @@ export async function activate(context: vscode.ExtensionContext, configuration: ? { regionName: node.regionCode, groupName: node.logGroup.logGroupName! } : undefined const source = node ? (logGroupInfo ? 'ExplorerLogGroupNode' : 'ExplorerServiceNode') : 'Command' - await tailLogGroup(liveTailRegistry, source, logGroupInfo) + await tailLogGroup(liveTailRegistry, source, liveTailCodeLensProvider, logGroupInfo) }), Commands.register('aws.cwl.stopTailingLogGroup', async (document: vscode.TextDocument, source: string) => { - closeSession(document.uri, liveTailRegistry, source) + closeSession(document.uri, liveTailRegistry, source, liveTailCodeLensProvider) }), Commands.register('aws.cwl.clearDocument', async (document: vscode.TextDocument) => { diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index c96d33dc15f..21b3b9ea8d7 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -16,10 +16,12 @@ import { } from '@aws-sdk/client-cloudwatch-logs' import { getLogger, globals, ToolkitError } from '../../../shared' import { uriToKey } from '../cloudWatchLogsUtils' +import { LiveTailCodeLensProvider } from '../document/liveTailCodeLensProvider' export async function tailLogGroup( registry: LiveTailSessionRegistry, source: string, + codeLensProvider: LiveTailCodeLensProvider, logData?: { regionName: string; groupName: string } ): Promise { await telemetry.cwlLiveTail_Start.run(async (span) => { @@ -55,9 +57,11 @@ export async function tailLogGroup( const document = await prepareDocument(session) hideShowStatusBarItemsOnActiveEditor(session, document) - registerTabChangeCallback(session, registry, document) + registerTabChangeCallback(session, registry, document, codeLensProvider) const stream = await session.startLiveTailSession() + getLogger().info(`LiveTail session started: ${uriToKey(session.uri)}`) + span.record({ source: source, result: 'Succeeded', @@ -69,14 +73,21 @@ export async function tailLogGroup( }) } -export function closeSession(sessionUri: vscode.Uri, registry: LiveTailSessionRegistry, source: string) { +export function closeSession( + sessionUri: vscode.Uri, + registry: LiveTailSessionRegistry, + source: string, + codeLensProvider: LiveTailCodeLensProvider +) { telemetry.cwlLiveTail_Stop.run((span) => { const session = registry.get(uriToKey(sessionUri)) if (session === undefined) { - throw new ToolkitError(`No LiveTail session found for URI: ${sessionUri.toString()}`) + throw new ToolkitError(`No LiveTail session found for URI: ${uriToKey(sessionUri)}`) } session.stopLiveTailSession() registry.delete(uriToKey(sessionUri)) + void vscode.window.showInformationMessage(`Stopped LiveTail session: ${uriToKey(sessionUri)}`) + codeLensProvider.refresh() span.record({ result: 'Succeeded', source: source, @@ -130,7 +141,7 @@ async function handleSessionStream( //AbortSignal interrupts the LiveTail stream, causing error to be thrown here. //Can assume that stopLiveTailSession() has already been called - AbortSignal is only //exposed through that method. - getLogger().info(`Session stopped: ${uriToKey(session.uri)}`) + getLogger().info(`LiveTail session stopped: ${uriToKey(session.uri)}`) } else { //Unexpected exception. session.stopLiveTailSession() @@ -233,12 +244,13 @@ function hideShowStatusBarItemsOnActiveEditor(session: LiveTailSession, document function registerTabChangeCallback( session: LiveTailSession, registry: LiveTailSessionRegistry, - document: vscode.TextDocument + document: vscode.TextDocument, + codeLensProvider: LiveTailCodeLensProvider ) { vscode.window.tabGroups.onDidChangeTabs((tabEvent) => { const isOpen = isLiveTailSessionOpenInAnyTab(session) if (!isOpen) { - closeSession(session.uri, registry, 'ClosedEditors') + closeSession(session.uri, registry, 'ClosedEditors', codeLensProvider) void clearDocument(document) } }) diff --git a/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts index 0e4edcf52aa..236cd6cad05 100644 --- a/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts +++ b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts @@ -5,16 +5,22 @@ import * as vscode from 'vscode' import { cloudwatchLogsLiveTailScheme } from '../../../shared/constants' +import { LiveTailSessionRegistry } from '../registry/liveTailSessionRegistry' +import { uriToKey } from '../cloudWatchLogsUtils' export class LiveTailCodeLensProvider implements vscode.CodeLensProvider { - onDidChangeCodeLenses?: vscode.Event | undefined + private _onDidChangeCodeLenses: vscode.EventEmitter = new vscode.EventEmitter() + public readonly onDidChangeCodeLenses: vscode.Event = this._onDidChangeCodeLenses.event - provideCodeLenses( + public constructor(private readonly registry: LiveTailSessionRegistry) {} + + public provideCodeLenses( document: vscode.TextDocument, token: vscode.CancellationToken ): vscode.ProviderResult { const uri = document.uri - if (uri.scheme !== cloudwatchLogsLiveTailScheme) { + //if registry does not contain session, it is assumed to have been stopped, thus, hide lenses. + if (uri.scheme !== cloudwatchLogsLiveTailScheme || !this.registry.has(uriToKey(uri))) { return [] } const codeLenses: vscode.CodeLens[] = [] @@ -23,6 +29,10 @@ export class LiveTailCodeLensProvider implements vscode.CodeLensProvider { return codeLenses } + public refresh() { + this._onDidChangeCodeLenses.fire() + } + private buildClearDocumentCodeLens(document: vscode.TextDocument): vscode.CodeLens { const range = this.getBottomOfDocumentRange(document) const command: vscode.Command = { diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index 329da2f6f54..6947fc74459 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -10,8 +10,8 @@ import { StartLiveTailResponseStream, } from '@aws-sdk/client-cloudwatch-logs' import { LogStreamFilterResponse } from '../wizard/liveTailLogStreamSubmenu' -import { CloudWatchLogsSettings, uriToKey } from '../cloudWatchLogsUtils' -import { getLogger, globals, Settings, ToolkitError } from '../../../shared' +import { CloudWatchLogsSettings } from '../cloudWatchLogsUtils' +import { globals, Settings, ToolkitError } from '../../../shared' import { createLiveTailURIFromArgs } from './liveTailSessionRegistry' import { getUserAgent } from '../../../shared/telemetry/util' import { convertToTimeString } from '../../../shared/datetime' @@ -98,7 +98,6 @@ export class LiveTailSession { this.statusBarUpdateTimer = globals.clock.setInterval(() => { this.updateStatusBarItemText() }, 500) - getLogger().info(`LiveTail session started: ${uriToKey(this.uri)}`) return commandOutput.responseStream } diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index 90accf47711..285b380c52d 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -21,6 +21,7 @@ import { getTestWindow } from '../../../shared/vscode/window' import { CloudWatchLogsSettings, uriToKey } from '../../../../awsService/cloudWatchLogs/cloudWatchLogsUtils' import { installFakeClock } from '../../../testUtil' import { DefaultAwsContext, ToolkitError } from '../../../../shared' +import { LiveTailCodeLensProvider } from '../../../../awsService/cloudWatchLogs/document/liveTailCodeLensProvider' describe('TailLogGroup', function () { const testLogGroup = 'test-log-group' @@ -32,6 +33,7 @@ describe('TailLogGroup', function () { let sandbox: sinon.SinonSandbox let registry: LiveTailSessionRegistry + let codeLensProvider: LiveTailCodeLensProvider let startLiveTailSessionSpy: sinon.SinonSpy let stopLiveTailSessionSpy: sinon.SinonSpy let cloudwatchSettingsSpy: sinon.SinonSpy @@ -47,6 +49,7 @@ describe('TailLogGroup', function () { clock.reset() sandbox = sinon.createSandbox() registry = new LiveTailSessionRegistry() + codeLensProvider = new LiveTailCodeLensProvider(registry) }) after(function () { @@ -94,7 +97,7 @@ describe('TailLogGroup', function () { cloudwatchSettingsSpy = sandbox.stub(CloudWatchLogsSettings.prototype, 'get').callsFake(() => { return 1 }) - await tailLogGroup(registry, testSource, { + await tailLogGroup(registry, testSource, codeLensProvider, { groupName: testLogGroup, regionName: testRegion, }) @@ -132,7 +135,7 @@ describe('TailLogGroup', function () { return getTestWizardResponse() }) await assert.rejects(async () => { - await tailLogGroup(registry, testSource, { + await tailLogGroup(registry, testSource, codeLensProvider, { groupName: testLogGroup, regionName: testRegion, }) @@ -153,7 +156,7 @@ describe('TailLogGroup', function () { }) registry.set(uriToKey(session.uri), session) - closeSession(session.uri, registry, testSource) + closeSession(session.uri, registry, testSource, codeLensProvider) assert.strictEqual(0, registry.size) assert.strictEqual(true, stopLiveTailSessionSpy.calledOnce) assert.strictEqual(0, clock.countTimers()) From 63b1cce2a302fd3acfa0149bc6d39afa9f26dee5 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Thu, 21 Nov 2024 15:47:02 -0800 Subject: [PATCH 17/22] fix(cwl): Change wording in menus, add info message when opening running session (#6073) ## Problem Addresses feedback after working with Toolkit UXD. There are inconsistencies with formatting/capitalization of certain nouns in the LiveTail menu. Some of the verbiage is unclear/too lengthy. In the case there is an already running session and the user tries to start a new session with the same parameters, it is unclear that we are opening an already existing session and not starting a new one. ## Solution * Consistent spacing and capitalization of "Log Group" and "Log Stream" * Introduce new Info window when opening and existing session stream * Re-words LogStream filter type sub menu. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 3 ++- .../wizard/liveTailLogStreamSubmenu.ts | 23 ++++++++----------- .../wizard/tailLogGroupWizard.ts | 10 ++++---- .../wizard/liveTailLogStreamSubmenu.test.ts | 14 +++++++---- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 21b3b9ea8d7..de235cabc23 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -43,7 +43,8 @@ export async function tailLogGroup( } const session = new LiveTailSession(liveTailSessionConfig) if (registry.has(uriToKey(session.uri))) { - await prepareDocument(session) + await vscode.window.showTextDocument(session.uri, { preview: false }) + void vscode.window.showInformationMessage(`Switching editor to an existing session that matches request.`) span.record({ result: 'Succeeded', sessionAlreadyStarted: true, diff --git a/packages/core/src/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.ts b/packages/core/src/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.ts index a76ec8861e4..c94259684bb 100644 --- a/packages/core/src/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.ts +++ b/packages/core/src/awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu.ts @@ -41,7 +41,7 @@ export class LogStreamFilterSubmenu extends Prompter { public createMenuPrompter() { const helpUri = startLiveTailHelpUrl const prompter = createQuickPick(this.menuOptions, { - title: 'Select LogStream filter type', + title: 'Include log events from...', buttons: createCommonButtons(helpUri), }) return prompter @@ -50,18 +50,15 @@ export class LogStreamFilterSubmenu extends Prompter { private get menuOptions(): DataQuickPickItem[] { const options: DataQuickPickItem[] = [] options.push({ - label: 'All', - detail: 'Include log events from all LogStreams in the selected LogGroup', + label: 'All Log Streams', data: 'all', }) options.push({ - label: 'Specific', - detail: 'Include log events from only a specific LogStream', + label: 'Specific Log Stream', data: 'specific', }) options.push({ - label: 'Prefix', - detail: 'Include log events from LogStreams that begin with a provided prefix', + label: 'Log Streams matching prefix', data: 'prefix', }) return options @@ -70,9 +67,9 @@ export class LogStreamFilterSubmenu extends Prompter { public createLogStreamPrefixBox(): InputBoxPrompter { const helpUri = startLiveTailLogStreamPrefixHelpUrl return createInputBox({ - title: 'Enter LogStream prefix', - placeholder: 'logStream prefix (case sensitive; empty matches all)', - prompt: 'Only log events in the LogStreams that have names that start with the prefix that you specify here are included in the Live Tail session', + title: 'Enter Log Stream prefix', + placeholder: 'log stream prefix (case sensitive; empty matches all)', + prompt: 'Only log events in Log Streams whose name starts with the supplied prefix will be included.', validateInput: (input) => this.validateLogStreamPrefix(input), buttons: createCommonButtons(helpUri), }) @@ -80,11 +77,11 @@ export class LogStreamFilterSubmenu extends Prompter { public validateLogStreamPrefix(prefix: string) { if (prefix.length > 512) { - return 'LogStream prefix cannot be longer than 512 characters' + return 'Log Stream prefix cannot be longer than 512 characters' } if (!this.logStreamPrefixRegEx.test(prefix)) { - return 'LogStream prefix must match pattern: [^:*]*' + return 'Log Stream prefix must match pattern: [^:*]*' } } @@ -104,7 +101,7 @@ export class LogStreamFilterSubmenu extends Prompter { .map((streams) => streams!.map((stream) => ({ data: stream.logStreamName!, label: stream.logStreamName! }))) return createQuickPick(items, { - title: 'Select LogStream', + title: 'Select Log Stream', buttons: createCommonButtons(helpUri), }) } diff --git a/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts b/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts index cc07bc71961..025820df792 100644 --- a/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts +++ b/packages/core/src/awsService/cloudWatchLogs/wizard/tailLogGroupWizard.ts @@ -38,7 +38,7 @@ export class TailLogGroupWizard extends Wizard { this.form.regionLogGroupSubmenuResponse.bindPrompter(createRegionLogGroupSubmenu) this.form.logStreamFilter.bindPrompter((state) => { if (!state.regionLogGroupSubmenuResponse?.data) { - throw new ToolkitError('LogGroupName is null') + throw new ToolkitError('Log Group name is null') } return new LogStreamFilterSubmenu( state.regionLogGroupSubmenuResponse.data, @@ -57,7 +57,7 @@ export function createRegionLogGroupSubmenu(): RegionSubmenu { buttons: [createExitButton()], }, { title: localize('AWS.cwl.tailLogGroup.regionPromptTitle', 'Select Region for Log Group') }, - 'LogGroups' + 'Log Groups' ) } @@ -69,7 +69,7 @@ async function getLogGroupQuickPickOptions(regionCode: string): Promise { input.acceptValue(invalidInput) - assert.deepEqual(input.validationMessage, 'LogStream prefix must match pattern: [^:*]*') + assert.deepEqual(input.validationMessage, 'Log Stream prefix must match pattern: [^:*]*') input.hide() }) const inputBox = logStreamFilterSubmenu.createLogStreamPrefixBox() @@ -53,7 +57,7 @@ describe('liveTailLogStreamSubmenu', async function () { const invalidInput = 'my-log-stream*' getTestWindow().onDidShowInputBox((input) => { input.acceptValue(invalidInput) - assert.deepEqual(input.validationMessage, 'LogStream prefix must match pattern: [^:*]*') + assert.deepEqual(input.validationMessage, 'Log Stream prefix must match pattern: [^:*]*') input.hide() }) const inputBox = logStreamFilterSubmenu.createLogStreamPrefixBox() @@ -64,7 +68,7 @@ describe('liveTailLogStreamSubmenu', async function () { const invalidInput = 'a'.repeat(520) getTestWindow().onDidShowInputBox((input) => { input.acceptValue(invalidInput) - assert.deepEqual(input.validationMessage, 'LogStream prefix cannot be longer than 512 characters') + assert.deepEqual(input.validationMessage, 'Log Stream prefix cannot be longer than 512 characters') input.hide() }) const inputBox = logStreamFilterSubmenu.createLogStreamPrefixBox() From 06b390d53d98324b7eee1246655754ccaa990427 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Tue, 26 Nov 2024 04:05:19 -0800 Subject: [PATCH 18/22] fix(cwl): Dispose event listeners when command exits (#6095) ## Problem TailLogGroup command is not being fully cleaned up properly. The event listeners for: * showing the StatusBar item * closing a session when exiting its editors are not being disposed of. As users stop sessions, these listeners remain active whilst doing no meaningful work. This is effectively a memory leak. Additionally during testing, I noticed that we are adding a session to the LiveTailRegistry before the session is actually started. This could cause an issue where a session stream isn't successfully created, but the session is still registered. ## Solution * Create an array of disposables and dispose of them as we exit the TailLogGroup command * Only register a session after startLiveTail returns Because now we dispose of the "tab close" listener when tailLogGroup exits, changes are needed in the unit tests to keep the mock response stream "open" as the test executes. This keeps tailLogGroup from returning/disposing while we perform test assertions and close the editors. --- .../cloudWatchLogs/commands/tailLogGroup.ts | 48 ++++--- .../commands/tailLogGroup.test.ts | 126 ++++++++---------- 2 files changed, 86 insertions(+), 88 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index de235cabc23..b87f7608430 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -52,25 +52,28 @@ export async function tailLogGroup( }) return } - - registry.set(uriToKey(session.uri), session) - const document = await prepareDocument(session) - hideShowStatusBarItemsOnActiveEditor(session, document) - registerTabChangeCallback(session, registry, document, codeLensProvider) + const disposables: vscode.Disposable[] = [] + disposables.push(hideShowStatusBarItemsOnActiveEditor(session, document)) + disposables.push(closeSessionWhenAllEditorsClosed(session, registry, document, codeLensProvider)) - const stream = await session.startLiveTailSession() - getLogger().info(`LiveTail session started: ${uriToKey(session.uri)}`) - - span.record({ - source: source, - result: 'Succeeded', - sessionAlreadyStarted: false, - hasLogEventFilterPattern: Boolean(wizardResponse.filterPattern), - logStreamFilterType: wizardResponse.logStreamFilter.type, - }) - await handleSessionStream(stream, document, session) + try { + const stream = await session.startLiveTailSession() + registry.set(uriToKey(session.uri), session) + codeLensProvider.refresh() + getLogger().info(`LiveTail session started: ${uriToKey(session.uri)}`) + span.record({ + source: source, + result: 'Succeeded', + sessionAlreadyStarted: false, + hasLogEventFilterPattern: Boolean(wizardResponse.filterPattern), + logStreamFilterType: wizardResponse.logStreamFilter.type, + }) + await handleSessionStream(stream, document, session) + } finally { + disposables.forEach((disposable) => disposable.dispose()) + } }) } @@ -224,8 +227,11 @@ function eventRate(event: LiveTailSessionUpdate): number { return event.sessionResults === undefined ? 0 : event.sessionResults.length } -function hideShowStatusBarItemsOnActiveEditor(session: LiveTailSession, document: vscode.TextDocument) { - vscode.window.onDidChangeActiveTextEditor((editor) => { +function hideShowStatusBarItemsOnActiveEditor( + session: LiveTailSession, + document: vscode.TextDocument +): vscode.Disposable { + return vscode.window.onDidChangeActiveTextEditor((editor) => { session.showStatusBarItem(editor?.document === document) }) } @@ -242,13 +248,13 @@ function hideShowStatusBarItemsOnActiveEditor(session: LiveTailSession, document * from view, will not be returned. Meaning a Tab that is created (shown in top bar), but not open, will not be returned. Even if * the tab isn't visible, we want to continue writing to the doc, and keep the session alive. */ -function registerTabChangeCallback( +function closeSessionWhenAllEditorsClosed( session: LiveTailSession, registry: LiveTailSessionRegistry, document: vscode.TextDocument, codeLensProvider: LiveTailCodeLensProvider -) { - vscode.window.tabGroups.onDidChangeTabs((tabEvent) => { +): vscode.Disposable { + return vscode.window.tabGroups.onDidChangeTabs((tabEvent) => { const isOpen = isLiveTailSessionOpenInAnyTab(session) if (!isOpen) { closeSession(session.uri, registry, 'ClosedEditors', codeLensProvider) diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index 285b380c52d..2bae9c98d85 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -4,23 +4,20 @@ */ import * as sinon from 'sinon' -import * as FakeTimers from '@sinonjs/fake-timers' import * as vscode from 'vscode' import assert from 'assert' import { clearDocument, closeSession, tailLogGroup } from '../../../../awsService/cloudWatchLogs/commands/tailLogGroup' -import { LiveTailSessionLogEvent, StartLiveTailResponseStream } from '@aws-sdk/client-cloudwatch-logs' +import { StartLiveTailResponseStream } from '@aws-sdk/client-cloudwatch-logs' import { LiveTailSessionRegistry } from '../../../../awsService/cloudWatchLogs/registry/liveTailSessionRegistry' import { LiveTailSession } from '../../../../awsService/cloudWatchLogs/registry/liveTailSession' -import { asyncGenerator } from '../../../../shared/utilities/collectionUtils' import { TailLogGroupWizard, TailLogGroupWizardResponse, } from '../../../../awsService/cloudWatchLogs/wizard/tailLogGroupWizard' import { getTestWindow } from '../../../shared/vscode/window' import { CloudWatchLogsSettings, uriToKey } from '../../../../awsService/cloudWatchLogs/cloudWatchLogsUtils' -import { installFakeClock } from '../../../testUtil' -import { DefaultAwsContext, ToolkitError } from '../../../../shared' +import { DefaultAwsContext, ToolkitError, waitUntil } from '../../../../shared' import { LiveTailCodeLensProvider } from '../../../../awsService/cloudWatchLogs/document/liveTailCodeLensProvider' describe('TailLogGroup', function () { @@ -39,23 +36,12 @@ describe('TailLogGroup', function () { let cloudwatchSettingsSpy: sinon.SinonSpy let wizardSpy: sinon.SinonSpy - let clock: FakeTimers.InstalledClock - - before(function () { - clock = installFakeClock() - }) - beforeEach(function () { - clock.reset() sandbox = sinon.createSandbox() registry = new LiveTailSessionRegistry() codeLensProvider = new LiveTailCodeLensProvider(registry) }) - after(function () { - clock.uninstall() - }) - afterEach(function () { sandbox.restore() }) @@ -64,47 +50,46 @@ describe('TailLogGroup', function () { sandbox.stub(DefaultAwsContext.prototype, 'getCredentialAccountId').returns(testAwsAccountId) sandbox.stub(DefaultAwsContext.prototype, 'getCredentials').returns(Promise.resolve(testAwsCredentials)) - wizardSpy = sandbox.stub(TailLogGroupWizard.prototype, 'run').callsFake(async function () { - return getTestWizardResponse() - }) - const testMessage2 = `${testMessage}-2` - const testMessage3 = `${testMessage}-3` + const startTimestamp = 1732276800000 // 11-22-2024 12:00:00PM GMT + const updateFrames: StartLiveTailResponseStream[] = [ + getSessionUpdateFrame(false, `${testMessage}-1`, startTimestamp + 1000), + getSessionUpdateFrame(false, `${testMessage}-2`, startTimestamp + 2000), + getSessionUpdateFrame(false, `${testMessage}-3`, startTimestamp + 3000), + ] + //Returns the configured update frames and then indefinitely blocks. + //This keeps the stream 'open', simulating an open network stream waiting for new events. + //If the stream were to close, the event listeners in the TailLogGroup command would dispose, + //breaking the 'closes tab closes session' assertions this test makes. + async function* generator(): AsyncIterable { + for (const frame of updateFrames) { + yield frame + } + await new Promise(() => {}) + } + startLiveTailSessionSpy = sandbox .stub(LiveTailSession.prototype, 'startLiveTailSession') - .callsFake(async function () { - return getTestResponseStream([ - { - message: testMessage, - timestamp: 876830400000, - }, - { - message: testMessage2, - timestamp: 876830402000, - }, - { - message: testMessage3, - timestamp: 876830403000, - }, - ]) - }) + .returns(Promise.resolve(generator())) stopLiveTailSessionSpy = sandbox .stub(LiveTailSession.prototype, 'stopLiveTailSession') .callsFake(async function () { return }) - + wizardSpy = sandbox.stub(TailLogGroupWizard.prototype, 'run').callsFake(async function () { + return getTestWizardResponse() + }) //Set maxLines to 1. cloudwatchSettingsSpy = sandbox.stub(CloudWatchLogsSettings.prototype, 'get').callsFake(() => { return 1 }) - await tailLogGroup(registry, testSource, codeLensProvider, { + + //The mock stream doesn't 'close', causing tailLogGroup to not return. If we `await`, it will never resolve. + //Run it in the background and use waitUntil to poll its state. + void tailLogGroup(registry, testSource, codeLensProvider, { groupName: testLogGroup, regionName: testRegion, }) - assert.strictEqual(wizardSpy.calledOnce, true) - assert.strictEqual(cloudwatchSettingsSpy.calledOnce, true) - assert.strictEqual(startLiveTailSessionSpy.calledOnce, true) - assert.strictEqual(registry.size, 1) + await waitUntil(async () => registry.size !== 0, { interval: 100, timeout: 1000 }) //registry is asserted to have only one entry, so this is assumed to be the session that was //started in this test. @@ -113,13 +98,24 @@ describe('TailLogGroup', function () { if (sessionUri === undefined) { throw Error } - const document = getTestWindow().activeTextEditor?.document + + assert.strictEqual(wizardSpy.calledOnce, true) + assert.strictEqual(cloudwatchSettingsSpy.calledOnce, true) + assert.strictEqual(startLiveTailSessionSpy.calledOnce, true) + assert.strictEqual(registry.size, 1) + + //Validate writing to the document. + //MaxLines is set to 1, and "testMessage3" is the last event in the stream, its contents should be the only thing in the doc. + const window = getTestWindow() + const document = window.activeTextEditor?.document assert.strictEqual(sessionUri.toString(), document?.uri.toString()) - //Test responseStream has 3 events, maxLines is set to 1. Only 3rd event should be in doc. - assert.strictEqual(document?.getText().trim(), `12:00:03\t${testMessage3}`) + const doesDocumentContainExpectedContent = await waitUntil( + async () => document?.getText().trim() === `12:00:03\t${testMessage}-3`, + { interval: 100, timeout: 1000 } + ) + assert.strictEqual(doesDocumentContainExpectedContent, true) //Test that closing all tabs the session's document is open in will cause the session to close - const window = getTestWindow() let tabs: vscode.Tab[] = [] window.tabGroups.all.forEach((tabGroup) => { tabs = tabs.concat(getLiveTailSessionTabsFromTabGroup(tabGroup, sessionUri!)) @@ -159,7 +155,6 @@ describe('TailLogGroup', function () { closeSession(session.uri, registry, testSource, codeLensProvider) assert.strictEqual(0, registry.size) assert.strictEqual(true, stopLiveTailSessionSpy.calledOnce) - assert.strictEqual(0, clock.countTimers()) }) it('clearDocument clears all text from document', async function () { @@ -200,26 +195,23 @@ describe('TailLogGroup', function () { } } - //Creates a test response stream. Each log event provided will be its own "frame" of the input stream. - function getTestResponseStream(logEvents: LiveTailSessionLogEvent[]): AsyncIterable { - const sessionStartFrame: StartLiveTailResponseStream = { - sessionStart: { - logGroupIdentifiers: [testLogGroup], + function getSessionUpdateFrame( + isSampled: boolean, + message: string, + timestamp: number + ): StartLiveTailResponseStream { + return { + sessionUpdate: { + sessionMetadata: { + sampled: isSampled, + }, + sessionResults: [ + { + message: message, + timestamp: timestamp, + }, + ], }, - sessionUpdate: undefined, } - - const updateFrames: StartLiveTailResponseStream[] = logEvents.map((event) => { - return { - sessionUpdate: { - sessionMetadata: { - sampled: false, - }, - sessionResults: [event], - }, - } - }) - - return asyncGenerator([sessionStartFrame, ...updateFrames]) } }) From 08eb59e29f958d52573e9eb13b3720941188baf5 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Wed, 4 Dec 2024 11:48:46 -0800 Subject: [PATCH 19/22] test(cwl): Add unit test for starting and stopping LiveTailSession object. (#6110) ## Problem The `LiveTailSession` object's start/stop methods aren't directly under test. TailLogGroup tests are mocking their behavior. TailLogGroup command tests are more focused on managing the session registry, opening/writing to the document, and the close tab behaviors. ## Solution Write a test that's scoped to creating a `session` and calling start and stop on it. Assert that timers are handled/disposed of properly, and that the session response stream is returned. Addresses [this comment](https://github.com/aws/aws-toolkit-vscode/pull/6095#discussion_r1857571286). --- License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Keegan Irby --- .../registry/liveTailSession.ts | 6 +- .../registry/liveTailSession.test.ts | 71 ++++++++++++++++++- 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index 6947fc74459..5a61bd13268 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -93,7 +93,7 @@ export class LiveTailSession { if (!commandOutput.responseStream) { throw new ToolkitError('LiveTail session response stream is undefined.') } - this.startTime = Date.now() + this.startTime = globals.clock.Date.now() this.endTime = undefined this.statusBarUpdateTimer = globals.clock.setInterval(() => { this.updateStatusBarItemText() @@ -102,7 +102,7 @@ export class LiveTailSession { } public stopLiveTailSession() { - this.endTime = Date.now() + this.endTime = globals.clock.Date.now() this.statusBarItem.dispose() globals.clock.clearInterval(this.statusBarUpdateTimer) this.liveTailClient.abortController.abort() @@ -116,7 +116,7 @@ export class LiveTailSession { } //Currently running if (this.endTime === undefined) { - return Date.now() - this.startTime + return globals.clock.Date.now() - this.startTime } return this.endTime - this.startTime } diff --git a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts index 07bab07983a..924aa437989 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts @@ -2,10 +2,17 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ +import * as sinon from 'sinon' +import * as FakeTimers from '@sinonjs/fake-timers' import assert from 'assert' import { LiveTailSession } from '../../../../awsService/cloudWatchLogs/registry/liveTailSession' -import { StartLiveTailCommand } from '@aws-sdk/client-cloudwatch-logs' +import { + CloudWatchLogsClient, + StartLiveTailCommand, + StartLiveTailResponseStream, +} from '@aws-sdk/client-cloudwatch-logs' import { LogStreamFilterResponse } from '../../../../awsService/cloudWatchLogs/wizard/liveTailLogStreamSubmenu' +import { installFakeClock } from '../../../testUtil' describe('LiveTailSession', async function () { const testLogGroupArn = 'arn:aws:test-log-group' @@ -13,6 +20,26 @@ describe('LiveTailSession', async function () { const testFilter = 'test-filter' const testAwsCredentials = {} as any as AWS.Credentials + let sandbox: sinon.SinonSandbox + let clock: FakeTimers.InstalledClock + + before(function () { + clock = installFakeClock() + }) + + beforeEach(function () { + clock.reset() + sandbox = sinon.createSandbox() + }) + + after(function () { + clock.uninstall() + }) + + afterEach(function () { + sandbox.restore() + }) + it('builds StartLiveTailCommand: no stream Filter, no event filter.', function () { const session = buildLiveTailSession({ type: 'all' }, undefined) assert.deepStrictEqual( @@ -65,6 +92,36 @@ describe('LiveTailSession', async function () { ) }) + it('closes a started session', async function () { + const startLiveTailStub = sinon.stub(CloudWatchLogsClient.prototype, 'send').callsFake(function () { + return { + responseStream: mockResponseStream(), + } + }) + const session = buildLiveTailSession({ type: 'all' }, testFilter) + assert.strictEqual(session.getLiveTailSessionDuration(), 0) + + const returnedResponseStream = await session.startLiveTailSession() + assert.strictEqual(startLiveTailStub.calledOnce, true) + const requestArgs = startLiveTailStub.getCall(0).args + assert.deepEqual(requestArgs[0].input, session.buildStartLiveTailCommand().input) + assert.strictEqual(requestArgs[1].abortSignal !== undefined && !requestArgs[1].abortSignal.aborted, true) + assert.strictEqual(session.isAborted, false) + assert.strictEqual(clock.countTimers(), 1) + assert.deepStrictEqual(returnedResponseStream, mockResponseStream()) + + clock.tick(1000) + assert.strictEqual(session.getLiveTailSessionDuration(), 1000) + + session.stopLiveTailSession() + assert.strictEqual(session.isAborted, true) + assert.strictEqual(clock.countTimers(), 0) + + //Session is stopped; ticking the clock forward should not change the session duration + clock.tick(1000) + assert.strictEqual(session.getLiveTailSessionDuration(), 1000) + }) + function buildLiveTailSession( logStreamFilter: LogStreamFilterResponse, logEventFilterPattern: string | undefined @@ -77,4 +134,16 @@ describe('LiveTailSession', async function () { awsCredentials: testAwsCredentials, }) } + + async function* mockResponseStream(): AsyncIterable { + const frame: StartLiveTailResponseStream = { + sessionUpdate: { + sessionMetadata: { + sampled: false, + }, + sessionResults: [], + }, + } + yield frame + } }) From ed15bbc9df1ceac8217cd6fa96c6090fd750e418 Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Fri, 6 Dec 2024 17:06:53 -0800 Subject: [PATCH 20/22] telemetry(cwl): LiveTail metrics ## Problem Updating telemetry to accommodate changes in https://github.com/aws/aws-toolkit-common/pull/932 ## Solution Update package version for telemetry. Add validation on the LogStreamFilter submenu's response for filter type. This is needed to allow the type returned from the LogStreamFilterSubmenu to be convertible to the type in the metric definition for filterPattern. In any case, this is a good validation to have since the 'menu' placeholder value isn't valid for starting a LiveTail session anyways. --- package-lock.json | 9 +++++---- package.json | 2 +- .../cloudWatchLogs/commands/tailLogGroup.ts | 13 +++++++++---- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index d5cec48a936..92e5e525861 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,7 @@ "vscode-nls-dev": "^4.0.4" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.284", + "@aws-toolkits/telemetry": "^1.0.287", "@playwright/browser-chromium": "^1.43.1", "@types/he": "^1.2.3", "@types/vscode": "^1.68.0", @@ -6046,13 +6046,14 @@ } }, "node_modules/@aws-toolkits/telemetry": { - "version": "1.0.284", - "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.284.tgz", - "integrity": "sha512-+3uHmr4St2cw8yuvVZOUY4Recv0wmzendGODCeUPIIUjsjCANF3H7G/qzIKRN3BHCoedcvzA/eSI+l4ENRXtiA==", + "version": "1.0.287", + "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.287.tgz", + "integrity": "sha512-qK2l8Fv5Cvs865ap2evf4ikBREg33/jGw0lgxolqZLdHwm5zm/DkR9vNyqwhDlqDRlSgSlros3Z8zaiSBVRYVQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "ajv": "^6.12.6", + "cross-spawn": "^7.0.6", "fs-extra": "^11.1.0", "lodash": "^4.17.20", "prettier": "^3.3.2", diff --git a/package.json b/package.json index bc03c2b8395..872e525de2c 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "generateNonCodeFiles": "npm run generateNonCodeFiles -w packages/ --if-present" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.284", + "@aws-toolkits/telemetry": "^1.0.287", "@playwright/browser-chromium": "^1.43.1", "@types/he": "^1.2.3", "@types/vscode": "^1.68.0", diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index b87f7608430..33cda709f25 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -24,12 +24,17 @@ export async function tailLogGroup( codeLensProvider: LiveTailCodeLensProvider, logData?: { regionName: string; groupName: string } ): Promise { - await telemetry.cwlLiveTail_Start.run(async (span) => { + await telemetry.cloudwatchlogs_startLiveTail.run(async (span) => { const wizard = new TailLogGroupWizard(logData) const wizardResponse = await wizard.run() if (!wizardResponse) { throw new CancellationError('user') } + if (wizardResponse.logStreamFilter.type === 'menu' || wizardResponse.logStreamFilter.type === undefined) { + //logstream filter wizard uses type to determine which submenu to show. 'menu' is set when no type is selected + //and to show the 'menu' of selecting a type. This should not be reachable due to the picker logic, but validating in case. + throw new ToolkitError(`Invalid Log Stream filter type: ${wizardResponse.logStreamFilter.type}`) + } const awsCredentials = await globals.awsContext.getCredentials() if (awsCredentials === undefined) { throw new ToolkitError('Failed to start LiveTail session: credentials are undefined.') @@ -67,8 +72,8 @@ export async function tailLogGroup( source: source, result: 'Succeeded', sessionAlreadyStarted: false, - hasLogEventFilterPattern: Boolean(wizardResponse.filterPattern), - logStreamFilterType: wizardResponse.logStreamFilter.type, + hasTextFilter: Boolean(wizardResponse.filterPattern), + filterType: wizardResponse.logStreamFilter.type, }) await handleSessionStream(stream, document, session) } finally { @@ -83,7 +88,7 @@ export function closeSession( source: string, codeLensProvider: LiveTailCodeLensProvider ) { - telemetry.cwlLiveTail_Stop.run((span) => { + telemetry.cloudwatchlogs_stopLiveTail.run((span) => { const session = registry.get(uriToKey(sessionUri)) if (session === undefined) { throw new ToolkitError(`No LiveTail session found for URI: ${uriToKey(sessionUri)}`) From 9ab2df055f694476da7e87d30c034b0cea55380f Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Mon, 9 Dec 2024 14:54:21 -0800 Subject: [PATCH 21/22] lint --- .../cloudWatchLogs/commands/tailLogGroup.ts | 22 ++++++++--------- .../document/liveTailCodeLensProvider.ts | 2 +- .../document/liveTailDocumentProvider.ts | 2 +- .../registry/liveTailSession.ts | 6 ++--- .../commands/tailLogGroup.test.ts | 24 +++++++++---------- .../registry/liveTailSession.test.ts | 2 +- 6 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts index 33cda709f25..4aa1feb272a 100644 --- a/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts +++ b/packages/core/src/awsService/cloudWatchLogs/commands/tailLogGroup.ts @@ -31,8 +31,8 @@ export async function tailLogGroup( throw new CancellationError('user') } if (wizardResponse.logStreamFilter.type === 'menu' || wizardResponse.logStreamFilter.type === undefined) { - //logstream filter wizard uses type to determine which submenu to show. 'menu' is set when no type is selected - //and to show the 'menu' of selecting a type. This should not be reachable due to the picker logic, but validating in case. + // logstream filter wizard uses type to determine which submenu to show. 'menu' is set when no type is selected + // and to show the 'menu' of selecting a type. This should not be reachable due to the picker logic, but validating in case. throw new ToolkitError(`Invalid Log Stream filter type: ${wizardResponse.logStreamFilter.type}`) } const awsCredentials = await globals.awsContext.getCredentials() @@ -134,8 +134,8 @@ async function handleSessionStream( formatLogEvent(logEvent) ) if (formattedLogEvents.length !== 0) { - //Determine should scroll before adding new lines to doc because adding large - //amount of new lines can push bottom of file out of view before scrolling. + // Determine should scroll before adding new lines to doc because adding large + // amount of new lines can push bottom of file out of view before scrolling. const editorsToScroll = getTextEditorsToScroll(document) await updateTextDocumentWithNewLogEvents(formattedLogEvents, document, session.maxLines) editorsToScroll.forEach(scrollTextEditorToBottom) @@ -146,13 +146,13 @@ async function handleSessionStream( } } catch (e) { if (session.isAborted) { - //Expected case. User action cancelled stream (CodeLens, Close Editor, etc.). - //AbortSignal interrupts the LiveTail stream, causing error to be thrown here. - //Can assume that stopLiveTailSession() has already been called - AbortSignal is only - //exposed through that method. + // Expected case. User action cancelled stream (CodeLens, Close Editor, etc.). + // AbortSignal interrupts the LiveTail stream, causing error to be thrown here. + // Can assume that stopLiveTailSession() has already been called - AbortSignal is only + // exposed through that method. getLogger().info(`LiveTail session stopped: ${uriToKey(session.uri)}`) } else { - //Unexpected exception. + // Unexpected exception. session.stopLiveTailSession() throw ToolkitError.chain( e, @@ -178,8 +178,8 @@ function formatLogEvent(logEvent: LiveTailSessionLogEvent): string { return line } -//Auto scroll visible LiveTail session editors if the end-of-file is in view. -//This allows for newly added log events to stay in view. +// Auto scroll visible LiveTail session editors if the end-of-file is in view. +// This allows for newly added log events to stay in view. function getTextEditorsToScroll(document: vscode.TextDocument): vscode.TextEditor[] { return vscode.window.visibleTextEditors.filter((editor) => { if (editor.document !== document) { diff --git a/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts index 236cd6cad05..dde0ddbbe28 100644 --- a/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts +++ b/packages/core/src/awsService/cloudWatchLogs/document/liveTailCodeLensProvider.ts @@ -19,7 +19,7 @@ export class LiveTailCodeLensProvider implements vscode.CodeLensProvider { token: vscode.CancellationToken ): vscode.ProviderResult { const uri = document.uri - //if registry does not contain session, it is assumed to have been stopped, thus, hide lenses. + // if registry does not contain session, it is assumed to have been stopped, thus, hide lenses. if (uri.scheme !== cloudwatchLogsLiveTailScheme || !this.registry.has(uriToKey(uri))) { return [] } diff --git a/packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts b/packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts index fe909579ae3..7d662890dcf 100644 --- a/packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts +++ b/packages/core/src/awsService/cloudWatchLogs/document/liveTailDocumentProvider.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' export class LiveTailDocumentProvider implements vscode.TextDocumentContentProvider { provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult { - //Content will be written to the document via handling a LiveTail response stream in the TailLogGroup command. + // Content will be written to the document via handling a LiveTail response stream in the TailLogGroup command. return '' } } diff --git a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts index 5a61bd13268..87eba4d4079 100644 --- a/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts +++ b/packages/core/src/awsService/cloudWatchLogs/registry/liveTailSession.ts @@ -42,7 +42,7 @@ export class LiveTailSession { private _eventRate: number private _isSampled: boolean - //While session is running, used to update the StatusBar each half second. + // While session is running, used to update the StatusBar each half second. private statusBarUpdateTimer: NodeJS.Timer | undefined static settings = new CloudWatchLogsSettings(Settings.instance) @@ -110,11 +110,11 @@ export class LiveTailSession { } public getLiveTailSessionDuration(): number { - //Never started + // Never started if (this.startTime === undefined) { return 0 } - //Currently running + // Currently running if (this.endTime === undefined) { return globals.clock.Date.now() - this.startTime } diff --git a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts index 2bae9c98d85..f2b085b2f2c 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/commands/tailLogGroup.test.ts @@ -56,10 +56,10 @@ describe('TailLogGroup', function () { getSessionUpdateFrame(false, `${testMessage}-2`, startTimestamp + 2000), getSessionUpdateFrame(false, `${testMessage}-3`, startTimestamp + 3000), ] - //Returns the configured update frames and then indefinitely blocks. - //This keeps the stream 'open', simulating an open network stream waiting for new events. - //If the stream were to close, the event listeners in the TailLogGroup command would dispose, - //breaking the 'closes tab closes session' assertions this test makes. + // Returns the configured update frames and then indefinitely blocks. + // This keeps the stream 'open', simulating an open network stream waiting for new events. + // If the stream were to close, the event listeners in the TailLogGroup command would dispose, + // breaking the 'closes tab closes session' assertions this test makes. async function* generator(): AsyncIterable { for (const frame of updateFrames) { yield frame @@ -78,21 +78,21 @@ describe('TailLogGroup', function () { wizardSpy = sandbox.stub(TailLogGroupWizard.prototype, 'run').callsFake(async function () { return getTestWizardResponse() }) - //Set maxLines to 1. + // Set maxLines to 1. cloudwatchSettingsSpy = sandbox.stub(CloudWatchLogsSettings.prototype, 'get').callsFake(() => { return 1 }) - //The mock stream doesn't 'close', causing tailLogGroup to not return. If we `await`, it will never resolve. - //Run it in the background and use waitUntil to poll its state. + // The mock stream doesn't 'close', causing tailLogGroup to not return. If we `await`, it will never resolve. + // Run it in the background and use waitUntil to poll its state. void tailLogGroup(registry, testSource, codeLensProvider, { groupName: testLogGroup, regionName: testRegion, }) await waitUntil(async () => registry.size !== 0, { interval: 100, timeout: 1000 }) - //registry is asserted to have only one entry, so this is assumed to be the session that was - //started in this test. + // registry is asserted to have only one entry, so this is assumed to be the session that was + // started in this test. let sessionUri: vscode.Uri | undefined registry.forEach((session) => (sessionUri = session.uri)) if (sessionUri === undefined) { @@ -104,8 +104,8 @@ describe('TailLogGroup', function () { assert.strictEqual(startLiveTailSessionSpy.calledOnce, true) assert.strictEqual(registry.size, 1) - //Validate writing to the document. - //MaxLines is set to 1, and "testMessage3" is the last event in the stream, its contents should be the only thing in the doc. + // Validate writing to the document. + // MaxLines is set to 1, and "testMessage3" is the last event in the stream, its contents should be the only thing in the doc. const window = getTestWindow() const document = window.activeTextEditor?.document assert.strictEqual(sessionUri.toString(), document?.uri.toString()) @@ -115,7 +115,7 @@ describe('TailLogGroup', function () { ) assert.strictEqual(doesDocumentContainExpectedContent, true) - //Test that closing all tabs the session's document is open in will cause the session to close + // Test that closing all tabs the session's document is open in will cause the session to close let tabs: vscode.Tab[] = [] window.tabGroups.all.forEach((tabGroup) => { tabs = tabs.concat(getLiveTailSessionTabsFromTabGroup(tabGroup, sessionUri!)) diff --git a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts index 924aa437989..514114750b4 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/registry/liveTailSession.test.ts @@ -117,7 +117,7 @@ describe('LiveTailSession', async function () { assert.strictEqual(session.isAborted, true) assert.strictEqual(clock.countTimers(), 0) - //Session is stopped; ticking the clock forward should not change the session duration + // Session is stopped; ticking the clock forward should not change the session duration clock.tick(1000) assert.strictEqual(session.getLiveTailSessionDuration(), 1000) }) From 694e4d500c0d54c2006f5d5878142c98b92027eb Mon Sep 17 00:00:00 2001 From: Keegan Irby Date: Tue, 10 Dec 2024 11:51:12 -0800 Subject: [PATCH 22/22] docs(cwl): changelog #6200 --- .../Feature-eb088612-3f07-4410-86f2-6e91131d3ffe.json | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 packages/toolkit/.changes/next-release/Feature-eb088612-3f07-4410-86f2-6e91131d3ffe.json diff --git a/packages/toolkit/.changes/next-release/Feature-eb088612-3f07-4410-86f2-6e91131d3ffe.json b/packages/toolkit/.changes/next-release/Feature-eb088612-3f07-4410-86f2-6e91131d3ffe.json new file mode 100644 index 00000000000..547ae687098 --- /dev/null +++ b/packages/toolkit/.changes/next-release/Feature-eb088612-3f07-4410-86f2-6e91131d3ffe.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "CloudWatch Logs: Added support for Live Tailing LogGroups. Start using LiveTail by: selecting 'Tail Log Group' in the command palette, or, right clicking/pressing the 'Play' icon on a Log Group in the Explorer menu. See [Troubleshoot with CloudWatch Logs Live Tail](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs_LiveTail.html) for more information. LiveTail is a paid feature - for more information about pricing, see the Logs tab at [Amazon CloudWatch Pricing](https://aws.amazon.com/cloudwatch/pricing/)." +}