From cacd41296e4c0fe18766ccf4236bdb787950d2ed Mon Sep 17 00:00:00 2001 From: Bhargav Date: Thu, 2 Oct 2025 10:57:45 -0700 Subject: [PATCH 01/53] feat(smus): Support IAM auth mode for SMUS (#2236) **Description** Adding the UI flow to support IAM auth flow in SMUS. The text is TBD and is placeholder for now and the actual core IAM flow and tracking is not implemented yet. Will be in the next CR. **Motivation** **Testing Done** Added unit tests where possible and also manually tested existing and new UI flow. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../auth/authenticationOrchestrator.ts | 214 +++ .../preferences/authenticationPreferences.ts | 191 +++ .../auth/ui/authenticationMethodSelection.ts | 113 ++ .../auth/ui/iamProfileSelection.ts | 1466 +++++++++++++++++ .../auth/ui/ssoAuthentication.ts | 108 ++ .../explorer/activation.ts | 4 +- .../nodes/sageMakerUnifiedStudioRootNode.ts | 241 +-- packages/core/src/shared/globalState.ts | 1 + .../auth/authenticationOrchestrator.test.ts | 76 + .../authenticationPreferences.test.ts | 303 ++++ .../ui/authenticationMethodSelection.test.ts | 39 + .../auth/ui/iamProfileSelection.test.ts | 173 ++ .../auth/ui/ssoAuthentication.test.ts | 40 + 13 files changed, 2848 insertions(+), 121 deletions(-) create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.test.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.test.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/auth/ui/ssoAuthentication.test.ts diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts new file mode 100644 index 00000000000..099b8f0e60b --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -0,0 +1,214 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getLogger } from '../../shared/logger/logger' +import { ToolkitError } from '../../shared/errors' +import { SmusErrorCodes } from '../shared/smusUtils' +import { SmusAuthenticationProvider } from './providers/smusAuthenticationProvider' +import { SmusSsoAuthenticationUI } from './ui/ssoAuthentication' +import { SmusIamProfileSelector } from './ui/iamProfileSelection' +import { SmusAuthenticationPreferencesManager } from './preferences/authenticationPreferences' + +export type SmusAuthenticationMethod = 'sso' | 'iam' + +/** + * Orchestrates SMUS authentication flows + */ +export class SmusAuthenticationOrchestrator { + private static readonly logger = getLogger() + + /** + * Handles IAM authentication flow + */ + public static async handleIamAuthentication( + authProvider: SmusAuthenticationProvider, + span: any, + context: vscode.ExtensionContext + ): Promise<'SUCCESS' | 'BACK'> { + const logger = this.logger + logger.debug('SMUS Auth: Starting IAM authentication flow') + + try { + // Show IAM profile selection dialog + const profileSelection = await SmusIamProfileSelector.showIamProfileSelection() + + // Handle different result types + if ('isBack' in profileSelection) { + // User chose to go back to authentication method selection + logger.debug('SMUS Auth: User chose to go back to authentication method selection') + return 'BACK' + } + + if ('isEditing' in profileSelection) { + // User chose to edit credentials or is in editing mode + logger.debug('SMUS Auth: User is editing credentials') + throw new ToolkitError('User is editing credentials. Please complete setup and try again.', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + } + + // At this point, we have a valid profile selection + logger.debug( + `SMUS Auth: Selected profile: ${profileSelection.profileName}, region: ${profileSelection.region}` + ) + + // Validate the selected profile + const validation = await SmusIamProfileSelector.validateProfile(profileSelection.profileName) + if (!validation.isValid) { + throw new ToolkitError(`Profile validation failed: ${validation.error}`, { + code: 'InvalidProfile', + }) + } + + // Show status message + vscode.window.setStatusBarMessage('IAM profile selected successfully', 3000) + + // Show friendly message about selected profile and feature status + void vscode.window.showInformationMessage( + `Profile '${profileSelection.profileName}' (${profileSelection.region}) has been selected. ` + + 'IAM authentication with SageMaker Unified Studio is not yet fully implemented. ' + + 'Please use SSO authentication for now.', + 'OK' + ) + + logger.info( + `SMUS Auth: Profile selected - ${profileSelection.profileName} in ${profileSelection.region}. Feature not yet implemented.` + ) + + // Ask to remember authentication method preference + await this.askToRememberAuthMethod(context, 'iam') + + // Return success to complete the authentication flow gracefully + return 'SUCCESS' + } catch (error) { + // Handle user cancellation (including editing mode) + if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { + logger.debug('IAM authentication cancelled by user') + throw error // Re-throw to be handled by the main loop + } else { + // Log the error for actual failures + logger.error('IAM authentication failed: %s', (error as Error).message) + throw error + } + } + } + + /** + * Handles SSO authentication flow + */ + public static async handleSsoAuthentication( + authProvider: SmusAuthenticationProvider, + span: any, + context: vscode.ExtensionContext + ): Promise<'SUCCESS' | 'BACK'> { + const logger = this.logger + logger.debug('SMUS Auth: Starting SSO authentication flow') + + // Show domain URL input dialog with back button support + const domainUrl = await SmusSsoAuthenticationUI.showDomainUrlInput() + + logger.debug(`SMUS Auth: Domain URL input result: ${domainUrl ? 'provided' : 'cancelled or back'}`) + + if (domainUrl === 'BACK') { + // User wants to go back to authentication method selection + logger.debug('User chose to go back from domain URL input') + return 'BACK' + } + + if (!domainUrl) { + // User cancelled + logger.debug('User cancelled domain URL input') + throw new ToolkitError('User cancelled domain URL input', { + cancelled: true, + code: SmusErrorCodes.UserCancelled, + }) + } + + try { + // Connect to SMUS using the authentication provider + const connection = await authProvider.connectToSmus(domainUrl) + + if (!connection) { + throw new ToolkitError('Failed to establish connection', { + code: SmusErrorCodes.FailedAuthConnecton, + }) + } + + // Extract domain account ID, domain ID, and region for logging + const domainId = connection.domainId + const region = connection.ssoRegion + + logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) + await this.recordAuthTelemetry(span, authProvider, domainId, region) + + // Ask to remember authentication method preference + await this.askToRememberAuthMethod(context, 'sso') + + // Immediately refresh the tree view to show authenticated state + try { + await vscode.commands.executeCommand('aws.smus.rootView.refresh') + } catch (refreshErr) { + logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) + } + + return 'SUCCESS' + } catch (connectionErr) { + // Clear the status bar message + vscode.window.setStatusBarMessage('Connection to SageMaker Unified Studio Failed') + + // Log the error and re-throw to be handled by the outer catch block + logger.error('Connection failed: %s', (connectionErr as Error).message) + throw new ToolkitError('Connection failed.', { + cause: connectionErr as Error, + code: (connectionErr as Error).name, + }) + } + } + + /** + * Asks the user if they want to remember their authentication method choice after successful login + */ + private static async askToRememberAuthMethod( + context: vscode.ExtensionContext, + method: SmusAuthenticationMethod + ): Promise { + const logger = this.logger + + try { + const methodName = method === 'sso' ? 'SSO Authentication' : 'IAM Credential Profile' + + const result = await vscode.window.showInformationMessage( + `Remember ${methodName} as your preferred authentication method for SageMaker Unified Studio?`, + 'Yes', + 'No' + ) + + if (result === 'Yes') { + logger.debug(`SMUS Auth: Saving user preference: ${method}`) + await SmusAuthenticationPreferencesManager.setPreferredMethod(context, method, true) + logger.debug(`SMUS Auth: Preference saved successfully`) + } + } catch (error) { + // Not a hard failure, so not throwing error + logger.warn('SMUS Auth: Error asking to remember auth method: %s', error) + } + } + + /** + * Records authentication telemetry + */ + private static async recordAuthTelemetry( + span: any, + authProvider: SmusAuthenticationProvider, + domainId: string, + region: string + ): Promise { + // Import the telemetry function from the shared module + const { recordAuthTelemetry } = await import('../shared/telemetry.js') + await recordAuthTelemetry(span, authProvider, domainId, region) + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.ts b/packages/core/src/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.ts new file mode 100644 index 00000000000..0c3433d63aa --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.ts @@ -0,0 +1,191 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getLogger } from '../../../shared/logger/logger' +import globals from '../../../shared/extensionGlobals.js' +import { SmusAuthenticationMethod } from '../ui/authenticationMethodSelection.js' + +/** + * Configuration for IAM profile preferences + */ +export interface SmusIamProfileConfig { + profileName: string + region: string + lastUsed?: Date + isDefault?: boolean +} + +/** + * SMUS authentication preferences + */ +export interface SmusAuthenticationPreferences { + preferredMethod?: SmusAuthenticationMethod + lastUsedSsoConnection?: string + lastUsedIamProfile?: SmusIamProfileConfig + rememberChoice: boolean +} + +/** + * Manager for SMUS authentication preferences + */ +export class SmusAuthenticationPreferencesManager { + private static readonly logger = getLogger() + // eslint-disable-next-line @typescript-eslint/naming-convention + private static readonly PREFERENCES_KEY = 'aws.smus.authenticationPreferences' + + /** + * Gets the current authentication preferences + * @param context VS Code extension context (unused, kept for API compatibility) + * @returns Current authentication preferences + */ + public static getPreferences(context?: vscode.ExtensionContext): SmusAuthenticationPreferences { + const stored = globals.globalState.get(this.PREFERENCES_KEY) + + return { + rememberChoice: false, + ...stored, + } + } + + /** + * Updates authentication preferences + * @param context VS Code extension context (unused, kept for API compatibility) + * @param preferences Preferences to update + */ + public static async updatePreferences( + context: vscode.ExtensionContext, + preferences: Partial + ): Promise { + const logger = this.logger + + const current = this.getPreferences() + const updated = { ...current, ...preferences } + + logger.debug( + `SMUS Auth: Updating authentication preferences - preferredMethod: ${updated.preferredMethod}, rememberChoice: ${updated.rememberChoice}` + ) + + await globals.globalState.update(this.PREFERENCES_KEY, updated) + } + + /** + * Sets the preferred authentication method + * @param context VS Code extension context + * @param method Preferred authentication method + * @param rememberChoice Whether to remember this choice + */ + public static async setPreferredMethod( + context: vscode.ExtensionContext, + method: SmusAuthenticationMethod, + rememberChoice: boolean + ): Promise { + await this.updatePreferences(context, { + preferredMethod: method, + rememberChoice, + }) + } + + /** + * Gets the preferred authentication method + * @param context VS Code extension context (unused, kept for API compatibility) + * @returns Preferred authentication method or undefined if not set + */ + public static getPreferredMethod(context?: vscode.ExtensionContext): SmusAuthenticationMethod | undefined { + const preferences = this.getPreferences() + return preferences.rememberChoice ? preferences.preferredMethod : undefined + } + + /** + * Sets the last used SSO connection + * @param context VS Code extension context + * @param connectionId Connection ID + */ + public static async setLastUsedSsoConnection( + context: vscode.ExtensionContext, + connectionId: string + ): Promise { + await this.updatePreferences(context, { + lastUsedSsoConnection: connectionId, + }) + } + + /** + * Sets the last used IAM profile configuration + * @param context VS Code extension context + * @param profileConfig IAM profile configuration + */ + public static async setLastUsedIamProfile( + context: vscode.ExtensionContext, + profileConfig: SmusIamProfileConfig + ): Promise { + await this.updatePreferences(context, { + lastUsedIamProfile: { + ...profileConfig, + lastUsed: new Date(), + }, + }) + } + + /** + * Gets the last used IAM profile configuration + * @param context VS Code extension context (unused, kept for API compatibility) + * @returns Last used IAM profile configuration or undefined + */ + public static getLastUsedIamProfile(context?: vscode.ExtensionContext): SmusIamProfileConfig | undefined { + const preferences = this.getPreferences() + return preferences.lastUsedIamProfile + } + + /** + * Clears all authentication preferences + * @param context VS Code extension context (unused, kept for API compatibility) + */ + public static async clearPreferences(context?: vscode.ExtensionContext): Promise { + const logger = this.logger + logger.debug('SMUS Auth: Clearing authentication preferences') + + await globals.globalState.update(this.PREFERENCES_KEY, undefined) + } + + /** + * Clears only connection-specific preferences, preserving authentication method preference + * @param context VS Code extension context (unused, kept for API compatibility) + */ + public static async clearConnectionPreferences(context?: vscode.ExtensionContext): Promise { + const logger = this.logger + logger.debug('SMUS Auth: Clearing connection-specific preferences (preserving auth method preference)') + + const currentPrefs = this.getPreferences() + + // Keep only the authentication method preference and rememberChoice flag + const preservedPrefs: SmusAuthenticationPreferences = { + preferredMethod: currentPrefs.preferredMethod, + rememberChoice: currentPrefs.rememberChoice, + // Clear connection-specific data + lastUsedSsoConnection: undefined, + lastUsedIamProfile: undefined, + } + + await globals.globalState.update(this.PREFERENCES_KEY, preservedPrefs) + } + + /** + * Switches the authentication method preference + * @param context VS Code extension context + * @param newMethod New authentication method to switch to + */ + public static async switchAuthenticationMethod( + context: vscode.ExtensionContext, + newMethod: SmusAuthenticationMethod + ): Promise { + const logger = this.logger + logger.debug(`SMUS Auth: Switching authentication method to: ${newMethod}`) + + await this.updatePreferences(context, { + preferredMethod: newMethod, + }) + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts b/packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts new file mode 100644 index 00000000000..8b0e79a9f5d --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts @@ -0,0 +1,113 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getLogger } from '../../../shared/logger/logger' +import { ToolkitError } from '../../../shared/errors' +import { SmusErrorCodes } from '../../shared/smusUtils' + +/** + * Authentication method types supported by SMUS + */ +export type SmusAuthenticationMethod = 'sso' | 'iam' + +/** + * Result of authentication method selection + */ +export interface AuthenticationMethodSelection { + method: SmusAuthenticationMethod +} + +/** + * Authentication method selection dialog for SMUS + */ +export class SmusAuthenticationMethodSelector { + private static readonly logger = getLogger() + + /** + * Shows the authentication method selection dialog matching the Figma design + * @param defaultMethod Optional default method to pre-select + * @returns Promise resolving to the selected authentication method + */ + public static async showAuthenticationMethodSelection( + defaultMethod?: SmusAuthenticationMethod + ): Promise { + const logger = this.logger + + const iamOption: vscode.QuickPickItem = { + label: '$(key) IAM Role', + description: 'SageMaker Unified Studio Lightning/Express', + detail: 'Use Lightning IAM role credentials to access your Unified Studio Lightning resources', + } + + const ssoOption: vscode.QuickPickItem = { + label: '$(organization) SSO', + description: 'SageMaker Unified Studio', + detail: "Use your organization's Single Sign-On to access Unified Studio resources", + } + + const options = [iamOption, ssoOption] + + // Set default selection based on preference + let defaultIndex = 0 + if (defaultMethod === 'sso') { + defaultIndex = 1 + } + + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Select a sign in method' + quickPick.placeholder = 'Choose how you want to authenticate with SageMaker Unified Studio' + quickPick.items = options + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Pre-select the default method + if (options[defaultIndex]) { + quickPick.activeItems = [options[defaultIndex]] + } + + return new Promise((resolve, reject) => { + let isCompleted = false + + quickPick.onDidAccept(() => { + const selectedItem = quickPick.selectedItems[0] + if (!selectedItem) { + quickPick.dispose() + reject( + new ToolkitError('No authentication method selected', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + return + } + + const method: SmusAuthenticationMethod = selectedItem === iamOption ? 'iam' : 'sso' + + logger.debug(`SMUS Auth: User selected authentication method: ${method}`) + + isCompleted = true + quickPick.dispose() + + // Return the selected method without asking about preferences + resolve({ method }) + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + reject( + new ToolkitError('Authentication method selection cancelled', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + } + }) + + quickPick.show() + }) + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts b/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts new file mode 100644 index 00000000000..7a242e943f4 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts @@ -0,0 +1,1466 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import * as path from 'path' +import { getLogger } from '../../../shared/logger/logger' +import { ToolkitError } from '../../../shared/errors' +import { loadSharedCredentialsProfiles } from '../../../auth/credentials/sharedCredentials' +import { getCredentialsFilename, getConfigFilename } from '../../../auth/credentials/sharedCredentialsFile' +import { SmusErrorCodes } from '../../shared/smusUtils' +import fs from '../../../shared/fs/fs' + +/** + * Result of IAM profile selection + */ +export interface IamProfileSelection { + profileName: string + region: string +} + +/** + * Result indicating user chose to edit credential files + */ +export interface IamProfileEditingInProgress { + isEditing: true + message: string +} + +/** + * Result indicating user chose to go back + */ +export interface IamProfileBackNavigation { + isBack: true + message: string +} + +/** + * IAM profile selection interface for SMUS + */ +export class SmusIamProfileSelector { + private static readonly logger = getLogger() + + /** + * Shows the IAM profile selection dialog matching the Figma design + * @returns Promise resolving to the selected profile and region, editing status, or back navigation + */ + public static async showIamProfileSelection(): Promise< + IamProfileSelection | IamProfileEditingInProgress | IamProfileBackNavigation + > { + const logger = this.logger + + try { + // Load available credential profiles + const profiles = await loadSharedCredentialsProfiles() + const profileNames = Object.keys(profiles) + + // Create QuickPick items for profiles + const profileItems: vscode.QuickPickItem[] = profileNames.map((profileName) => { + const profile = profiles[profileName] + const region = profile.region || 'not-set' + + return { + label: `$(key) ${profileName}`, + description: `IAM Credentials, configured locally (${region})`, + detail: `Profile: ${profileName} | Region: ${region}`, + // Store profile data for easy access + profileName, + region, + } as vscode.QuickPickItem & { profileName: string; region: string } + }) + + // Add "Add and edit credentials" option + const addCredentialsItem: vscode.QuickPickItem = { + label: '$(add) Add and edit credentials', + description: 'Manage AWS credential profiles', + detail: 'Add new profiles or edit existing credential files', + } + + const options = [...profileItems, addCredentialsItem] + + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Select an IAM Profile' + quickPick.placeholder = 'Choose an AWS credential profile to authenticate with SageMaker Unified Studio' + quickPick.items = options + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Add back button + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + return new Promise((resolve, reject) => { + let isCompleted = false + + quickPick.onDidAccept(() => { + const selectedItem = quickPick.selectedItems[0] + if (!selectedItem) { + quickPick.dispose() + reject( + new ToolkitError('No profile selected', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + return + } + + isCompleted = true + quickPick.dispose() + + // Check if user selected "Add and edit credentials" + if (selectedItem === addCredentialsItem) { + // Handle the async credential management flow + void (async () => { + try { + const shouldRestart = await SmusIamProfileSelector.showCredentialManagement() + if (shouldRestart) { + // Only restart if user completed the "Add New Profile" flow + const result = await SmusIamProfileSelector.showIamProfileSelection() + resolve(result) + } else { + // User chose to edit files, return a special result indicating this + resolve({ + isEditing: true, + message: + 'User chose to edit credential files. Please complete setup and try again.', + }) + } + } catch (error) { + // Handle user cancellation gracefully + if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { + resolve({ + isEditing: true, + message: 'User cancelled credential management.', + }) + } else { + reject(error) + } + } + })() + return + } + + // User selected an existing profile + const profileItem = selectedItem as vscode.QuickPickItem & { profileName: string; region: string } + + logger.debug(`SMUS Auth: User selected profile: ${profileItem.profileName}`) + + // Check if region is not set and prompt for region selection + if (profileItem.region === 'not-set') { + void (async () => { + try { + const selectedRegion = await SmusIamProfileSelector.showRegionSelection() + + // Update the profile with the selected region + await SmusIamProfileSelector.updateProfileRegion( + profileItem.profileName, + selectedRegion + ) + + resolve({ + profileName: profileItem.profileName, + region: selectedRegion, + }) + } catch (error) { + reject(error) + } + })() + } else { + resolve({ + profileName: profileItem.profileName, + region: profileItem.region, + }) + } + }) + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve({ + isBack: true, + message: 'User chose to go back to authentication method selection.', + }) + } + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + reject( + new ToolkitError('Profile selection cancelled', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + } + }) + + quickPick.show() + }) + } catch (error) { + // Don't log or chain user cancellation as an error + if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { + throw error + } + logger.error('SMUS Auth: Failed to show IAM profile selection: %s', error) + throw ToolkitError.chain(error, 'Failed to show IAM profile selection') + } + } + + /** + * Shows region selection dialog for IAM authentication + * @param defaultRegion Optional default region to pre-select + * @returns Promise resolving to the selected region or 'BACK' if user wants to go back + */ + public static async showRegionSelection(defaultRegion?: string): Promise { + const logger = this.logger + + // Common AWS regions + const regions = [ + { name: 'US East (N. Virginia)', code: 'us-east-1' }, + { name: 'US East (Ohio)', code: 'us-east-2' }, + { name: 'US West (Oregon)', code: 'us-west-2' }, + { name: 'US West (N. California)', code: 'us-west-1' }, + { name: 'Europe (Ireland)', code: 'eu-west-1' }, + { name: 'Europe (London)', code: 'eu-west-2' }, + { name: 'Europe (Frankfurt)', code: 'eu-central-1' }, + { name: 'Asia Pacific (Singapore)', code: 'ap-southeast-1' }, + { name: 'Asia Pacific (Sydney)', code: 'ap-southeast-2' }, + { name: 'Asia Pacific (Tokyo)', code: 'ap-northeast-1' }, + ] + + const regionItems: vscode.QuickPickItem[] = regions.map( + (region) => + ({ + label: region.name, + description: region.code, + detail: `AWS Region: ${region.code}`, + regionCode: region.code, + }) as vscode.QuickPickItem & { regionCode: string } + ) + + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Select AWS Region' + quickPick.placeholder = 'Choose the AWS region for SageMaker Unified Studio' + quickPick.items = regionItems + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Add back button + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + // Pre-select default region if provided + if (defaultRegion) { + const defaultItem = regionItems.find((item) => (item as any).regionCode === defaultRegion) + if (defaultItem) { + quickPick.activeItems = [defaultItem] + } + } + + return new Promise((resolve, reject) => { + let isCompleted = false + + quickPick.onDidAccept(() => { + const selectedItem = quickPick.selectedItems[0] + if (!selectedItem) { + quickPick.dispose() + reject( + new ToolkitError('No region selected', { code: SmusErrorCodes.UserCancelled, cancelled: true }) + ) + return + } + + isCompleted = true + quickPick.dispose() + + const regionItem = selectedItem as vscode.QuickPickItem & { regionCode: string } + + logger.debug(`SMUS Auth: User selected region: ${regionItem.regionCode}`) + + resolve(regionItem.regionCode) + }) + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + reject( + new ToolkitError('Region selection cancelled', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + } + }) + + quickPick.show() + }) + } + + /** + * Validates an IAM credential profile + * @param profileName Profile name to validate + * @returns Promise resolving to validation result + */ + public static async validateProfile(profileName: string): Promise<{ isValid: boolean; error?: string }> { + const logger = this.logger + + try { + logger.debug(`SMUS Auth: Validating profile: ${profileName}`) + + // Load profiles to check if the profile exists + const profiles = await loadSharedCredentialsProfiles() + + if (!profiles[profileName]) { + return { + isValid: false, + error: `Profile '${profileName}' not found in AWS credentials`, + } + } + + const profile = profiles[profileName] + + // Basic validation - check for required fields + if (!profile.aws_access_key_id && !profile.role_arn && !profile.sso_start_url) { + return { + isValid: false, + error: `Profile '${profileName}' is missing required credentials`, + } + } + + logger.debug(`SMUS Auth: Profile validation successful: ${profileName}`) + + return { isValid: true } + } catch (error) { + logger.error(`SMUS Auth: Profile validation failed: ${profileName}`, error) + + return { + isValid: false, + error: `Failed to validate profile '${profileName}': ${(error as Error).message}`, + } + } + } + + /** + * Shows credential management options (Add/Edit credentials) + * @returns Promise resolving to boolean indicating if profile selection should restart + */ + public static async showCredentialManagement(): Promise { + const logger = this.logger + + logger.debug('SMUS Auth: Showing credential management options') + + const options: vscode.QuickPickItem[] = [ + { + label: '$(file-text) Edit AWS Credentials File', + description: 'Open ~/.aws/credentials file for editing', + detail: 'Edit existing credential profiles or add new ones', + }, + { + label: '$(file-text) Edit AWS Config File', + description: 'Open ~/.aws/config file for editing', + detail: 'Edit AWS configuration settings and profiles', + }, + { + label: '$(add) Add New Profile', + description: 'Create a new AWS credential profile', + detail: 'Interactive setup for a new credential profile', + }, + ] + + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Manage AWS Credentials' + quickPick.placeholder = 'Choose how you want to manage your AWS credentials' + quickPick.items = options + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Add back button + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + return new Promise((resolve, reject) => { + let isCompleted = false + + quickPick.onDidAccept(() => { + const selectedItem = quickPick.selectedItems[0] + if (!selectedItem) { + quickPick.dispose() + reject( + new ToolkitError('No option selected', { code: SmusErrorCodes.UserCancelled, cancelled: true }) + ) + return + } + + isCompleted = true + quickPick.dispose() + + // Handle the async operations after disposing the quick pick + void (async () => { + try { + if (selectedItem.label.includes('Edit AWS Credentials File')) { + const result = await this.openCredentialsFile() + // If user clicked "Select Profile", restart profile selection + resolve(result === 'RESTART_PROFILE_SELECTION') + } else if (selectedItem.label.includes('Edit AWS Config File')) { + const result = await this.openConfigFile() + // If user clicked "Select Profile", restart profile selection + resolve(result === 'RESTART_PROFILE_SELECTION') + } else if (selectedItem.label.includes('Add New Profile')) { + await this.addNewProfile() + // Restart profile selection after adding new profile + resolve(true) + } + } catch (error) { + if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { + // User cancelled, don't treat as error + reject(error) + } else { + reject(error) + } + } + })() + }) + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + // User wants to go back to profile selection + resolve(true) + } + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + reject( + new ToolkitError('Credential management cancelled', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + } + }) + + quickPick.show() + }) + } + + /** + * Opens the AWS credentials file in VS Code editor + */ + private static async openCredentialsFile(): Promise { + const logger = this.logger + + try { + const credentialsPath = getCredentialsFilename() + logger.debug(`SMUS Auth: Opening credentials file: ${credentialsPath}`) + + // Ensure the .aws directory exists + await this.ensureAwsDirectoryExists() + + // Create the file if it doesn't exist + if (!(await fs.existsFile(credentialsPath))) { + await fs.writeFile(credentialsPath, this.getDefaultCredentialsContent()) + logger.debug('SMUS Auth: Created new credentials file') + } + + // Open the file in VS Code + const document = await vscode.workspace.openTextDocument(credentialsPath) + await vscode.window.showTextDocument(document) + + // Show helpful message with options + const action = await vscode.window.showInformationMessage( + 'AWS credentials file opened. You can edit your profiles or select an existing one.', + 'Select Profile', + 'Open Credentials File', + 'Done' + ) + + if (action === 'Select Profile') { + // Directly restart profile selection - much cleaner than throwing errors + return 'RESTART_PROFILE_SELECTION' + } else if (action === 'Open Credentials File') { + // Keep the file open and let user edit + // File is already open, nothing more to do + } + // If "Done" or dismissed, just continue + + logger.debug('SMUS Auth: Credentials file opened successfully') + } catch (error) { + logger.error('SMUS Auth: Failed to open credentials file: %s', error) + throw new ToolkitError(`Failed to open AWS credentials file: ${(error as Error).message}`, { + code: 'CredentialsFileError', + }) + } + } + + /** + * Opens the AWS config file in VS Code editor + */ + private static async openConfigFile(): Promise { + const logger = this.logger + + try { + const configPath = getConfigFilename() + logger.debug(`SMUS Auth: Opening config file: ${configPath}`) + + // Ensure the .aws directory exists + await this.ensureAwsDirectoryExists() + + // Create the file if it doesn't exist + if (!(await fs.existsFile(configPath))) { + await fs.writeFile(configPath, this.getDefaultConfigContent()) + logger.debug('SMUS Auth: Created new config file') + } + + // Open the file in VS Code + const document = await vscode.workspace.openTextDocument(configPath) + await vscode.window.showTextDocument(document) + + // Show helpful message with options + const action = await vscode.window.showInformationMessage( + 'AWS config file opened. You can edit your configuration or select an existing profile.', + 'Select Profile', + 'Open Config File', + 'Done' + ) + + if (action === 'Select Profile') { + // Directly restart profile selection - much cleaner than throwing errors + return 'RESTART_PROFILE_SELECTION' + } else if (action === 'Open Config File') { + // Keep the file open and let user edit + // File is already open, nothing more to do + } + // If "Done" or dismissed, just continue + + logger.debug('SMUS Auth: Config file opened successfully') + } catch (error) { + logger.error('SMUS Auth: Failed to open config file: %s', error) + throw new ToolkitError(`Failed to open AWS config file: ${(error as Error).message}`, { + code: 'ConfigFileError', + }) + } + } + + /** + * Interactive flow to add a new AWS credential profile with back navigation + */ + private static async addNewProfile(): Promise { + const logger = this.logger + + try { + logger.debug('SMUS Auth: Starting add new profile flow') + + const profileData = await this.collectProfileData() + + if (profileData === 'BACK') { + // User navigated back, throw error to go back to credential management + throw new ToolkitError('User navigated back', { code: SmusErrorCodes.UserCancelled, cancelled: true }) + } + + // Add the profile to credentials file + await this.addProfileToCredentialsFile( + profileData.profileName, + profileData.accessKeyId, + profileData.secretAccessKey, + profileData.sessionToken, + profileData.region + ) + + // Show success message + const openFile = await vscode.window.showInformationMessage( + `AWS profile '${profileData.profileName}' has been added successfully!`, + 'Open Credentials File', + 'Done' + ) + + if (openFile === 'Open Credentials File') { + await this.openCredentialsFile() + } + + logger.debug(`SMUS Auth: Successfully added new profile: ${profileData.profileName}`) + } catch (error) { + // Only log actual errors, not user cancellations + if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { + logger.debug('SMUS Auth: User cancelled add new profile flow') + throw error // Re-throw for telemetry but don't log as error + } + logger.error('SMUS Auth: Failed to add new profile: %s', error) + throw new ToolkitError(`Failed to add new profile: ${(error as Error).message}`, { + code: 'AddProfileError', + }) + } + } + + /** + * Collects profile data through a multi-step flow with back navigation + */ + private static async collectProfileData(): Promise< + | { + profileName: string + accessKeyId: string + secretAccessKey: string + sessionToken?: string + region?: string + } + | 'BACK' + > { + let currentStep = 1 + let profileName = '' + let accessKeyId = '' + let secretAccessKey = '' + let sessionToken = '' + let region = '' + + while (currentStep <= 5) { + switch (currentStep) { + case 1: { + // Step 1: Profile Name + const result = await this.getProfileNameInput() + if (result === 'BACK') { + return 'BACK' // Exit the entire flow + } + profileName = result + currentStep = 2 + break + } + case 2: { + // Step 2: Access Key ID + const result = await this.getAccessKeyIdInput() + if (result === 'BACK') { + currentStep = 1 // Go back to step 1 + } else { + accessKeyId = result + currentStep = 3 + } + break + } + case 3: { + // Step 3: Secret Access Key + const result = await this.getSecretAccessKeyInput() + if (result === 'BACK') { + currentStep = 2 // Go back to step 2 + } else { + secretAccessKey = result + currentStep = 4 + } + break + } + case 4: { + // Step 4: Session Token (optional) + const result = await this.getSessionTokenInput() + if (result === 'BACK') { + currentStep = 3 // Go back to step 3 + } else { + sessionToken = result + currentStep = 5 + } + break + } + case 5: { + // Step 5: Region (optional) + const result = await this.getRegionInput() + if (result === 'BACK') { + currentStep = 4 // Go back to step 4 + } else { + region = result + currentStep = 6 // Exit the loop + } + break + } + } + } + + return { + profileName, + accessKeyId, + secretAccessKey, + sessionToken: sessionToken || undefined, + region: region || undefined, + } + } + + /** + * Gets profile name input with back navigation and existing profile validation + */ + private static async getProfileNameInput(): Promise { + return new Promise((resolve) => { + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Add New AWS Profile - Step 1 of 5' + quickPick.placeholder = 'Type a profile name (e.g., my-profile, dev, prod)' + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Add back button + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + // Enable text input + quickPick.items = [] + + let isCompleted = false + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.onDidChangeValue(async (value) => { + // Show placeholder when empty + if (!value) { + quickPick.items = [ + { + label: '$(edit) Enter profile name', + description: 'e.g., my-profile, dev, prod', + detail: 'Profile names can contain letters, numbers, hyphens, and underscores', + }, + ] + return + } + + // Validate input as user types + if (value.includes(' ')) { + quickPick.items = [ + { + label: '$(error) Profile name cannot contain spaces', + description: 'Remove spaces from the profile name', + detail: 'Valid characters: letters, numbers, hyphens, underscores', + }, + ] + } else if (!/^[a-zA-Z0-9_-]*$/.test(value)) { + quickPick.items = [ + { + label: '$(error) Invalid characters in profile name', + description: 'Profile names can only contain letters, numbers, hyphens, and underscores', + detail: `Current input: "${value}"`, + }, + ] + } else if (value.length < 2) { + quickPick.items = [ + { + label: '$(info) Profile name is too short', + description: 'Profile names should be at least 2 characters long', + detail: `Current length: ${value.length} characters`, + }, + ] + } else { + // Check if profile already exists + try { + const profiles = await loadSharedCredentialsProfiles() + const profileExists = profiles[value] !== undefined + + if (profileExists) { + quickPick.items = [ + { + label: `$(warning) ${value}`, + description: 'Profile already exists - will be overwritten', + detail: 'Press Enter to overwrite the existing profile', + }, + ] + } else { + quickPick.items = [ + { + label: `$(check) ${value}`, + description: 'Press Enter to use this profile name', + detail: `Valid profile name (${value.length} characters)`, + }, + ] + } + } catch (error) { + // If we can't load profiles, just show as valid + quickPick.items = [ + { + label: `$(check) ${value}`, + description: 'Press Enter to use this profile name', + detail: `Valid profile name (${value.length} characters)`, + }, + ] + } + } + }) + + quickPick.onDidAccept(async () => { + const value = quickPick.value.trim() + + // Validate final input + if (!value || value.length < 2) { + return // Don't accept empty or too short input + } + if (value.includes(' ')) { + return // Don't accept names with spaces + } + if (!/^[a-zA-Z0-9_-]+$/.test(value)) { + return // Don't accept invalid characters + } + + // Check if profile exists and ask for confirmation + try { + const profiles = await loadSharedCredentialsProfiles() + const profileExists = profiles[value] !== undefined + + if (profileExists) { + isCompleted = true + quickPick.dispose() + + // Ask for confirmation to overwrite + const overwrite = await vscode.window.showWarningMessage( + `Profile '${value}' already exists. Do you want to overwrite it?`, + { modal: true }, + 'Overwrite' + ) + + if (overwrite === 'Overwrite') { + resolve(value) + } else { + // User cancelled, restart the input + const result = await this.getProfileNameInput() + resolve(result) + } + return + } + } catch (error) { + // If we can't load profiles, just continue + } + + isCompleted = true + quickPick.dispose() + resolve(value) + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.show() + }) + } + + /** + * Gets access key ID input with back navigation + */ + private static async getAccessKeyIdInput(): Promise { + return new Promise((resolve) => { + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Add New AWS Profile - Step 2 of 5' + quickPick.placeholder = 'Type your AWS Access Key ID (e.g., AKIAIOSFODNN7EXAMPLE)' + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Add back button + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + // Enable text input + quickPick.items = [] + + let isCompleted = false + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.onDidChangeValue((value) => { + // Show placeholder when empty + if (!value) { + quickPick.items = [ + { + label: '$(key) Enter AWS Access Key ID', + description: 'e.g., AKIAIOSFODNN7EXAMPLE', + detail: 'Access Key IDs are typically 16-32 characters long', + }, + ] + return + } + + // Validate input as user types + if (!/^[A-Z0-9]*$/.test(value)) { + quickPick.items = [ + { + label: '$(error) Invalid characters in Access Key ID', + description: 'Access Key IDs should only contain uppercase letters and numbers', + detail: `Current input: "${value}"`, + }, + ] + } else if (value.length < 16) { + quickPick.items = [ + { + label: '$(info) Access Key ID seems short', + description: 'Access Key IDs are typically 16-32 characters long', + detail: `Current length: ${value.length} characters`, + }, + ] + } else if (value.length > 32) { + quickPick.items = [ + { + label: '$(error) Access Key ID seems too long', + description: 'Access Key IDs are typically 16-32 characters long', + detail: `Current length: ${value.length} characters`, + }, + ] + } else { + quickPick.items = [ + { + label: `$(check) ${value}`, + description: 'Press Enter to use this Access Key ID', + detail: `Valid Access Key ID (${value.length} characters)`, + }, + ] + } + }) + + quickPick.onDidAccept(() => { + const value = quickPick.value.trim() + + // Validate final input + if (!value) { + return // Don't accept empty input + } + if (value.length < 16 || value.length > 32) { + return // Don't accept invalid length + } + + isCompleted = true + quickPick.dispose() + resolve(value) + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.show() + }) + } + + /** + * Gets secret access key input with back navigation + */ + private static async getSecretAccessKeyInput(): Promise { + return new Promise((resolve) => { + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Add New AWS Profile - Step 3 of 5' + quickPick.placeholder = 'Type your AWS Secret Access Key (will be hidden when typing)' + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Add back button + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + // Enable text input + quickPick.items = [] + + let isCompleted = false + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.onDidChangeValue((value) => { + // Show placeholder when empty + if (!value) { + quickPick.items = [ + { + label: '$(lock) Enter AWS Secret Access Key', + description: 'e.g., wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', + detail: 'Secret Access Keys are typically 40+ characters long', + }, + ] + return + } + + // Validate input as user types (but don't show the actual value for security) + if (value.length < 20) { + quickPick.items = [ + { + label: '$(info) Secret Access Key seems short', + description: 'Secret Access Keys are typically 40+ characters long', + detail: `Current length: ${value.length} characters`, + }, + ] + } else if (value.length >= 20) { + quickPick.items = [ + { + label: `$(check) Secret Access Key entered (${value.length} characters)`, + description: 'Press Enter to use this Secret Access Key', + detail: 'Secret key length looks good', + }, + ] + } + }) + + quickPick.onDidAccept(() => { + const value = quickPick.value.trim() + + // Validate final input + if (!value) { + return // Don't accept empty input + } + if (value.length < 20) { + return // Don't accept keys that are too short + } + + isCompleted = true + quickPick.dispose() + resolve(value) + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.show() + }) + } + + /** + * Gets session token input with back navigation + */ + private static async getSessionTokenInput(): Promise { + return new Promise((resolve) => { + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Add New AWS Profile - Step 4 of 5' + quickPick.placeholder = 'Enter your AWS Session Token (optional for temporary credentials)' + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + // Start with skip option only + quickPick.items = [ + { + label: '$(arrow-right) Skip', + description: 'Skip session token (for permanent credentials)', + detail: 'Use this for regular IAM user access keys', + }, + ] + + let isCompleted = false + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.onDidChangeValue((value) => { + if (!value) { + // Show skip option when empty + quickPick.items = [ + { + label: '$(arrow-right) Skip', + description: 'Skip session token (for permanent credentials)', + detail: 'Use this for regular IAM user access keys', + }, + ] + return + } + + // Validate input as user types + if (value.length < 50) { + quickPick.items = [ + { + label: '$(warning) Session token seems too short', + description: 'AWS session tokens are typically much longer', + detail: `Current length: ${value.length} characters`, + }, + { + label: '$(arrow-right) Skip', + description: 'Skip session token (for permanent credentials)', + detail: 'Use this for regular IAM user access keys', + }, + ] + } else { + quickPick.items = [ + { + label: '$(check) Use this session token', + description: 'Session token looks valid', + detail: `Length: ${value.length} characters`, + }, + { + label: '$(arrow-right) Skip', + description: 'Skip session token (for permanent credentials)', + detail: 'Use this for regular IAM user access keys', + }, + ] + } + }) + + quickPick.onDidAccept(() => { + const selectedItem = quickPick.selectedItems[0] + const currentValue = quickPick.value + + isCompleted = true + quickPick.dispose() + + // If user typed something and pressed Enter without selecting an item, use the typed value (trimmed) + if (!selectedItem && currentValue) { + resolve(currentValue.trim()) + return + } + + // If user selected skip or no selection with empty value + if (!selectedItem || selectedItem.label.includes('Skip')) { + resolve('') + return + } + + // If user selected "Use this session token", use the typed value (trimmed) + if (selectedItem.label.includes('Use this session token')) { + resolve(currentValue.trim()) + return + } + + // Default to empty + resolve('') + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.show() + }) + } + + /** + * Gets region input with back navigation + */ + private static async getRegionInput(): Promise { + return new Promise((resolve) => { + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'Add New AWS Profile - Step 5 of 5' + quickPick.placeholder = 'Select a default region (optional)' + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + const regions = [ + { name: 'US East (N. Virginia)', code: 'us-east-1' }, + { name: 'US East (Ohio)', code: 'us-east-2' }, + { name: 'US West (Oregon)', code: 'us-west-2' }, + { name: 'US West (N. California)', code: 'us-west-1' }, + { name: 'Europe (Ireland)', code: 'eu-west-1' }, + { name: 'Europe (London)', code: 'eu-west-2' }, + { name: 'Europe (Frankfurt)', code: 'eu-central-1' }, + { name: 'Asia Pacific (Singapore)', code: 'ap-southeast-1' }, + { name: 'Asia Pacific (Sydney)', code: 'ap-southeast-2' }, + { name: 'Asia Pacific (Tokyo)', code: 'ap-northeast-1' }, + ] + + const regionItems = regions.map((region) => ({ + label: region.name, + description: region.code, + detail: `AWS Region: ${region.code}`, + regionCode: region.code, + })) + + const skipItem = { + label: '$(arrow-right) Skip', + description: 'No default region', + detail: 'You can set this later if needed', + } + + quickPick.items = [...regionItems, skipItem] + + let isCompleted = false + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.onDidAccept(() => { + const selectedItem = quickPick.selectedItems[0] + if (!selectedItem) { + return + } + + isCompleted = true + quickPick.dispose() + + if (selectedItem === skipItem) { + resolve('') + } else { + const regionItem = selectedItem as any + resolve(regionItem.regionCode) + } + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.show() + }) + } + + /** + * Ensures the ~/.aws directory exists + */ + private static async ensureAwsDirectoryExists(): Promise { + const awsDir = path.join(fs.getUserHomeDir(), '.aws') + if (!(await fs.existsDir(awsDir))) { + await fs.mkdir(awsDir) + } + } + + /** + * Adds a new profile to the credentials file or overwrites existing one + */ + private static async addProfileToCredentialsFile( + profileName: string, + accessKeyId: string, + secretAccessKey: string, + sessionToken?: string, + region?: string + ): Promise { + const credentialsPath = getCredentialsFilename() + + // Ensure the .aws directory exists + await this.ensureAwsDirectoryExists() + + // Read existing content or create new + let content = '' + if (await fs.existsFile(credentialsPath)) { + content = await fs.readFileText(credentialsPath) + } + + // Create new profile lines (no spaces around =) + const newProfileLines = [ + `[${profileName}]`, + `aws_access_key_id=${accessKeyId}`, + `aws_secret_access_key=${secretAccessKey}`, + ] + + if (sessionToken) { + newProfileLines.push(`aws_session_token=${sessionToken}`) + } + + if (region) { + newProfileLines.push(`region=${region}`) + } + + // Parse the file line by line to handle profile replacement properly + const lines = content.split('\n') + const newLines: string[] = [] + let inTargetProfile = false + let profileFound = false + + for (let i = 0; i < lines.length; i++) { + const line = lines[i].trim() + + // Check if this is a profile header + if (line.startsWith('[') && line.endsWith(']')) { + const currentProfileName = line.slice(1, -1) + + if (currentProfileName === profileName) { + // Found the target profile - replace it + if (!profileFound) { + newLines.push(...newProfileLines) + profileFound = true + } + inTargetProfile = true + continue + } else { + // Different profile - end replacement mode + inTargetProfile = false + newLines.push(lines[i]) + } + } else if (!inTargetProfile) { + // Not in target profile, keep the line + newLines.push(lines[i]) + } + // If inTargetProfile is true, we skip the line (removing old profile content) + } + + // If profile wasn't found, add it at the end + if (!profileFound) { + if (newLines.length > 0 && newLines[newLines.length - 1].trim() !== '') { + newLines.push('') // Add blank line before new profile + } + newLines.push(...newProfileLines) + } + + // Update content with the new lines + content = newLines.join('\n') + + // Write back to file + await fs.writeFile(credentialsPath, content) + } + + /** + * Updates an existing profile with a new region + */ + private static async updateProfileRegion(profileName: string, region: string): Promise { + const logger = this.logger + + try { + logger.debug(`SMUS Auth: Updating profile ${profileName} with region ${region}`) + + const credentialsPath = getCredentialsFilename() + + if (!(await fs.existsFile(credentialsPath))) { + throw new ToolkitError('Credentials file not found', { code: 'CredentialsFileNotFound' }) + } + + // Read the current credentials file + const content = await fs.readFileText(credentialsPath) + + // Find the profile section + const profileSectionRegex = new RegExp(`^\\[${profileName}\\]$`, 'm') + const profileMatch = content.match(profileSectionRegex) + + if (!profileMatch) { + throw new ToolkitError(`Profile ${profileName} not found in credentials file`, { + code: 'ProfileNotFound', + }) + } + + // Find the next profile section or end of file + const profileStartIndex = profileMatch.index! + const nextProfileMatch = content.slice(profileStartIndex + 1).match(/^\[.*\]$/m) + const profileEndIndex = nextProfileMatch ? profileStartIndex + 1 + nextProfileMatch.index! : content.length + + // Extract the profile section + const profileSection = content.slice(profileStartIndex, profileEndIndex) + + // Check if region already exists in the profile + const regionRegex = /^region\s*=.*$/m + let updatedProfileSection: string + + if (regionRegex.test(profileSection)) { + // Replace existing region + updatedProfileSection = profileSection.replace(regionRegex, `region = ${region}`) + } else { + // Add region to the profile (before any empty lines at the end) + const lines = profileSection.split('\n') + // Find the last non-empty line index (compatible with older JS versions) + let lastNonEmptyIndex = -1 + for (let i = lines.length - 1; i >= 0; i--) { + if (lines[i].trim() !== '') { + lastNonEmptyIndex = i + break + } + } + lines.splice(lastNonEmptyIndex + 1, 0, `region = ${region}`) + updatedProfileSection = lines.join('\n') + } + + // Replace the profile section in the content + const updatedContent = + content.slice(0, profileStartIndex) + updatedProfileSection + content.slice(profileEndIndex) + + // Write back to file + await fs.writeFile(credentialsPath, updatedContent) + + logger.debug(`SMUS Auth: Successfully updated profile ${profileName} with region ${region}`) + } catch (error) { + logger.error('SMUS Auth: Failed to update profile region: %s', error) + throw new ToolkitError(`Failed to update profile region: ${(error as Error).message}`, { + code: 'UpdateProfileError', + }) + } + } + + /** + * Returns default content for a new credentials file + */ + private static getDefaultCredentialsContent(): string { + return `# AWS Credentials File +# +# This file stores your AWS access credentials. +# Each profile should have the following format: +# +# For permanent credentials: +# [profile-name] +# aws_access_key_id = YOUR_ACCESS_KEY_ID +# aws_secret_access_key = YOUR_SECRET_ACCESS_KEY +# region = us-east-1 +# +# For temporary/role-based credentials: +# [temp-profile] +# aws_access_key_id = YOUR_ACCESS_KEY_ID +# aws_secret_access_key = YOUR_SECRET_ACCESS_KEY +# aws_session_token = YOUR_SESSION_TOKEN +# region = us-east-1 +# +# Example: +# [default] +# aws_access_key_id = AKIAIOSFODNN7EXAMPLE +# aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY +# region = us-east-1 + +` + } + + /** + * Returns default content for a new config file + */ + private static getDefaultConfigContent(): string { + return `# AWS Config File +# +# This file stores AWS configuration settings. +# Each profile should have the following format: +# +# [profile profile-name] +# region = us-east-1 +# output = json +# +# For the default profile, use: +# [default] +# region = us-east-1 +# output = json + +` + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts b/packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts new file mode 100644 index 00000000000..2d2efaa15f8 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/ui/ssoAuthentication.ts @@ -0,0 +1,108 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { SmusUtils } from '../../shared/smusUtils' + +/** + * SSO authentication UI components for SMUS + */ +export class SmusSsoAuthenticationUI { + /** + * Shows domain URL input with back button support + */ + public static async showDomainUrlInput(): Promise { + return new Promise((resolve) => { + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'SageMaker Unified Studio Authentication' + quickPick.placeholder = 'Enter your SageMaker Unified Studio Domain URL' + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + // Add back button + const backButton = vscode.QuickInputButtons.Back + quickPick.buttons = [backButton] + + // Start with placeholder item + quickPick.items = [ + { + label: '$(globe) Enter Domain URL', + description: 'e.g., https://dzd_xxxxxxxxx.sagemaker.region.on.aws', + detail: 'Type your SageMaker Unified Studio domain URL above', + }, + ] + + let isCompleted = false + + quickPick.onDidTriggerButton((button) => { + if (button === backButton) { + isCompleted = true + quickPick.dispose() + resolve('BACK') + } + }) + + quickPick.onDidChangeValue((value) => { + if (!value) { + quickPick.items = [ + { + label: '$(globe) Enter Domain URL', + description: 'e.g., https://dzd_xxxxxxxxx.sagemaker.region.on.aws', + detail: 'Type your SageMaker Unified Studio domain URL above', + }, + ] + return + } + + // Validate input as user types + const validation = SmusUtils.validateDomainUrl(value) + if (validation) { + quickPick.items = [ + { + label: '$(error) Invalid Domain URL', + description: validation, + detail: `Current input: "${value}"`, + }, + ] + } else { + quickPick.items = [ + { + label: '$(check) Use this Domain URL', + description: 'Press Enter to connect', + detail: `Domain URL: ${value}`, + }, + ] + } + }) + + quickPick.onDidAccept(() => { + const value = quickPick.value.trim() + + // Validate final input + if (!value) { + return // Don't accept empty input + } + + const validation = SmusUtils.validateDomainUrl(value) + if (validation) { + return // Don't accept invalid URLs + } + + isCompleted = true + quickPick.dispose() + resolve(value) + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + resolve(undefined) // User cancelled + } + }) + + quickPick.show() + }) + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts index 8a686b48654..a0a34ae0549 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts @@ -44,9 +44,9 @@ export async function activate(extensionContext: vscode.ExtensionContext): Promi // Register the commands extensionContext.subscriptions.push( - smusLoginCommand.register(), + smusLoginCommand.register(extensionContext), smusLearnMoreCommand.register(), - smusSignOutCommand.register(), + smusSignOutCommand.register(extensionContext), treeView, vscode.commands.registerCommand('aws.smus.rootView.refresh', () => { treeDataProvider.refresh() diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index db3f6959969..453d1e05ab8 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -13,10 +13,12 @@ import { telemetry } from '../../../shared/telemetry/telemetry' import { createQuickPick } from '../../../shared/ui/pickerPrompter' import { SageMakerUnifiedStudioProjectNode } from './sageMakerUnifiedStudioProjectNode' import { SageMakerUnifiedStudioAuthInfoNode } from './sageMakerUnifiedStudioAuthInfoNode' -import { SmusErrorCodes, SmusUtils } from '../../shared/smusUtils' +import { SmusErrorCodes } from '../../shared/smusUtils' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { ToolkitError } from '../../../../src/shared/errors' import { recordAuthTelemetry } from '../../shared/telemetry' +import { SmusAuthenticationMethod } from '../../auth/ui/authenticationMethodSelection' +import { SmusAuthenticationOrchestrator } from '../../auth/authenticationOrchestrator' const contextValueSmusRoot = 'sageMakerUnifiedStudioRoot' const contextValueSmusLogin = 'sageMakerUnifiedStudioLogin' @@ -220,76 +222,71 @@ export const smusLearnMoreCommand = Commands.declare('aws.smus.learnMore', () => /** * Command to login to SageMaker Unified Studio */ -export const smusLoginCommand = Commands.declare('aws.smus.login', () => async () => { +export const smusLoginCommand = Commands.declare('aws.smus.login', (context: vscode.ExtensionContext) => async () => { const logger = getLogger() return telemetry.smus_login.run(async (span) => { try { - // Get DataZoneClient instance for URL validation - - // Show domain URL input dialog - const domainUrl = await vscode.window.showInputBox({ - title: 'SageMaker Unified Studio Authentication', - prompt: 'Enter your SageMaker Unified Studio Domain URL', - placeHolder: 'https://.sagemaker..on.aws', - validateInput: (value) => SmusUtils.validateDomainUrl(value), - }) - - if (!domainUrl) { - // User cancelled - logger.debug('User cancelled domain URL input') - throw new ToolkitError('User cancelled domain URL input', { - cancelled: true, - code: SmusErrorCodes.UserCancelled, - }) - } - - // Show a simple status bar message instead of progress dialog - vscode.window.setStatusBarMessage('Connecting to SageMaker Unified Studio...', 10000) - - try { - // Get the authentication provider instance - const authProvider = SmusAuthenticationProvider.fromContext() + // Get the authentication provider instance + const authProvider = SmusAuthenticationProvider.fromContext() - // Connect to SMUS using the authentication provider - const connection = await authProvider.connectToSmus(domainUrl) + // Import authentication method selection components + const { SmusAuthenticationMethodSelector } = await import('../../auth/ui/authenticationMethodSelection.js') + const { SmusAuthenticationPreferencesManager } = await import( + '../../auth/preferences/authenticationPreferences.js' + ) - if (!connection) { - throw new ToolkitError('Failed to establish connection', { - code: SmusErrorCodes.FailedAuthConnecton, - }) + // Check for preferred authentication method + const preferredMethod = SmusAuthenticationPreferencesManager.getPreferredMethod(context) + logger.debug(`SMUS Auth: Retrieved preferred method: ${preferredMethod}`) + + let selectedMethod: SmusAuthenticationMethod | undefined = preferredMethod + let authCompleted = false + + // Main authentication loop - handles back navigation + while (!authCompleted) { + // Check if we should skip method selection (user has a remembered preference) + if (selectedMethod) { + logger.debug(`SMUS Auth: Using authentication method: ${selectedMethod}`) + } else { + // Show authentication method selection dialog + logger.debug('SMUS Auth: Showing authentication method selection dialog') + const methodSelection = await SmusAuthenticationMethodSelector.showAuthenticationMethodSelection() + selectedMethod = methodSelection.method } - // Extract domain account ID, domain ID, and region for logging - const domainId = connection.domainId - const region = connection.ssoRegion - - logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) - await recordAuthTelemetry(span, authProvider, domainId, region) - - // Show success message - void vscode.window.showInformationMessage( - `Successfully connected to SageMaker Unified Studio domain: ${domainId}` - ) - - // Clear the status bar message - vscode.window.setStatusBarMessage('Connected to SageMaker Unified Studio', 3000) - - // Immediately refresh the tree view to show authenticated state - try { - await vscode.commands.executeCommand('aws.smus.rootView.refresh') - } catch (refreshErr) { - logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) + // Handle the selected authentication method + logger.debug(`SMUS Auth: Processing authentication method: ${selectedMethod}`) + if (selectedMethod === 'sso') { + // SSO Authentication - use SSO flow + const ssoResult = await SmusAuthenticationOrchestrator.handleSsoAuthentication( + authProvider, + span, + context + ) + + if (ssoResult === 'BACK') { + // User wants to go back to authentication method selection + selectedMethod = undefined // Reset to show method selection again + continue // Restart the loop + } + + authCompleted = true + } else { + // IAM Authentication - use new IAM profile selection flow + const iamResult = await SmusAuthenticationOrchestrator.handleIamAuthentication( + authProvider, + span, + context + ) + + if (iamResult === 'BACK') { + // User wants to go back to authentication method selection + selectedMethod = undefined // Reset to show method selection again + continue // Restart the loop + } + + authCompleted = true } - } catch (connectionErr) { - // Clear the status bar message - vscode.window.setStatusBarMessage('Connection to SageMaker Unified Studio Failed') - - // Log the error and re-throw to be handled by the outer catch block - logger.error('Connection failed: %s', (connectionErr as Error).message) - throw new ToolkitError('Connection failed.', { - cause: connectionErr as Error, - code: (connectionErr as Error).name, - }) } } catch (err) { const isUserCancelled = err instanceof ToolkitError && err.code === SmusErrorCodes.UserCancelled @@ -297,12 +294,9 @@ export const smusLoginCommand = Commands.declare('aws.smus.login', () => async ( void vscode.window.showErrorMessage( `SageMaker Unified Studio: Failed to initiate login: ${(err as Error).message}` ) + logger.error('Failed to initiate login: %s', (err as Error).message) } - logger.error('Failed to initiate login: %s', (err as Error).message) - throw new ToolkitError('Failed to initiate login.', { - cause: err as Error, - code: (err as Error).name, - }) + throw err } }) }) @@ -310,66 +304,75 @@ export const smusLoginCommand = Commands.declare('aws.smus.login', () => async ( /** * Command to sign out from SageMaker Unified Studio */ -export const smusSignOutCommand = Commands.declare('aws.smus.signOut', () => async () => { - const logger = getLogger() - return telemetry.smus_signOut.run(async (span) => { - try { - // Get the authentication provider instance - const authProvider = SmusAuthenticationProvider.fromContext() +export const smusSignOutCommand = Commands.declare( + 'aws.smus.signOut', + (context: vscode.ExtensionContext) => async () => { + const logger = getLogger() + return telemetry.smus_signOut.run(async (span) => { + try { + // Get the authentication provider instance + const authProvider = SmusAuthenticationProvider.fromContext() - // Check if there's an active connection to sign out from - if (!authProvider.isConnected()) { - void vscode.window.showInformationMessage( - 'No active SageMaker Unified Studio connection to sign out from.' - ) - return - } + // Check if there's an active connection to sign out from + if (!authProvider.isConnected()) { + void vscode.window.showInformationMessage( + 'No active SageMaker Unified Studio connection to sign out from.' + ) + return + } - // Get connection details for logging - const activeConnection = authProvider.activeConnection - const domainId = activeConnection?.domainId - const region = activeConnection?.ssoRegion + // Get connection details for logging + const activeConnection = authProvider.activeConnection + const domainId = activeConnection?.domainId + const region = activeConnection?.ssoRegion - // Show status message - vscode.window.setStatusBarMessage('Signing out from SageMaker Unified Studio...', 5000) - await recordAuthTelemetry(span, authProvider, domainId, region) + // Show status message + vscode.window.setStatusBarMessage('Signing out from SageMaker Unified Studio...', 5000) + await recordAuthTelemetry(span, authProvider, domainId, region) - // Delete the connection (this will also invalidate tokens and clear cache) - if (activeConnection) { - await authProvider.secondaryAuth.deleteConnection() - logger.info(`Signed out from SageMaker Unified Studio${domainId}`) - } + // Delete the connection (this will also invalidate tokens and clear cache) + if (activeConnection) { + await authProvider.secondaryAuth.deleteConnection() + logger.info(`Signed out from SageMaker Unified Studio: ${domainId}`) - // Show success message - void vscode.window.showInformationMessage('Successfully signed out from SageMaker Unified Studio.') + // Clear connection-specific preferences on sign out (but keep auth method preference) + const { SmusAuthenticationPreferencesManager } = await import( + '../../auth/preferences/authenticationPreferences.js' + ) + await SmusAuthenticationPreferencesManager.clearConnectionPreferences(context) + } - // Clear the status bar message - vscode.window.setStatusBarMessage('Signed out from SageMaker Unified Studio', 3000) + // Show success message + void vscode.window.showInformationMessage('Successfully signed out from SageMaker Unified Studio.') - // Refresh the tree view to show the sign-in state - try { - await vscode.commands.executeCommand('aws.smus.rootView.refresh') - } catch (refreshErr) { - logger.debug(`Failed to refresh views after sign out: ${(refreshErr as Error).message}`) - throw new ToolkitError('Failed to refresh views after sign out.', { - cause: refreshErr as Error, - code: (refreshErr as Error).name, + // Clear the status bar message + vscode.window.setStatusBarMessage('Signed out from SageMaker Unified Studio', 3000) + + // Refresh the tree view to show the sign-in state + try { + await vscode.commands.executeCommand('aws.smus.rootView.refresh') + } catch (refreshErr) { + logger.debug(`Failed to refresh views after sign out: ${(refreshErr as Error).message}`) + throw new ToolkitError('Failed to refresh views after sign out.', { + cause: refreshErr as Error, + code: (refreshErr as Error).name, + }) + } + } catch (err) { + void vscode.window.showErrorMessage( + `SageMaker Unified Studio: Failed to sign out: ${(err as Error).message}` + ) + logger.error('Failed to sign out: %s', (err as Error).message) + + // Log failure telemetry + throw new ToolkitError('Failed to sign out.', { + cause: err as Error, + code: (err as Error).name, }) } - } catch (err) { - void vscode.window.showErrorMessage( - `SageMaker Unified Studio: Failed to sign out: ${(err as Error).message}` - ) - logger.error('Failed to sign out: %s', (err as Error).message) - - // Log failure telemetry - throw new ToolkitError('Failed to sign out.', { - cause: err as Error, - code: (err as Error).name, - }) - } - }) -}) + }) + } +) function isAccessDenied(error: Error): boolean { return error.name.includes('AccessDenied') diff --git a/packages/core/src/shared/globalState.ts b/packages/core/src/shared/globalState.ts index edde0611e0b..48ace9df5b6 100644 --- a/packages/core/src/shared/globalState.ts +++ b/packages/core/src/shared/globalState.ts @@ -48,6 +48,7 @@ export type globalKey = | 'aws.toolkit.lsp.versions' | 'aws.toolkit.lsp.manifest' | 'aws.amazonq.customization.overrideV2' + | 'aws.smus.authenticationPreferences' | 'aws.amazonq.regionProfiles' | 'aws.amazonq.regionProfiles.cache' // Deprecated/legacy names. New keys should start with "aws.". diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts new file mode 100644 index 00000000000..095922dfc6f --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/authenticationOrchestrator.test.ts @@ -0,0 +1,76 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import { SmusAuthenticationOrchestrator } from '../../../sagemakerunifiedstudio/auth/authenticationOrchestrator' + +describe('SmusAuthenticationOrchestrator', function () { + // Note: Due to AWS Toolkit test framework restrictions on mocking vscode.window, + // these tests focus on the interface and behavior rather than deep mocking. + // The actual authentication flows are tested through integration tests. + + describe('handleIamAuthentication', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('handleIamAuthentication' in SmusAuthenticationOrchestrator) + assert.strictEqual(typeof SmusAuthenticationOrchestrator.handleIamAuthentication, 'function') + }) + + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + assert.ok('handleIamAuthentication' in SmusAuthenticationOrchestrator) + }) + }) + }) + + describe('handleSsoAuthentication', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('handleSsoAuthentication' in SmusAuthenticationOrchestrator) + assert.strictEqual(typeof SmusAuthenticationOrchestrator.handleSsoAuthentication, 'function') + }) + + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + assert.ok('handleSsoAuthentication' in SmusAuthenticationOrchestrator) + }) + }) + }) + + describe('return types', function () { + it('should handle SUCCESS and BACK return types correctly', function () { + // Test that the return types are properly defined for both methods + const testResult1: 'SUCCESS' | 'BACK' = 'SUCCESS' + const testResult2: 'SUCCESS' | 'BACK' = 'BACK' + + assert.strictEqual(testResult1, 'SUCCESS') + assert.strictEqual(testResult2, 'BACK') + }) + }) + + describe('class structure', function () { + it('should be a class with static methods', function () { + // Verify the orchestrator is properly structured + assert.strictEqual(typeof SmusAuthenticationOrchestrator, 'function') + assert.ok(SmusAuthenticationOrchestrator.prototype) + }) + + it('should have both required authentication methods', function () { + // Verify both authentication methods exist + const methods = ['handleIamAuthentication', 'handleSsoAuthentication'] + + for (const method of methods) { + assert.ok(method in SmusAuthenticationOrchestrator, `Missing method: ${method}`) + assert.strictEqual( + typeof SmusAuthenticationOrchestrator[method as keyof typeof SmusAuthenticationOrchestrator], + 'function', + `${method} should be a function` + ) + } + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.test.ts new file mode 100644 index 00000000000..06549830934 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/preferences/authenticationPreferences.test.ts @@ -0,0 +1,303 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import * as sinon from 'sinon' +import { + SmusAuthenticationPreferencesManager, + SmusAuthenticationPreferences, + SmusIamProfileConfig, +} from '../../../../sagemakerunifiedstudio/auth/preferences/authenticationPreferences' +import { globals } from '../../../../shared' + +describe('SmusAuthenticationPreferencesManager', function () { + let mockContext: any + let sandbox: sinon.SinonSandbox + let mockGlobalState: any + + beforeEach(function () { + sandbox = sinon.createSandbox() + + // Mock the globals.globalState instead of context.globalState directly + mockGlobalState = { + get: sandbox.stub(), + update: sandbox.stub().resolves(), + } + + // Mock VS Code extension context (still needed for the API) + mockContext = { + globalState: mockGlobalState, + } + + // Stub globals.globalState to use our mock + sandbox.stub(globals, 'globalState').value(mockGlobalState) + }) + + afterEach(function () { + sandbox.restore() + }) + + describe('getPreferences', function () { + it('should return default preferences when none are stored', function () { + // Setup + mockGlobalState.get.returns(undefined) + + // Act + const preferences = SmusAuthenticationPreferencesManager.getPreferences(mockContext) + + // Assert + assert.deepStrictEqual(preferences, { + rememberChoice: false, + }) + }) + + it('should return stored preferences when available', function () { + // Setup + const storedPreferences: SmusAuthenticationPreferences = { + preferredMethod: 'iam', + rememberChoice: true, + lastUsedSsoConnection: 'conn-123', + lastUsedIamProfile: { + profileName: 'default', + region: 'us-east-1', + lastUsed: new Date('2023-01-01'), + isDefault: true, + }, + } + mockGlobalState.get.returns(storedPreferences) + + // Act + const preferences = SmusAuthenticationPreferencesManager.getPreferences(mockContext) + + // Assert + assert.deepStrictEqual(preferences, storedPreferences) + }) + + it('should merge stored preferences with defaults', function () { + // Setup + const partialPreferences = { + preferredMethod: 'sso' as const, + } + mockGlobalState.get.returns(partialPreferences) + + // Act + const preferences = SmusAuthenticationPreferencesManager.getPreferences(mockContext) + + // Assert + assert.deepStrictEqual(preferences, { + preferredMethod: 'sso', + rememberChoice: false, + }) + }) + }) + + describe('updatePreferences', function () { + it('should update preferences correctly', async function () { + // Setup + const currentPreferences: SmusAuthenticationPreferences = { + preferredMethod: 'sso', + rememberChoice: true, + } + mockGlobalState.get.returns(currentPreferences) + + const updates = { + preferredMethod: 'iam' as const, + lastUsedSsoConnection: 'conn-456', + } + + // Act + await SmusAuthenticationPreferencesManager.updatePreferences(mockContext, updates) + + // Assert + assert.strictEqual(mockGlobalState.update.calledOnce, true) + const [key, updatedPreferences] = mockGlobalState.update.firstCall.args + assert.strictEqual(key, 'aws.smus.authenticationPreferences') + assert.deepStrictEqual(updatedPreferences, { + preferredMethod: 'iam', + rememberChoice: true, + lastUsedSsoConnection: 'conn-456', + }) + }) + }) + + describe('setPreferredMethod', function () { + it('should set preferred method and remember choice', async function () { + // Setup + mockGlobalState.get.returns({}) + + // Act + await SmusAuthenticationPreferencesManager.setPreferredMethod(mockContext, 'iam', true) + + // Assert + assert.strictEqual(mockGlobalState.update.calledOnce, true) + const [key, preferences] = mockGlobalState.update.firstCall.args + assert.strictEqual(key, 'aws.smus.authenticationPreferences') + assert.deepStrictEqual(preferences, { + preferredMethod: 'iam', + rememberChoice: true, + }) + }) + }) + + describe('getPreferredMethod', function () { + it('should return preferred method when remember choice is true', function () { + // Setup + const preferences: SmusAuthenticationPreferences = { + preferredMethod: 'iam', + rememberChoice: true, + } + mockGlobalState.get.returns(preferences) + + // Act + const method = SmusAuthenticationPreferencesManager.getPreferredMethod(mockContext) + + // Assert + assert.strictEqual(method, 'iam') + }) + + it('should return undefined when remember choice is false', function () { + // Setup + const preferences: SmusAuthenticationPreferences = { + preferredMethod: 'iam', + rememberChoice: false, + } + mockGlobalState.get.returns(preferences) + + // Act + const method = SmusAuthenticationPreferencesManager.getPreferredMethod(mockContext) + + // Assert + assert.strictEqual(method, undefined) + }) + + it('should return undefined when no preferred method is set', function () { + // Setup + const preferences: SmusAuthenticationPreferences = { + rememberChoice: true, + } + mockGlobalState.get.returns(preferences) + + // Act + const method = SmusAuthenticationPreferencesManager.getPreferredMethod(mockContext) + + // Assert + assert.strictEqual(method, undefined) + }) + }) + + describe('setLastUsedSsoConnection', function () { + it('should set last used SSO connection', async function () { + // Setup + mockGlobalState.get.returns({}) + + // Act + await SmusAuthenticationPreferencesManager.setLastUsedSsoConnection(mockContext, 'conn-789') + + // Assert + assert.strictEqual(mockGlobalState.update.calledOnce, true) + const [key, preferences] = mockGlobalState.update.firstCall.args + assert.strictEqual(key, 'aws.smus.authenticationPreferences') + assert.deepStrictEqual(preferences, { + rememberChoice: false, + lastUsedSsoConnection: 'conn-789', + }) + }) + }) + + describe('setLastUsedIamProfile', function () { + it('should set last used IAM profile with timestamp', async function () { + // Setup + mockGlobalState.get.returns({}) + const profileConfig: SmusIamProfileConfig = { + profileName: 'production', + region: 'us-west-2', + isDefault: false, + } + + // Act + await SmusAuthenticationPreferencesManager.setLastUsedIamProfile(mockContext, profileConfig) + + // Assert + assert.strictEqual(mockGlobalState.update.calledOnce, true) + const [key, preferences] = mockGlobalState.update.firstCall.args + assert.strictEqual(key, 'aws.smus.authenticationPreferences') + + assert.strictEqual(preferences.lastUsedIamProfile.profileName, 'production') + assert.strictEqual(preferences.lastUsedIamProfile.region, 'us-west-2') + assert.strictEqual(preferences.lastUsedIamProfile.isDefault, false) + assert.ok(preferences.lastUsedIamProfile.lastUsed instanceof Date) + }) + }) + + describe('getLastUsedIamProfile', function () { + it('should return last used IAM profile when available', function () { + // Setup + const profileConfig: SmusIamProfileConfig = { + profileName: 'test-profile', + region: 'eu-west-1', + lastUsed: new Date('2023-06-01'), + isDefault: true, + } + const preferences: SmusAuthenticationPreferences = { + rememberChoice: false, + lastUsedIamProfile: profileConfig, + } + mockGlobalState.get.returns(preferences) + + // Act + const result = SmusAuthenticationPreferencesManager.getLastUsedIamProfile(mockContext) + + // Assert + assert.deepStrictEqual(result, profileConfig) + }) + + it('should return undefined when no IAM profile is stored', function () { + // Setup + mockGlobalState.get.returns({}) + + // Act + const result = SmusAuthenticationPreferencesManager.getLastUsedIamProfile(mockContext) + + // Assert + assert.strictEqual(result, undefined) + }) + }) + + describe('clearPreferences', function () { + it('should clear all preferences', async function () { + // Act + await SmusAuthenticationPreferencesManager.clearPreferences(mockContext) + + // Assert + assert.strictEqual(mockGlobalState.update.calledOnce, true) + const [key, value] = mockGlobalState.update.firstCall.args + assert.strictEqual(key, 'aws.smus.authenticationPreferences') + assert.strictEqual(value, undefined) + }) + }) + + describe('switchAuthenticationMethod', function () { + it('should switch authentication method', async function () { + // Setup + const currentPreferences: SmusAuthenticationPreferences = { + preferredMethod: 'sso', + rememberChoice: true, + } + mockGlobalState.get.returns(currentPreferences) + + // Act + await SmusAuthenticationPreferencesManager.switchAuthenticationMethod(mockContext, 'iam') + + // Assert + assert.strictEqual(mockGlobalState.update.calledOnce, true) + const [key, preferences] = mockGlobalState.update.firstCall.args + assert.strictEqual(key, 'aws.smus.authenticationPreferences') + assert.deepStrictEqual(preferences, { + preferredMethod: 'iam', + rememberChoice: true, + }) + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.test.ts new file mode 100644 index 00000000000..e0332326be1 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.test.ts @@ -0,0 +1,39 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import { SmusAuthenticationMethodSelector } from '../../../../sagemakerunifiedstudio/auth/ui/authenticationMethodSelection' + +describe('SmusAuthenticationMethodSelector', function () { + // Note: Due to AWS Toolkit test framework restrictions on mocking vscode.window, + // these tests focus on the interface and behavior rather than deep mocking. + // The actual QuickPick functionality is tested through integration tests. + + describe('showAuthenticationMethodSelection', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('showAuthenticationMethodSelection' in SmusAuthenticationMethodSelector) + assert.strictEqual(typeof SmusAuthenticationMethodSelector.showAuthenticationMethodSelection, 'function') + }) + + it('should handle authentication method types correctly', function () { + // Test that the types are properly defined + const testMethod1: 'sso' | 'iam' = 'sso' + const testMethod2: 'sso' | 'iam' = 'iam' + + assert.strictEqual(testMethod1, 'sso') + assert.strictEqual(testMethod2, 'iam') + }) + + // The actual UI testing would be done manually or through E2E tests + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + // Just verify the method exists without calling it + assert.ok('showAuthenticationMethodSelection' in SmusAuthenticationMethodSelector) + }) + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts new file mode 100644 index 00000000000..61ab6095c5e --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts @@ -0,0 +1,173 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import { SmusIamProfileSelector } from '../../../../sagemakerunifiedstudio/auth/ui/iamProfileSelection' + +describe('SmusIamProfileSelector', function () { + // Note: Due to AWS Toolkit test framework restrictions on mocking vscode.window, + // these tests focus on the interface and behavior rather than deep mocking. + // The actual QuickPick functionality is tested through integration tests. + + describe('showIamProfileSelection', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('showIamProfileSelection' in SmusIamProfileSelector) + assert.strictEqual(typeof SmusIamProfileSelector.showIamProfileSelection, 'function') + }) + + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + assert.ok('showIamProfileSelection' in SmusIamProfileSelector) + }) + }) + + it('should handle return type union correctly', function () { + // Test that the return types are properly defined + const testResult1: { profileName: string; region: string } = { profileName: 'test', region: 'us-east-1' } + const testResult2: { isEditing: true; message: string } = { isEditing: true, message: 'editing' } + const testResult3: { isBack: true; message: string } = { isBack: true, message: 'back' } + + assert.strictEqual(testResult1.profileName, 'test') + assert.strictEqual(testResult1.region, 'us-east-1') + assert.strictEqual(testResult2.isEditing, true) + assert.strictEqual(testResult3.isBack, true) + }) + }) + + describe('showRegionSelection', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('showRegionSelection' in SmusIamProfileSelector) + assert.strictEqual(typeof SmusIamProfileSelector.showRegionSelection, 'function') + }) + + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + assert.ok('showRegionSelection' in SmusIamProfileSelector) + }) + }) + + it('should handle return type correctly', function () { + // Test that the return type is properly defined + const testResult: string = 'us-east-1' + assert.strictEqual(testResult, 'us-east-1') + }) + }) + + describe('validateProfile', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('validateProfile' in SmusIamProfileSelector) + assert.strictEqual(typeof SmusIamProfileSelector.validateProfile, 'function') + }) + + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + assert.ok('validateProfile' in SmusIamProfileSelector) + }) + }) + + it('should handle validation result type correctly', function () { + // Test that the return types are properly defined + const validResult: { isValid: boolean; error?: string } = { isValid: true } + const invalidResult: { isValid: boolean; error?: string } = { isValid: false, error: 'test error' } + + assert.strictEqual(validResult.isValid, true) + assert.strictEqual(validResult.error, undefined) + assert.strictEqual(invalidResult.isValid, false) + assert.strictEqual(invalidResult.error, 'test error') + }) + }) + + describe('showCredentialManagement', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('showCredentialManagement' in SmusIamProfileSelector) + assert.strictEqual(typeof SmusIamProfileSelector.showCredentialManagement, 'function') + }) + + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + assert.ok('showCredentialManagement' in SmusIamProfileSelector) + }) + }) + + it('should handle return type correctly', function () { + // Test that the return type is properly defined + const testResult1: boolean = true + const testResult2: boolean = false + + assert.strictEqual(testResult1, true) + assert.strictEqual(testResult2, false) + }) + }) + + describe('class structure', function () { + it('should be a class with static methods', function () { + // Verify the selector is properly structured + assert.strictEqual(typeof SmusIamProfileSelector, 'function') + assert.ok(SmusIamProfileSelector.prototype) + }) + + it('should have all required methods', function () { + // Verify all expected methods exist + const methods = [ + 'showIamProfileSelection', + 'showRegionSelection', + 'validateProfile', + 'showCredentialManagement', + ] + + for (const method of methods) { + assert.ok(method in SmusIamProfileSelector, `Missing method: ${method}`) + assert.strictEqual( + typeof SmusIamProfileSelector[method as keyof typeof SmusIamProfileSelector], + 'function', + `${method} should be a function` + ) + } + }) + }) + + describe('interface types', function () { + it('should handle IamProfileSelection interface correctly', function () { + // Test the interface structure + const selection: { profileName: string; region: string } = { + profileName: 'my-profile', + region: 'us-west-2', + } + + assert.strictEqual(selection.profileName, 'my-profile') + assert.strictEqual(selection.region, 'us-west-2') + }) + + it('should handle IamProfileEditingInProgress interface correctly', function () { + // Test the interface structure + const editing: { isEditing: true; message: string } = { + isEditing: true, + message: 'User is editing credentials', + } + + assert.strictEqual(editing.isEditing, true) + assert.strictEqual(editing.message, 'User is editing credentials') + }) + + it('should handle IamProfileBackNavigation interface correctly', function () { + // Test the interface structure + const back: { isBack: true; message: string } = { + isBack: true, + message: 'User chose to go back', + } + + assert.strictEqual(back.isBack, true) + assert.strictEqual(back.message, 'User chose to go back') + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/ssoAuthentication.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/ssoAuthentication.test.ts new file mode 100644 index 00000000000..6a4221ac7a4 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/ssoAuthentication.test.ts @@ -0,0 +1,40 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import { SmusSsoAuthenticationUI } from '../../../../sagemakerunifiedstudio/auth/ui/ssoAuthentication' + +describe('SmusSsoAuthenticationUI', function () { + // Note: Due to AWS Toolkit test framework restrictions on mocking vscode.window, + // these tests focus on the interface and behavior rather than deep mocking. + // The actual QuickPick functionality is tested through integration tests. + + describe('showDomainUrlInput', function () { + it('should export the correct interface', function () { + // Verify the class exists and has the expected static method + assert.ok('showDomainUrlInput' in SmusSsoAuthenticationUI) + assert.strictEqual(typeof SmusSsoAuthenticationUI.showDomainUrlInput, 'function') + }) + + it('should be callable without throwing', function () { + // Verify the method exists and is accessible + assert.doesNotThrow(() => { + // Just verify the method exists without calling it + assert.ok('showDomainUrlInput' in SmusSsoAuthenticationUI) + }) + }) + + it('should handle return type union correctly', function () { + // Test that the return types are properly defined + const testResult1: string | 'BACK' | undefined = 'https://example.com' + const testResult2: string | 'BACK' | undefined = 'BACK' + const testResult3: string | 'BACK' | undefined = undefined + + assert.strictEqual(testResult1, 'https://example.com') + assert.strictEqual(testResult2, 'BACK') + assert.strictEqual(testResult3, undefined) + }) + }) +}) From 9cc1567a9f5bd515fedb70f9e790a0d2929aa9aa Mon Sep 17 00:00:00 2001 From: kzr Date: Thu, 2 Oct 2025 11:26:28 -0700 Subject: [PATCH 02/53] feat(smus): Add DataZone Preferences client (#2237) ## Problem Need to get the domain info ## Solution Add DataZone Preferences client --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Co-authored-by: Sherry Lu --- .gitignore | 1 + .../scripts/build/generateServiceClient.ts | 4 + .../client/datazoneDomainPreferencesClient.ts | 307 + .../client/datazonedomainpreferences.json | 24917 ++++++++++++++++ .../datazoneDomainPreferencesClient.test.ts | 345 + 5 files changed, 25574 insertions(+) create mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json create mode 100644 packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts diff --git a/.gitignore b/.gitignore index 58b3fc5b72a..06cc03f7166 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,7 @@ src.gen/* **/src/auth/sso/oidcclientpkce.d.ts **/src/sagemakerunifiedstudio/shared/client/gluecatalogapi.d.ts **/src/sagemakerunifiedstudio/shared/client/sqlworkbench.d.ts +**/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.d.ts # Generated by tests **/src/testFixtures/**/bin diff --git a/packages/core/scripts/build/generateServiceClient.ts b/packages/core/scripts/build/generateServiceClient.ts index de601e6ee44..dbffa213de6 100644 --- a/packages/core/scripts/build/generateServiceClient.ts +++ b/packages/core/scripts/build/generateServiceClient.ts @@ -249,6 +249,10 @@ void (async () => { serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/sqlworkbench.json', serviceName: 'SQLWorkbench', }, + { + serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json', + serviceName: 'DataZoneDomainPreferences', + }, ] await generateServiceClients(serviceClientDefinitions) })() diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts new file mode 100644 index 00000000000..edbae250ea2 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts @@ -0,0 +1,307 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { getLogger } from '../../../shared/logger/logger' +import apiConfig = require('./datazonedomainpreferences.json') +import globals from '../../../shared/extensionGlobals' +import { Service, AWSError } from 'aws-sdk' +import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' +import * as DataZoneDomainPreferences from './datazonedomainpreferences' +import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' +import * as AWS from 'aws-sdk' + +export type ListDomainsOutput = DataZoneDomainPreferences.Types.ListDomainsOutput +export type GetDomainOutput = DataZoneDomainPreferences.Types.GetDomainOutput + +export interface DataZoneDomain { + id: string + name: string + description?: string + arn: string + managedAccountId: string + status: string + portalUrl?: string + createdAt?: Date + lastUpdatedAt?: Date + domainVersion?: string + preferences?: any +} + +/** + * Client for interacting with AWS DataZone API + */ +export class DataZoneDomainPreferencesClient { + private datazoneDomainPreferencesClient: DataZoneDomainPreferences | undefined + private static instances = new Map() + private readonly logger = getLogger() + + private constructor( + private readonly authProvider: SmusAuthenticationProvider, + private readonly region: string + ) {} + + /** + * Gets a singleton instance of the DataZoneDomainPreferencesClient + * @returns DataZoneDomainPreferencesClient instance + */ + public static getInstance( + authProvider: SmusAuthenticationProvider, + region: string + ): DataZoneDomainPreferencesClient { + const logger = getLogger() + + const instanceKey = `${region}` + + // Check if we already have an instance for this instanceKey + if (DataZoneDomainPreferencesClient.instances.has(instanceKey)) { + const existingInstance = DataZoneDomainPreferencesClient.instances.get(instanceKey)! + logger.debug(`DataZoneDomainPreferencesClient: Using existing instance for instanceKey ${instanceKey}`) + return existingInstance + } + + // Create new instance + logger.debug('DataZoneDomainPreferencesClient: Creating new instance') + const instance = new DataZoneDomainPreferencesClient(authProvider, region) + DataZoneDomainPreferencesClient.instances.set(instanceKey, instance) + + // Set up cleanup when connection changes + const disposable = authProvider.onDidChangeActiveConnection(() => { + logger.debug( + `DataZoneDomainPreferencesClient: Connection changed, cleaning up instance for: ${instanceKey}` + ) + DataZoneDomainPreferencesClient.instances.delete(instanceKey) + instance.datazoneDomainPreferencesClient = undefined + disposable.dispose() + }) + + logger.debug(`DataZoneDomainPreferencesClient: Created instance with instanceKey ${instanceKey}`) + + return instance + } + + /** + * Disposes all instances and cleans up resources + */ + public static dispose(): void { + const logger = getLogger() + logger.debug('DataZoneDomainPreferencesClient: Disposing all instances') + + for (const [key, instance] of DataZoneDomainPreferencesClient.instances.entries()) { + instance.datazoneDomainPreferencesClient = undefined + logger.debug(`DataZoneDomainPreferencesClient: Disposed instance for: ${key}`) + } + + DataZoneDomainPreferencesClient.instances.clear() + } + + /** + * Gets the AWS region + * @returns AWS region + */ + public getRegion(): string { + return this.region + } + + /** + * Gets the DataZone client, initializing it if necessary + */ + private async getDataZoneDomainPreferencesClient(): Promise { + if (!this.datazoneDomainPreferencesClient) { + try { + this.logger.info('DataZoneDomainPreferencesClient: Creating authenticated DataZone client') + + // dummmy call to silence the 'authProvider' is declared but its value is never read + this.authProvider.isConnected() + + // Stubbed credentials - replace with actual credential provider + const provider = () => { + const credentials = new AWS.Credentials({ + accessKeyId: '', + secretAccessKey: '', + sessionToken: '', + }) + + credentials.get = (callback) => { + try { + credentials.accessKeyId = 'xyz' + credentials.secretAccessKey = 'xyz' + credentials.sessionToken = 'xyz' + credentials.expireTime = new Date('2025-10-01T04:48:46+00:00') + + callback(undefined) + } catch (err) { + callback(err as AWSError) + } + } + + // Override needsRefresh to delegate to the connection credentials provider + credentials.needsRefresh = () => { + return true // Always call refresh, this is okay because there is caching existing in credential provider + } + + // Override refresh to use the connection credentials provider + credentials.refresh = (callback) => { + credentials.get(callback) + } + + return credentials + } + + this.datazoneDomainPreferencesClient = (await globals.sdkClientBuilder.createAwsService( + Service, + { + apiConfig: apiConfig, + endpoint: `https://datazone.${this.region}.api.aws`, + region: this.region, + credentialProvider: new AWS.CredentialProviderChain([provider]), + } as ServiceConfigurationOptions, + undefined, + false + )) as DataZoneDomainPreferences + + this.logger.info('DataZonePreferencesClient: Successfully created authenticated DataZone client') + } catch (err) { + this.logger.error('DataZonePreferencesClient: Failed to create DataZone client: %s', err as Error) + throw err + } + } + return this.datazoneDomainPreferencesClient + } + + /** + * Lists domains in DataZone with pagination support + * @param options Options for listing domains + * @returns Paginated list of DataZone domains with nextToken + */ + public async listDomains(options?: { + maxResults?: number + status?: string + nextToken?: string + }): Promise<{ domains: DataZoneDomain[]; nextToken?: string }> { + try { + this.logger.info(`DataZoneDomainPreferencesClient: Listing domains in region ${this.region}`) + + const datazoneDomainPreferencesClient = await this.getDataZoneDomainPreferencesClient() + + // Call DataZone API to list domains with pagination + const response = await datazoneDomainPreferencesClient + .listDomains({ + maxResults: options?.maxResults, + status: options?.status, + nextToken: options?.nextToken, + }) + .promise() + + if (!response.items || response.items.length === 0) { + this.logger.info(`DataZoneDomainPreferencesClient: No domains found`) + return { domains: [] } + } + + // Map the response to our DataZoneDomain interface + const domains: DataZoneDomain[] = response.items.map((domain) => ({ + id: domain.id || '', + name: domain.name || '', + description: domain.description, + arn: domain.arn || '', + managedAccountId: domain.managedAccountId || '', + status: domain.status || '', + portalUrl: domain.portalUrl, + createdAt: domain.createdAt ? new Date(domain.createdAt) : undefined, + lastUpdatedAt: domain.lastUpdatedAt ? new Date(domain.lastUpdatedAt) : undefined, + domainVersion: domain.domainVersion, + preferences: domain.preferences, + })) + + this.logger.debug(`DataZoneDomainPreferencesClient: Found ${domains.length} domains`) + return { domains, nextToken: response.nextToken } + } catch (err) { + this.logger.error('DataZoneDomainPreferencesClient: Failed to list domains: %s', (err as Error).message) + throw err + } + } + + /** + * Fetches all domains by handling pagination automatically + * @param options Options for listing domains (excluding nextToken which is handled internally) + * @returns Promise resolving to an array of all DataZone domains + */ + public async fetchAllDomains(options?: { status?: string }): Promise { + try { + let allDomains: DataZoneDomain[] = [] + let nextToken: string | undefined + do { + const maxResultsPerPage = 25 + const response = await this.listDomains({ + ...options, + nextToken, + maxResults: maxResultsPerPage, + }) + allDomains = [...allDomains, ...response.domains] + nextToken = response.nextToken + } while (nextToken) + + this.logger.debug(`DataZoneDomainPreferencesClient: Fetched a total of ${allDomains.length} domains`) + return allDomains + } catch (err) { + this.logger.error( + 'DataZoneDomainPreferencesClient: Failed to fetch all domains: %s', + (err as Error).message + ) + throw err + } + } + + /** + * Gets the domain with EXPRESS mode in preferences using pagination with early termination + * @returns Promise resolving to the DataZone domain or undefined if not found + */ + public async getExpressDomain(): Promise { + const logger = getLogger() + + try { + logger.info('DataZoneDomainPreferencesClient: Getting the domain info') + + let nextToken: string | undefined + let totalDomainsChecked = 0 + const maxResultsPerPage = 25 + + // Paginate through domains and check each page for EXPRESS domain + do { + const response = await this.listDomains({ + status: 'AVAILABLE', + nextToken, + maxResults: maxResultsPerPage, + }) + + const { domains } = response + totalDomainsChecked += domains.length + + logger.debug( + `DataZoneDomainPreferencesClient: Checking ${domains.length} domains in current page (total checked: ${totalDomainsChecked})` + ) + + // Check each domain in the current page for EXPRESS mode + for (const domain of domains) { + if (domain.preferences && domain.preferences.DOMAIN_MODE === 'EXPRESS') { + logger.info( + `DataZoneDomainPreferencesClient: Found EXPRESS domain, id: ${domain.id} (${domain.name})` + ) + return domain + } + } + + nextToken = response.nextToken + } while (nextToken) + + logger.info( + `DataZoneDomainPreferencesClient: No domain with (DOMAIN_MODE: EXPRESS) found after checking all ${totalDomainsChecked} domains` + ) + return undefined + } catch (err) { + logger.error('DataZoneDomainPreferencesClient: Failed to get domain info: %s', err as Error) + throw new Error(`Failed to get domain info: ${(err as Error).message}`) + } + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json b/packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json new file mode 100644 index 00000000000..00ef0fbd044 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json @@ -0,0 +1,24917 @@ +{ + "version": "2.0", + "metadata": { + "apiVersion": "2018-05-10", + "auth": ["aws.auth#sigv4"], + "endpointPrefix": "datazone", + "protocol": "rest-json", + "protocols": ["rest-json"], + "serviceFullName": "Amazon DataZone", + "serviceId": "DataZone", + "signatureVersion": "v4", + "signingName": "datazone", + "uid": "datazone-2018-05-10" + }, + "operations": { + "GetDomain": { + "name": "GetDomain", + "http": { + "method": "GET", + "requestUri": "/v2/domains/{identifier}", + "responseCode": 200 + }, + "input": { + "shape": "GetDomainInput" + }, + "output": { + "shape": "GetDomainOutput" + }, + "errors": [ + { + "shape": "InternalServerException" + }, + { + "shape": "ResourceNotFoundException" + }, + { + "shape": "AccessDeniedException" + }, + { + "shape": "ThrottlingException" + }, + { + "shape": "ServiceQuotaExceededException" + }, + { + "shape": "ValidationException" + }, + { + "shape": "UnauthorizedException" + } + ], + "readonly": true + }, + "ListDomains": { + "name": "ListDomains", + "http": { + "method": "GET", + "requestUri": "/v2/domains", + "responseCode": 200 + }, + "input": { + "shape": "ListDomainsInput" + }, + "output": { + "shape": "ListDomainsOutput" + }, + "errors": [ + { + "shape": "InternalServerException" + }, + { + "shape": "ResourceNotFoundException" + }, + { + "shape": "AccessDeniedException" + }, + { + "shape": "ThrottlingException" + }, + { + "shape": "ServiceQuotaExceededException" + }, + { + "shape": "ConflictException" + }, + { + "shape": "ValidationException" + }, + { + "shape": "UnauthorizedException" + } + ], + "readonly": true + } + }, + "shapes": { + "AcceptChoice": { + "type": "structure", + "required": ["predictionTarget"], + "members": { + "predictionTarget": { + "shape": "String" + }, + "predictionChoice": { + "shape": "Integer" + }, + "editedValue": { + "shape": "EditedValue" + } + } + }, + "AcceptChoices": { + "type": "list", + "member": { + "shape": "AcceptChoice" + } + }, + "AcceptPredictionsInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "revision": { + "shape": "Revision", + "location": "querystring", + "locationName": "revision" + }, + "acceptRule": { + "shape": "AcceptRule" + }, + "acceptChoices": { + "shape": "AcceptChoices" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "AcceptPredictionsOutput": { + "type": "structure", + "required": ["domainId", "assetId", "revision"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "assetId": { + "shape": "AssetId" + }, + "revision": { + "shape": "Revision" + } + } + }, + "AcceptRule": { + "type": "structure", + "members": { + "rule": { + "shape": "AcceptRuleBehavior" + }, + "threshold": { + "shape": "Float" + } + } + }, + "AcceptRuleBehavior": { + "type": "string", + "enum": ["ALL", "NONE"] + }, + "AcceptSubscriptionRequestInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionRequestId", + "location": "uri", + "locationName": "identifier" + }, + "decisionComment": { + "shape": "DecisionComment" + }, + "assetScopes": { + "shape": "AcceptedAssetScopes" + }, + "expirationTimestamp": { + "shape": "SyntheticTimestamp_date_time" + }, + "assetPermissions": { + "shape": "AssetPermissions" + } + } + }, + "AcceptSubscriptionRequestOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "requestReason", + "subscribedPrincipals", + "subscribedListings" + ], + "members": { + "id": { + "shape": "SubscriptionRequestId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionRequestStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "requestReason": { + "shape": "RequestReason" + }, + "subscribedPrincipals": { + "shape": "AcceptSubscriptionRequestOutputSubscribedPrincipalsList" + }, + "subscribedListings": { + "shape": "AcceptSubscriptionRequestOutputSubscribedListingsList" + }, + "reviewerId": { + "shape": "String" + }, + "decisionComment": { + "shape": "DecisionComment" + }, + "existingSubscriptionId": { + "shape": "SubscriptionId" + }, + "metadataForms": { + "shape": "MetadataForms" + } + } + }, + "AcceptSubscriptionRequestOutputSubscribedListingsList": { + "type": "list", + "member": { + "shape": "SubscribedListing" + }, + "max": 1, + "min": 1 + }, + "AcceptSubscriptionRequestOutputSubscribedPrincipalsList": { + "type": "list", + "member": { + "shape": "SubscribedPrincipal" + }, + "max": 1, + "min": 1 + }, + "AcceptedAssetScope": { + "type": "structure", + "required": ["assetId", "filterIds"], + "members": { + "assetId": { + "shape": "AssetId" + }, + "filterIds": { + "shape": "FilterIds" + } + } + }, + "AcceptedAssetScopes": { + "type": "list", + "member": { + "shape": "AcceptedAssetScope" + } + }, + "AccessDeniedException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 403, + "senderFault": true + }, + "exception": true + }, + "AccessKeyId": { + "type": "string", + "sensitive": true + }, + "AccountIdList": { + "type": "list", + "member": { + "shape": "AwsAccountId" + } + }, + "AccountInfo": { + "type": "structure", + "required": ["awsAccountId", "supportedRegions"], + "members": { + "awsAccountId": { + "shape": "AwsAccountId" + }, + "supportedRegions": { + "shape": "AwsRegionList" + }, + "awsAccountName": { + "shape": "AwsAccountName" + } + } + }, + "AccountInfoList": { + "type": "list", + "member": { + "shape": "AccountInfo" + }, + "max": 25, + "min": 1 + }, + "AccountPoolId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "AccountPoolList": { + "type": "list", + "member": { + "shape": "AccountPoolId" + }, + "max": 10, + "min": 1 + }, + "AccountPoolName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "AccountPoolSummaries": { + "type": "list", + "member": { + "shape": "AccountPoolSummary" + } + }, + "AccountPoolSummary": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "AccountPoolId" + }, + "name": { + "shape": "AccountPoolName" + }, + "resolutionStrategy": { + "shape": "ResolutionStrategy" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + } + } + }, + "AccountSource": { + "type": "structure", + "members": { + "accounts": { + "shape": "AccountInfoList" + }, + "customAccountPoolHandler": { + "shape": "CustomAccountPoolHandler" + } + }, + "union": true + }, + "Action": { + "type": "string", + "enum": ["ADD_RESOURCE_TYPE", "REMOVE_RESOURCE_TYPE"] + }, + "ActionLink": { + "type": "string", + "sensitive": true + }, + "ActionParameters": { + "type": "structure", + "members": { + "awsConsoleLink": { + "shape": "AwsConsoleLinkParameters" + }, + "sageMaker": { + "shape": "SageMakerParameters", + "internalonly": true + } + }, + "union": true + }, + "AddEntityOwnerInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "owner"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "DataZoneEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "String", + "location": "uri", + "locationName": "entityIdentifier" + }, + "owner": { + "shape": "OwnerProperties" + }, + "overridePolicyConfiguration": { + "shape": "Boolean", + "internalonly": true + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "AddEntityOwnerOutput": { + "type": "structure", + "members": {} + }, + "AddPolicyGrantInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "policyType", "principal", "detail"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "TargetEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "String", + "location": "uri", + "locationName": "entityIdentifier" + }, + "policyType": { + "shape": "ManagedPolicyType" + }, + "principal": { + "shape": "PolicyGrantPrincipal" + }, + "detail": { + "shape": "PolicyGrantDetail" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "AddPolicyGrantOutput": { + "type": "structure", + "members": { + "grantId": { + "shape": "GrantIdentifier" + } + } + }, + "AddToProjectMemberPoolPolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "AdminApiRoleArn": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role|role/aws-reserved/sso\\.amazonaws\\.com)/[\\w+=,.@-]*" + }, + "AggregationAttributeDisplayValue": { + "type": "string" + }, + "AggregationAttributeValue": { + "type": "string" + }, + "AggregationDisplayValue": { + "type": "string", + "max": 100, + "min": 1 + }, + "AggregationList": { + "type": "list", + "member": { + "shape": "AggregationListItem" + }, + "max": 10, + "min": 1 + }, + "AggregationListItem": { + "type": "structure", + "required": ["attribute"], + "members": { + "attribute": { + "shape": "Attribute" + }, + "displayValue": { + "shape": "AggregationDisplayValue" + } + } + }, + "AggregationOutput": { + "type": "structure", + "members": { + "attribute": { + "shape": "Attribute" + }, + "displayValue": { + "shape": "AggregationDisplayValue" + }, + "items": { + "shape": "AggregationOutputItems" + } + } + }, + "AggregationOutputItem": { + "type": "structure", + "members": { + "value": { + "shape": "AggregationAttributeValue" + }, + "count": { + "shape": "Integer" + }, + "displayValue": { + "shape": "AggregationAttributeDisplayValue", + "internalonly": true + }, + "id": { + "shape": "AggregationAttributeValue", + "deprecated": true, + "deprecatedMessage": "Please use displayValue instead", + "internalonly": true + }, + "parentDisplayValue": { + "shape": "AggregationAttributeDisplayValue", + "internalonly": true + }, + "parentValue": { + "shape": "AggregationAttributeValue", + "internalonly": true + }, + "parentId": { + "shape": "AggregationAttributeValue", + "deprecated": true, + "deprecatedMessage": "Please use parentDisplayValue instead", + "internalonly": true + } + } + }, + "AggregationOutputItems": { + "type": "list", + "member": { + "shape": "AggregationOutputItem" + } + }, + "AggregationOutputList": { + "type": "list", + "member": { + "shape": "AggregationOutput" + } + }, + "AllDomainUnitsGrantFilter": { + "type": "structure", + "members": {} + }, + "AllUsersGrantFilter": { + "type": "structure", + "members": {} + }, + "AllowedDataZoneActions": { + "type": "list", + "member": { + "shape": "DataZoneAction" + } + }, + "AmazonQPropertiesInput": { + "type": "structure", + "required": ["isEnabled"], + "members": { + "isEnabled": { + "shape": "Boolean" + }, + "profileArn": { + "shape": "AmazonQPropertiesInputProfileArnString" + }, + "authMode": { + "shape": "AmazonQPropertiesInputAuthModeString" + } + } + }, + "AmazonQPropertiesInputAuthModeString": { + "type": "string", + "max": 128, + "min": 0 + }, + "AmazonQPropertiesInputProfileArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws[a-z\\-]*:[a-z0-9\\-]+:[a-z0-9\\-]*:[0-9]*:.*" + }, + "AmazonQPropertiesOutput": { + "type": "structure", + "required": ["isEnabled"], + "members": { + "isEnabled": { + "shape": "Boolean" + }, + "profileArn": { + "shape": "AmazonQPropertiesOutputProfileArnString" + }, + "authMode": { + "shape": "AmazonQPropertiesOutputAuthModeString" + } + } + }, + "AmazonQPropertiesOutputAuthModeString": { + "type": "string", + "max": 128, + "min": 0 + }, + "AmazonQPropertiesOutputProfileArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws[a-z\\-]*:[a-z0-9\\-]+:[a-z0-9\\-]*:[0-9]*:.*" + }, + "AmazonQPropertiesPatch": { + "type": "structure", + "required": ["isEnabled"], + "members": { + "isEnabled": { + "shape": "Boolean" + }, + "profileArn": { + "shape": "AmazonQPropertiesPatchProfileArnString" + }, + "authMode": { + "shape": "AmazonQPropertiesPatchAuthModeString" + } + } + }, + "AmazonQPropertiesPatchAuthModeString": { + "type": "string", + "max": 128, + "min": 0 + }, + "AmazonQPropertiesPatchProfileArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws[a-z\\-]*:[a-z0-9\\-]+:[a-z0-9\\-]*:[0-9]*:.*" + }, + "ApplicableAssetTypes": { + "type": "list", + "member": { + "shape": "TypeName" + } + }, + "ApplicablePrincipal": { + "type": "string", + "enum": ["USER", "PRODUCT", "DOMAIN"] + }, + "ApplicablePrincipalList": { + "type": "list", + "member": { + "shape": "ApplicablePrincipal" + } + }, + "ApplicableResource": { + "type": "string", + "enum": ["ZONE", "PROJECT", "PRODUCT", "ASSET", "DOMAIN"] + }, + "ApplicableResourceList": { + "type": "list", + "member": { + "shape": "ApplicableResource" + } + }, + "ApplicableScopeList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "AssetFilterConfiguration": { + "type": "structure", + "members": { + "columnConfiguration": { + "shape": "ColumnFilterConfiguration" + }, + "rowConfiguration": { + "shape": "RowFilterConfiguration" + } + }, + "union": true + }, + "AssetFilterSummary": { + "type": "structure", + "required": ["id", "domainId", "assetId", "name"], + "members": { + "id": { + "shape": "FilterId" + }, + "domainId": { + "shape": "DomainId" + }, + "assetId": { + "shape": "AssetId" + }, + "name": { + "shape": "FilterName" + }, + "description": { + "shape": "Description" + }, + "status": { + "shape": "FilterStatus" + }, + "effectiveColumnNames": { + "shape": "ColumnNameList" + }, + "effectiveRowFilter": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "errorMessage": { + "shape": "String" + } + } + }, + "AssetFilters": { + "type": "list", + "member": { + "shape": "AssetFilterSummary" + } + }, + "AssetFormMetadata": { + "type": "structure", + "required": ["formName"], + "members": { + "formName": { + "shape": "FormName" + }, + "typeName": { + "shape": "FormTypeName" + }, + "typeRevision": { + "shape": "Revision" + }, + "renderingConfig": { + "shape": "RenderingConfig", + "internalonly": true + } + } + }, + "AssetFormMetadataList": { + "type": "list", + "member": { + "shape": "AssetFormMetadata" + }, + "max": 10, + "min": 0 + }, + "AssetId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "AssetIdentifier": { + "type": "string", + "pattern": "([a-zA-Z0-9_-]{1,36})(/.{1,600})?" + }, + "AssetInDataProductListingItem": { + "type": "structure", + "members": { + "entityId": { + "shape": "String" + }, + "entityRevision": { + "shape": "String" + }, + "entityType": { + "shape": "String" + } + } + }, + "AssetInDataProductListingItems": { + "type": "list", + "member": { + "shape": "AssetInDataProductListingItem" + } + }, + "AssetItem": { + "type": "structure", + "required": ["domainId", "identifier", "name", "typeIdentifier", "typeRevision", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "identifier": { + "shape": "AssetIdentifier" + }, + "name": { + "shape": "AssetName" + }, + "typeIdentifier": { + "shape": "AssetTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "externalIdentifier": { + "shape": "ExternalIdentifier" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "additionalAttributes": { + "shape": "AssetItemAdditionalAttributes" + }, + "governedGlossaryTerms": { + "shape": "AssetItemGovernedGlossaryTermsList" + } + } + }, + "AssetItemAdditionalAttributes": { + "type": "structure", + "members": { + "formsOutput": { + "shape": "AssetItemAdditionalAttributesFormsOutputList" + }, + "readOnlyFormsOutput": { + "shape": "FormOutputList" + }, + "latestTimeSeriesDataPointFormsOutput": { + "shape": "TimeSeriesDataPointSummaryFormOutputList" + }, + "matchRationale": { + "shape": "MatchRationale" + } + } + }, + "AssetItemAdditionalAttributesFormsOutputList": { + "type": "list", + "member": { + "shape": "FormOutput" + }, + "max": 20, + "min": 0 + }, + "AssetItemGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 20, + "min": 0 + }, + "AssetListing": { + "type": "structure", + "members": { + "assetId": { + "shape": "AssetId" + }, + "assetRevision": { + "shape": "Revision" + }, + "assetType": { + "shape": "TypeName" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "forms": { + "shape": "Forms" + }, + "assetFormsMetadata": { + "shape": "AssetFormMetadataList", + "internalonly": true + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + }, + "governedGlossaryTerms": { + "shape": "AssetListingGovernedGlossaryTermsList" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "latestTimeSeriesDataPointForms": { + "shape": "TimeSeriesDataPointSummaryFormOutputList" + } + } + }, + "AssetListingDetails": { + "type": "structure", + "required": ["listingId", "listingStatus"], + "members": { + "listingId": { + "shape": "ListingId" + }, + "listingStatus": { + "shape": "ListingStatus" + } + } + }, + "AssetListingGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "DetailedGlossaryTerm" + }, + "max": 20, + "min": 0 + }, + "AssetListingItem": { + "type": "structure", + "members": { + "listingId": { + "shape": "ListingId" + }, + "listingRevision": { + "shape": "Revision" + }, + "name": { + "shape": "AssetName" + }, + "entityId": { + "shape": "AssetId" + }, + "entityRevision": { + "shape": "Revision" + }, + "entityType": { + "shape": "TypeName" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "listingCreatedAt": { + "shape": "CreatedAt", + "internalonly": true + }, + "listingUpdatedAt": { + "shape": "UpdatedAt", + "internalonly": true + }, + "listingCreatedBy": { + "shape": "CreatedBy" + }, + "listingUpdatedBy": { + "shape": "UpdatedBy" + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + }, + "governedGlossaryTerms": { + "shape": "AssetListingItemGovernedGlossaryTermsList" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "additionalAttributes": { + "shape": "AssetListingItemAdditionalAttributes" + } + } + }, + "AssetListingItemAdditionalAttributes": { + "type": "structure", + "members": { + "forms": { + "shape": "Forms" + }, + "matchRationale": { + "shape": "MatchRationale" + }, + "latestTimeSeriesDataPointForms": { + "shape": "TimeSeriesDataPointSummaryFormOutputList" + } + }, + "sensitive": true + }, + "AssetListingItemGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "DetailedGlossaryTerm" + }, + "max": 20, + "min": 0 + }, + "AssetName": { + "type": "string", + "max": 256, + "min": 1, + "sensitive": true + }, + "AssetPermission": { + "type": "structure", + "required": ["assetId", "permissions"], + "members": { + "assetId": { + "shape": "AssetId" + }, + "permissions": { + "shape": "Permissions" + } + } + }, + "AssetPermissions": { + "type": "list", + "member": { + "shape": "AssetPermission" + } + }, + "AssetRevision": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "AssetId" + }, + "revision": { + "shape": "Revision" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + } + } + }, + "AssetRevisions": { + "type": "list", + "member": { + "shape": "AssetRevision" + } + }, + "AssetScope": { + "type": "structure", + "required": ["assetId", "filterIds", "status"], + "members": { + "assetId": { + "shape": "AssetId" + }, + "filterIds": { + "shape": "FilterIds" + }, + "status": { + "shape": "String" + }, + "errorMessage": { + "shape": "String" + } + } + }, + "AssetTargetNameMap": { + "type": "structure", + "required": ["assetId", "targetName"], + "members": { + "assetId": { + "shape": "AssetId" + }, + "targetName": { + "shape": "String" + } + } + }, + "AssetTargetNames": { + "type": "list", + "member": { + "shape": "AssetTargetNameMap" + } + }, + "AssetTypeIdentifier": { + "type": "string", + "max": 513, + "min": 1, + "pattern": "(?!\\.)[\\w\\.]*\\w" + }, + "AssetTypeIdentifiers": { + "type": "list", + "member": { + "shape": "AssetTypeIdentifier" + } + }, + "AssetTypeItem": { + "type": "structure", + "required": ["domainId", "name", "revision", "formsOutput", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "TypeName" + }, + "revision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "formsOutput": { + "shape": "FormsOutputMap" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "originDomainId": { + "shape": "DomainId" + }, + "originProjectId": { + "shape": "ProjectId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + } + } + }, + "AssetTypeList": { + "type": "list", + "member": { + "shape": "AssetTypeItem" + } + }, + "AssetTypesForRule": { + "type": "structure", + "required": ["selectionMode"], + "members": { + "selectionMode": { + "shape": "RuleScopeSelectionMode" + }, + "specificAssetTypes": { + "shape": "RuleAssetTypeList" + } + } + }, + "AssociateEnvironmentRoleInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "environmentRoleArn": { + "shape": "String", + "location": "uri", + "locationName": "environmentRoleArn" + }, + "roleTag": { + "shape": "RoleTag", + "internalonly": true + }, + "type": { + "shape": "EnvironmentRoleType", + "internalonly": true + } + } + }, + "AssociateEnvironmentRoleOutput": { + "type": "structure", + "members": {} + }, + "AssociateGovernedTermsInput": { + "type": "structure", + "required": ["domainIdentifier", "entityIdentifier", "entityType", "governedGlossaryTerms"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityIdentifier": { + "shape": "EntityIdentifier", + "location": "uri", + "locationName": "entityIdentifier" + }, + "entityType": { + "shape": "GovernedEntityType", + "location": "uri", + "locationName": "entityType" + }, + "governedGlossaryTerms": { + "shape": "AssociateGovernedTermsInputGovernedGlossaryTermsList" + } + } + }, + "AssociateGovernedTermsInputGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 5, + "min": 1 + }, + "AssociateGovernedTermsOutput": { + "type": "structure", + "members": {} + }, + "AthenaPropertiesInput": { + "type": "structure", + "required": ["workgroupName"], + "members": { + "workgroupName": { + "shape": "AthenaPropertiesInputWorkgroupNameString" + } + } + }, + "AthenaPropertiesInputWorkgroupNameString": { + "type": "string", + "max": 128, + "min": 0, + "pattern": "[a-zA-Z0-9._-]+" + }, + "AthenaPropertiesOutput": { + "type": "structure", + "required": ["workgroupName"], + "members": { + "workgroupName": { + "shape": "AthenaPropertiesOutputWorkgroupNameString" + } + } + }, + "AthenaPropertiesOutputWorkgroupNameString": { + "type": "string", + "max": 128, + "min": 0, + "pattern": "[a-zA-Z0-9._-]+" + }, + "AthenaPropertiesPatch": { + "type": "structure", + "required": ["workgroupName"], + "members": { + "workgroupName": { + "shape": "AthenaPropertiesPatchWorkgroupNameString" + } + } + }, + "AthenaPropertiesPatchWorkgroupNameString": { + "type": "string", + "max": 128, + "min": 0, + "pattern": "[a-zA-Z0-9._-]+" + }, + "AttachGovernedGlossaryTermsPolicyGrantDetail": { + "type": "structure", + "members": { + "domainUnitId": { + "shape": "DomainUnitId" + } + }, + "internalonly": true + }, + "Attribute": { + "type": "string", + "max": 128, + "min": 1 + }, + "AttributeEntityType": { + "type": "string", + "enum": ["ASSET", "LISTING"] + }, + "AttributeIdentifier": { + "type": "string", + "max": 256, + "min": 1 + }, + "AttributeIdentifierList": { + "type": "list", + "member": { + "shape": "AttributeIdentifier" + }, + "internalonly": true, + "max": 5, + "min": 0 + }, + "AttributeList": { + "type": "list", + "member": { + "shape": "GetAttributeOutput" + }, + "internalonly": true + }, + "AuthCodeUrl": { + "type": "string", + "sensitive": true + }, + "AuthType": { + "type": "string", + "enum": ["IAM_IDC", "DISABLED", "SAML"] + }, + "AuthenticationConfiguration": { + "type": "structure", + "members": { + "authenticationType": { + "shape": "AuthenticationType" + }, + "secretArn": { + "shape": "AuthenticationConfigurationSecretArnString" + }, + "oAuth2Properties": { + "shape": "OAuth2Properties" + } + } + }, + "AuthenticationConfigurationInput": { + "type": "structure", + "members": { + "authenticationType": { + "shape": "AuthenticationType" + }, + "oAuth2Properties": { + "shape": "OAuth2Properties" + }, + "secretArn": { + "shape": "AuthenticationConfigurationInputSecretArnString" + }, + "kmsKeyArn": { + "shape": "AuthenticationConfigurationInputKmsKeyArnString" + }, + "basicAuthenticationCredentials": { + "shape": "BasicAuthenticationCredentials" + }, + "customAuthenticationCredentials": { + "shape": "CredentialMap" + } + } + }, + "AuthenticationConfigurationInputKmsKeyArnString": { + "type": "string", + "pattern": "$|arn:aws[a-z0-9-]*:kms:.*" + }, + "AuthenticationConfigurationInputSecretArnString": { + "type": "string", + "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:secretsmanager:.*" + }, + "AuthenticationConfigurationPatch": { + "type": "structure", + "members": { + "secretArn": { + "shape": "AuthenticationConfigurationPatchSecretArnString" + }, + "basicAuthenticationCredentials": { + "shape": "BasicAuthenticationCredentials" + }, + "customAuthenticationCredentials": { + "shape": "CredentialMap" + } + } + }, + "AuthenticationConfigurationPatchSecretArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:secretsmanager:.*" + }, + "AuthenticationConfigurationSecretArnString": { + "type": "string", + "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:secretsmanager:.*" + }, + "AuthenticationType": { + "type": "string", + "enum": ["BASIC", "OAUTH2", "CUSTOM", "IAM"] + }, + "AuthorizationCodeProperties": { + "type": "structure", + "members": { + "authorizationCode": { + "shape": "AuthorizationCodePropertiesAuthorizationCodeString" + }, + "redirectUri": { + "shape": "AuthorizationCodePropertiesRedirectUriString" + } + } + }, + "AuthorizationCodePropertiesAuthorizationCodeString": { + "type": "string", + "max": 4096, + "min": 1 + }, + "AuthorizationCodePropertiesRedirectUriString": { + "type": "string", + "max": 512, + "min": 0 + }, + "AuthorizationPolicy": { + "type": "structure", + "members": { + "statement": { + "shape": "String" + }, + "applicableResources": { + "shape": "ApplicableResourceList" + }, + "applicablePrincipals": { + "shape": "ApplicablePrincipalList" + } + } + }, + "AuthorizedDesignations": { + "type": "list", + "member": { + "shape": "DesignationName" + } + }, + "AuthorizedPrincipal": { + "type": "structure", + "members": { + "principalIdentifier": { + "shape": "String" + }, + "principalType": { + "shape": "AuthorizedPrincipalType" + } + } + }, + "AuthorizedPrincipalIdentifier": { + "type": "string", + "pattern": "[a-zA-Z0-9:/._-]*" + }, + "AuthorizedPrincipalIdentifiers": { + "type": "list", + "member": { + "shape": "AuthorizedPrincipalIdentifier" + }, + "max": 20, + "min": 1 + }, + "AuthorizedPrincipalType": { + "type": "string", + "enum": ["SERVICE_PRINCIPAL", "DATAZONE_USER_PROFILE"] + }, + "AwsAccount": { + "type": "structure", + "members": { + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountIdPath": { + "shape": "ParameterStorePath" + } + }, + "union": true + }, + "AwsAccountId": { + "type": "string", + "pattern": "\\d{12}" + }, + "AwsAccountName": { + "type": "string", + "max": 256, + "min": 1, + "sensitive": true + }, + "AwsConsoleLinkParameters": { + "type": "structure", + "members": { + "uri": { + "shape": "EnvironmentActionURI" + } + } + }, + "AwsCredentials": { + "type": "structure", + "members": { + "accessKeyId": { + "shape": "AccessKeyId" + }, + "secretAccessKey": { + "shape": "SecretAccessKey" + }, + "sessionToken": { + "shape": "SessionToken" + }, + "expiration": { + "shape": "Timestamp" + } + } + }, + "AwsLocation": { + "type": "structure", + "members": { + "accessRole": { + "shape": "ServiceRole" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsRegion": { + "shape": "AwsRegion" + }, + "iamConnectionId": { + "shape": "ConnectionId" + } + } + }, + "AwsRegion": { + "type": "string", + "pattern": "[a-z]{2}-[a-z]{4,10}-\\d" + }, + "AwsRegionList": { + "type": "list", + "member": { + "shape": "AwsRegion" + }, + "max": 3, + "min": 1 + }, + "BasicAuthenticationCredentials": { + "type": "structure", + "members": { + "userName": { + "shape": "BasicUsername" + }, + "password": { + "shape": "BasicPassword" + } + }, + "sensitive": true + }, + "BasicPassword": { + "type": "string", + "max": 512, + "min": 0, + "pattern": ".*", + "sensitive": true + }, + "BasicUsername": { + "type": "string", + "max": 512, + "min": 0, + "pattern": "\\S+", + "sensitive": true + }, + "BatchDeleteLinkedTypesErrors": { + "type": "list", + "member": { + "shape": "LinkedTypeError" + } + }, + "BatchDeleteLinkedTypesInput": { + "type": "structure", + "required": ["domainIdentifier", "itemIdentifiers"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "projectIdentifier" + }, + "itemIdentifiers": { + "shape": "LinkedTypeItemIdentifiers", + "location": "querystring", + "locationName": "itemIdentifiers" + } + } + }, + "BatchDeleteLinkedTypesOutput": { + "type": "structure", + "required": ["errors"], + "members": { + "errors": { + "shape": "BatchDeleteLinkedTypesErrors" + } + } + }, + "BatchGetAttributesInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "attributeIdentifiers"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "AttributeEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "EntityId", + "location": "uri", + "locationName": "entityIdentifier" + }, + "entityRevision": { + "shape": "Revision", + "location": "querystring", + "locationName": "entityRevision" + }, + "attributeIdentifiers": { + "shape": "AttributeIdentifierList" + } + }, + "internalonly": true + }, + "BatchGetAttributesOutput": { + "type": "structure", + "members": { + "attributes": { + "shape": "AttributeList" + }, + "attributesNotFound": { + "shape": "AttributeIdentifierList" + } + }, + "internalonly": true + }, + "BatchPutAttributesError": { + "type": "structure", + "required": ["attributeIdentifier", "code", "message"], + "members": { + "attributeIdentifier": { + "shape": "String" + }, + "code": { + "shape": "String" + }, + "message": { + "shape": "String" + } + }, + "internalonly": true + }, + "BatchPutAttributesErrors": { + "type": "list", + "member": { + "shape": "BatchPutAttributesError" + }, + "internalonly": true + }, + "BatchPutAttributesInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "putAttributeEntries"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "AttributeEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "EntityId", + "location": "uri", + "locationName": "entityIdentifier" + }, + "putAttributeEntries": { + "shape": "PutAttributeEntries" + } + }, + "internalonly": true + }, + "BatchPutAttributesItems": { + "type": "list", + "member": { + "shape": "PutAttributeOutput" + }, + "internalonly": true + }, + "BatchPutAttributesOutput": { + "type": "structure", + "required": ["errors"], + "members": { + "errors": { + "shape": "BatchPutAttributesErrors" + }, + "items": { + "shape": "BatchPutAttributesItems" + } + }, + "internalonly": true + }, + "BatchPutLinkedTypesErrors": { + "type": "list", + "member": { + "shape": "LinkedTypeError" + } + }, + "BatchPutLinkedTypesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId" + }, + "environmentIdentifier": { + "shape": "EnvironmentId" + }, + "items": { + "shape": "BatchPutLinkedTypesInputItemsList" + } + } + }, + "BatchPutLinkedTypesInputItemsList": { + "type": "list", + "member": { + "shape": "PutLinkedTypeItem" + }, + "max": 10, + "min": 1 + }, + "BatchPutLinkedTypesOutput": { + "type": "structure", + "required": ["errors"], + "members": { + "errors": { + "shape": "BatchPutLinkedTypesErrors" + } + } + }, + "BedrockModelArn": { + "type": "string", + "pattern": "arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:(|[0-9]{12}):[0-9a-zA-Z-]+/.{1,2028}" + }, + "BedrockS3BucketArn": { + "type": "string", + "pattern": "arn:aws(|-cn|-us-gov):s3:::[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]" + }, + "Boolean": { + "type": "boolean", + "box": true + }, + "BootstrapConfiguration": { + "type": "structure", + "required": ["environmentBlueprintId"], + "members": { + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "projectName": { + "shape": "ProjectName" + }, + "projectOwners": { + "shape": "ProjectOwners" + }, + "environmentConfiguration": { + "shape": "EnvironmentParametersList" + } + } + }, + "BootstrapConfigurationList": { + "type": "list", + "member": { + "shape": "BootstrapConfiguration" + }, + "max": 3, + "min": 1 + }, + "BusinessNameGenerationConfiguration": { + "type": "structure", + "members": { + "enabled": { + "shape": "Boolean" + } + } + }, + "CancelMetadataGenerationRunInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "MetadataGenerationRunIdentifier", + "location": "uri", + "locationName": "identifier" + } + } + }, + "CancelMetadataGenerationRunOutput": { + "type": "structure", + "members": {} + }, + "CancelSubscriptionInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "CancelSubscriptionOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "subscribedPrincipal", + "subscribedListing" + ], + "members": { + "id": { + "shape": "SubscriptionId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "subscribedPrincipal": { + "shape": "SubscribedPrincipal" + }, + "subscribedListing": { + "shape": "SubscribedListing" + }, + "subscriptionRequestId": { + "shape": "SubscriptionRequestId" + }, + "retainPermissions": { + "shape": "Boolean" + }, + "pushedSubscription": { + "shape": "Boolean" + }, + "expirationTimestamp": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "ChangeAction": { + "type": "string", + "enum": ["PUBLISH", "UNPUBLISH", "CREATE_UNPUBLISHED"] + }, + "ClientToken": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "[\\x21-\\x7E]+" + }, + "CloudFormationProperties": { + "type": "structure", + "required": ["templateUrl"], + "members": { + "templateUrl": { + "shape": "String" + } + } + }, + "Clusters": { + "type": "list", + "member": { + "shape": "String" + }, + "max": 20, + "min": 1 + }, + "ColumnFilterConfiguration": { + "type": "structure", + "members": { + "includedColumnNames": { + "shape": "ColumnNameList" + } + } + }, + "ColumnNameList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "ColumnNames": { + "type": "list", + "member": { + "shape": "String" + } + }, + "ComputeEnvironments": { + "type": "string", + "enum": ["SPARK", "ATHENA", "PYTHON"] + }, + "ComputeEnvironmentsList": { + "type": "list", + "member": { + "shape": "ComputeEnvironments" + }, + "max": 50, + "min": 1 + }, + "ConfigurableActionParameter": { + "type": "structure", + "members": { + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "ConfigurableActionParameterList": { + "type": "list", + "member": { + "shape": "ConfigurableActionParameter" + } + }, + "ConfigurableActionTypeAuthorization": { + "type": "string", + "enum": ["IAM", "HTTPS"] + }, + "ConfigurableEnvironmentAction": { + "type": "structure", + "required": ["type", "parameters"], + "members": { + "type": { + "shape": "String" + }, + "auth": { + "shape": "ConfigurableActionTypeAuthorization" + }, + "parameters": { + "shape": "ConfigurableActionParameterList" + } + } + }, + "Configuration": { + "type": "structure", + "members": { + "classification": { + "shape": "ConfigurationClassificationString" + }, + "properties": { + "shape": "PropertyMap" + } + } + }, + "ConfigurationClassificationString": { + "type": "string", + "max": 64, + "min": 0, + "pattern": "[\\w][\\w\\.\\-\\_]*" + }, + "ConfigurationMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "Configurations": { + "type": "list", + "member": { + "shape": "Configuration" + } + }, + "ConflictException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 409, + "senderFault": true + }, + "exception": true + }, + "ConnectedEntities": { + "type": "list", + "member": { + "shape": "ConnectedEntity" + }, + "max": 10, + "min": 1 + }, + "ConnectedEntity": { + "type": "structure", + "members": { + "connectedEntityIdentifier": { + "shape": "String" + }, + "connectedEntityType": { + "shape": "ConnectedEntityType" + }, + "connectedEntityConnectionType": { + "shape": "ConnectedEntityConnectionType" + } + } + }, + "ConnectedEntityConnectionType": { + "type": "string", + "enum": ["BELONGS_TO", "CONSUMED_BY", "CUSTOM"] + }, + "ConnectedEntityType": { + "type": "string", + "enum": ["ENVIRONMENT", "SAGEMAKER_DOMAIN", "SAGEMAKER_USER_PROFILE", "CUSTOM"] + }, + "ConnectionCredentials": { + "type": "structure", + "members": { + "accessKeyId": { + "shape": "String" + }, + "secretAccessKey": { + "shape": "String" + }, + "sessionToken": { + "shape": "String" + }, + "expiration": { + "shape": "SyntheticTimestamp_date_time" + }, + "identityEnhancedCredentials": { + "shape": "IdentityEnhancedCredentials", + "internalonly": true + } + }, + "sensitive": true + }, + "ConnectionId": { + "type": "string", + "max": 128, + "min": 0, + "pattern": "[a-zA-Z0-9]+" + }, + "ConnectionName": { + "type": "string", + "max": 64, + "min": 0, + "pattern": "[\\w][\\w\\.\\-\\_]*" + }, + "ConnectionOptions": { + "type": "structure", + "members": { + "enableTrustedIdentityPropagation": { + "shape": "Boolean" + } + } + }, + "ConnectionProperties": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "ConnectionPropertiesValueString" + } + }, + "ConnectionPropertiesInput": { + "type": "structure", + "members": { + "athenaProperties": { + "shape": "AthenaPropertiesInput" + }, + "databricksProperties": { + "shape": "DatabricksPropertiesInput", + "internalonly": true + }, + "gitProperties": { + "shape": "GitPropertiesInput" + }, + "glueProperties": { + "shape": "GluePropertiesInput" + }, + "hyperPodProperties": { + "shape": "HyperPodPropertiesInput" + }, + "iamProperties": { + "shape": "IamPropertiesInput" + }, + "jdbcProperties": { + "shape": "JdbcPropertiesInput" + }, + "lakehouseProperties": { + "shape": "LakehousePropertiesInput" + }, + "redshiftProperties": { + "shape": "RedshiftPropertiesInput" + }, + "s3Properties": { + "shape": "S3PropertiesInput" + }, + "s3FolderProperties": { + "shape": "S3FolderPropertiesInput" + }, + "snowflakeProperties": { + "shape": "SnowflakePropertiesInput", + "internalonly": true + }, + "sparkEmrProperties": { + "shape": "SparkEmrPropertiesInput" + }, + "sparkGlueProperties": { + "shape": "SparkGluePropertiesInput" + }, + "workflowsMwaaProperties": { + "shape": "WorkflowsMwaaPropertiesInput" + }, + "mlflowProperties": { + "shape": "MlflowPropertiesInput" + }, + "workflowsServerlessProperties": { + "shape": "WorkflowsServerlessPropertiesInput" + }, + "enableTrustedIdentityPropagation": { + "shape": "Boolean", + "internalonly": true + }, + "kinesisProperties": { + "shape": "KinesisPropertiesInput", + "internalonly": true + }, + "mskProperties": { + "shape": "MskPropertiesInput", + "internalonly": true + }, + "amazonQProperties": { + "shape": "AmazonQPropertiesInput", + "internalonly": true + } + }, + "union": true + }, + "ConnectionPropertiesOutput": { + "type": "structure", + "members": { + "athenaProperties": { + "shape": "AthenaPropertiesOutput" + }, + "databricksProperties": { + "shape": "DatabricksPropertiesOutput", + "internalonly": true + }, + "gitProperties": { + "shape": "GitPropertiesOutput" + }, + "glueProperties": { + "shape": "GluePropertiesOutput" + }, + "hyperPodProperties": { + "shape": "HyperPodPropertiesOutput" + }, + "jdbcProperties": { + "shape": "JdbcPropertiesOutput" + }, + "lakehouseProperties": { + "shape": "LakehousePropertiesOutput" + }, + "redshiftProperties": { + "shape": "RedshiftPropertiesOutput" + }, + "s3Properties": { + "shape": "S3PropertiesOutput" + }, + "s3FolderProperties": { + "shape": "S3FolderPropertiesOutput" + }, + "snowflakeProperties": { + "shape": "SnowflakePropertiesOutput", + "internalonly": true + }, + "sparkEmrProperties": { + "shape": "SparkEmrPropertiesOutput" + }, + "sparkGlueProperties": { + "shape": "SparkGluePropertiesOutput" + }, + "workflowsMwaaProperties": { + "shape": "WorkflowsMwaaPropertiesOutput" + }, + "mlflowProperties": { + "shape": "MlflowPropertiesOutput" + }, + "workflowsServerlessProperties": { + "shape": "WorkflowsServerlessPropertiesOutput" + }, + "iamRoleProperties": { + "shape": "IamRolePropertiesOutput" + }, + "iamProperties": { + "shape": "IamPropertiesOutput" + }, + "kinesisProperties": { + "shape": "KinesisPropertiesOutput", + "internalonly": true + }, + "mskProperties": { + "shape": "MskPropertiesOutput", + "internalonly": true + }, + "amazonQProperties": { + "shape": "AmazonQPropertiesOutput", + "internalonly": true + } + }, + "union": true + }, + "ConnectionPropertiesPatch": { + "type": "structure", + "members": { + "athenaProperties": { + "shape": "AthenaPropertiesPatch" + }, + "jdbcProperties": { + "shape": "JdbcPropertiesPatch" + }, + "glueProperties": { + "shape": "GluePropertiesPatch" + }, + "iamProperties": { + "shape": "IamPropertiesPatch" + }, + "lakehouseProperties": { + "shape": "LakehousePropertiesPatch" + }, + "redshiftProperties": { + "shape": "RedshiftPropertiesPatch" + }, + "s3Properties": { + "shape": "S3PropertiesPatch" + }, + "s3FolderProperties": { + "shape": "S3FolderPropertiesPatch" + }, + "snowflakeProperties": { + "shape": "SnowflakePropertiesPatch", + "internalonly": true + }, + "sparkEmrProperties": { + "shape": "SparkEmrPropertiesPatch" + }, + "amazonQProperties": { + "shape": "AmazonQPropertiesPatch", + "internalonly": true + } + }, + "union": true + }, + "ConnectionPropertiesValueString": { + "type": "string", + "max": 2048, + "min": 1 + }, + "ConnectionScope": { + "type": "string", + "enum": ["DOMAIN", "PROJECT"] + }, + "ConnectionStatus": { + "type": "string", + "enum": [ + "CREATING", + "CREATE_FAILED", + "DELETING", + "DELETE_FAILED", + "READY", + "UPDATING", + "UPDATE_FAILED", + "DELETED", + "PLANNED" + ] + }, + "ConnectionSummaries": { + "type": "list", + "member": { + "shape": "ConnectionSummary" + } + }, + "ConnectionSummary": { + "type": "structure", + "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], + "members": { + "configurations": { + "shape": "Configurations", + "internalonly": true + }, + "connectionId": { + "shape": "ConnectionId" + }, + "domainId": { + "shape": "DomainId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "ConnectionName" + }, + "physicalEndpoints": { + "shape": "PhysicalEndpoints" + }, + "projectId": { + "shape": "ProjectId" + }, + "props": { + "shape": "ConnectionPropertiesOutput" + }, + "credentialId": { + "shape": "CredentialId", + "internalonly": true + }, + "type": { + "shape": "ConnectionType" + }, + "scope": { + "shape": "ConnectionScope", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "ConnectionType": { + "type": "string", + "enum": [ + "ATHENA", + "BIGQUERY", + "DATABRICKS", + "DOCUMENTDB", + "DYNAMODB", + "GIT", + "HYPERPOD", + "IAM", + "MYSQL", + "OPENSEARCH", + "ORACLE", + "POSTGRESQL", + "REDSHIFT", + "SAPHANA", + "SNOWFLAKE", + "SPARK", + "SQL", + "SQLSERVER", + "TERADATA", + "VERTICA", + "WORKFLOWS_MWAA", + "S3_FOLDER", + "LAKEHOUSE", + "S3", + "KINESIS", + "MSK", + "AMAZON_Q", + "ICEBERGRESTCATALOG", + "SNOWFLAKEICEBERGRESTCATALOG", + "DATABRICKSICEBERGRESTCATALOG", + "MLFLOW" + ] + }, + "ConnectivityProperties": { + "type": "structure", + "members": { + "connectionProperties": { + "shape": "ConnectionProperties" + }, + "physicalConnectionRequirements": { + "shape": "PhysicalConnectionRequirements" + }, + "name": { + "shape": "ConnectivityPropertiesNameString" + }, + "description": { + "shape": "ConnectivityPropertiesDescriptionString" + }, + "matchCriteria": { + "shape": "ConnectivityPropertiesMatchCriteriaString" + }, + "validateCredentials": { + "shape": "Boolean" + }, + "validateForComputeEnvironments": { + "shape": "ComputeEnvironmentsList" + }, + "sparkProperties": { + "shape": "PropertyMap" + }, + "athenaProperties": { + "shape": "PropertyMap" + }, + "pythonProperties": { + "shape": "PropertyMap" + }, + "authenticationConfiguration": { + "shape": "AuthenticationConfigurationInput" + } + } + }, + "ConnectivityPropertiesDescriptionString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\r\\n\\t]*" + }, + "ConnectivityPropertiesMatchCriteriaString": { + "type": "string", + "max": 10, + "min": 0 + }, + "ConnectivityPropertiesNameString": { + "type": "string", + "max": 41, + "min": 1, + "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" + }, + "ConnectivityPropertiesPatch": { + "type": "structure", + "members": { + "description": { + "shape": "ConnectivityPropertiesPatchDescriptionString" + }, + "connectionProperties": { + "shape": "ConnectionProperties" + }, + "authenticationConfiguration": { + "shape": "AuthenticationConfigurationPatch" + } + } + }, + "ConnectivityPropertiesPatchDescriptionString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "[\\S\\s]*", + "sensitive": true + }, + "ConsumersEnabledRegionList": { + "type": "list", + "member": { + "shape": "AwsRegion" + }, + "min": 0 + }, + "Cookie": { + "type": "string", + "max": 4096, + "min": 1, + "sensitive": true + }, + "CreateAccountPoolInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "resolutionStrategy", "accountSource"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "AccountPoolName" + }, + "description": { + "shape": "Description" + }, + "resolutionStrategy": { + "shape": "ResolutionStrategy" + }, + "accountSource": { + "shape": "AccountSource" + } + } + }, + "CreateAccountPoolOutput": { + "type": "structure", + "required": ["accountSource", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "AccountPoolName" + }, + "id": { + "shape": "AccountPoolId" + }, + "description": { + "shape": "Description" + }, + "resolutionStrategy": { + "shape": "ResolutionStrategy" + }, + "accountSource": { + "shape": "AccountSource" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainUnitId": { + "shape": "DomainUnitId" + } + } + }, + "CreateAssetFilterInput": { + "type": "structure", + "required": ["domainIdentifier", "assetIdentifier", "name", "configuration"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "assetIdentifier": { + "shape": "AssetId", + "location": "uri", + "locationName": "assetIdentifier" + }, + "name": { + "shape": "FilterName" + }, + "description": { + "shape": "Description" + }, + "configuration": { + "shape": "AssetFilterConfiguration" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "CreateAssetFilterOutput": { + "type": "structure", + "required": ["id", "domainId", "assetId", "name", "configuration"], + "members": { + "id": { + "shape": "FilterId" + }, + "domainId": { + "shape": "DomainId" + }, + "assetId": { + "shape": "AssetId" + }, + "name": { + "shape": "FilterName" + }, + "description": { + "shape": "Description" + }, + "status": { + "shape": "FilterStatus" + }, + "configuration": { + "shape": "AssetFilterConfiguration" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "errorMessage": { + "shape": "String" + }, + "effectiveColumnNames": { + "shape": "ColumnNameList" + }, + "effectiveRowFilter": { + "shape": "String" + } + } + }, + "CreateAssetInput": { + "type": "structure", + "required": ["name", "domainIdentifier", "typeIdentifier", "owningProjectIdentifier"], + "members": { + "name": { + "shape": "AssetName" + }, + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "externalIdentifier": { + "shape": "ExternalIdentifier" + }, + "typeIdentifier": { + "shape": "AssetTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "formsInput": { + "shape": "CreateAssetInputFormsInputList" + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + }, + "predictionConfiguration": { + "shape": "PredictionConfiguration" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateAssetInputFormsInputList": { + "type": "list", + "member": { + "shape": "FormInput" + }, + "max": 20, + "min": 0, + "sensitive": true + }, + "CreateAssetOutput": { + "type": "structure", + "required": [ + "id", + "name", + "typeIdentifier", + "typeRevision", + "revision", + "owningProjectId", + "domainId", + "formsOutput" + ], + "members": { + "id": { + "shape": "AssetId" + }, + "name": { + "shape": "AssetName" + }, + "typeIdentifier": { + "shape": "AssetTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "externalIdentifier": { + "shape": "ExternalIdentifier" + }, + "revision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "governedGlossaryTerms": { + "shape": "CreateAssetOutputGovernedGlossaryTermsList" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "domainId": { + "shape": "DomainId" + }, + "listing": { + "shape": "AssetListingDetails" + }, + "formsOutput": { + "shape": "CreateAssetOutputFormsOutputList" + }, + "readOnlyFormsOutput": { + "shape": "FormOutputList" + }, + "latestTimeSeriesDataPointFormsOutput": { + "shape": "TimeSeriesDataPointSummaryFormOutputList" + }, + "predictionConfiguration": { + "shape": "PredictionConfiguration" + } + } + }, + "CreateAssetOutputFormsOutputList": { + "type": "list", + "member": { + "shape": "FormOutput" + }, + "max": 20, + "min": 0 + }, + "CreateAssetOutputGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 20, + "min": 0 + }, + "CreateAssetRevisionInput": { + "type": "structure", + "required": ["name", "domainIdentifier", "identifier"], + "members": { + "name": { + "shape": "AssetName" + }, + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "formsInput": { + "shape": "CreateAssetRevisionInputFormsInputList" + }, + "predictionConfiguration": { + "shape": "PredictionConfiguration" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateAssetRevisionInputFormsInputList": { + "type": "list", + "member": { + "shape": "FormInput" + }, + "max": 20, + "min": 0, + "sensitive": true + }, + "CreateAssetRevisionOutput": { + "type": "structure", + "required": [ + "id", + "name", + "typeIdentifier", + "typeRevision", + "revision", + "owningProjectId", + "domainId", + "formsOutput" + ], + "members": { + "id": { + "shape": "AssetId" + }, + "name": { + "shape": "AssetName" + }, + "typeIdentifier": { + "shape": "AssetTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "externalIdentifier": { + "shape": "ExternalIdentifier" + }, + "revision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "governedGlossaryTerms": { + "shape": "CreateAssetRevisionOutputGovernedGlossaryTermsList" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "domainId": { + "shape": "DomainId" + }, + "listing": { + "shape": "AssetListingDetails" + }, + "formsOutput": { + "shape": "CreateAssetRevisionOutputFormsOutputList" + }, + "readOnlyFormsOutput": { + "shape": "FormOutputList" + }, + "latestTimeSeriesDataPointFormsOutput": { + "shape": "TimeSeriesDataPointSummaryFormOutputList" + }, + "predictionConfiguration": { + "shape": "PredictionConfiguration" + } + } + }, + "CreateAssetRevisionOutputFormsOutputList": { + "type": "list", + "member": { + "shape": "FormOutput" + }, + "max": 20, + "min": 0 + }, + "CreateAssetRevisionOutputGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 20, + "min": 0 + }, + "CreateAssetTypeInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "formsInput", "owningProjectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "TypeName" + }, + "description": { + "shape": "Description" + }, + "formsInput": { + "shape": "FormsInputMap" + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + } + } + }, + "CreateAssetTypeOutput": { + "type": "structure", + "required": ["domainId", "name", "revision", "formsOutput"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "TypeName" + }, + "revision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "formsOutput": { + "shape": "FormsOutputMap" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "originDomainId": { + "shape": "DomainId" + }, + "originProjectId": { + "shape": "ProjectId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + } + } + }, + "CreateAssetTypePolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateConnectionInput": { + "type": "structure", + "required": ["domainIdentifier", "name"], + "members": { + "awsLocation": { + "shape": "AwsLocation" + }, + "clientToken": { + "shape": "CreateConnectionInputClientTokenString", + "idempotencyToken": true + }, + "configurations": { + "shape": "Configurations", + "internalonly": true + }, + "description": { + "shape": "CreateConnectionInputDescriptionString" + }, + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "ConnectionName" + }, + "props": { + "shape": "ConnectionPropertiesInput" + }, + "options": { + "shape": "ConnectionOptions", + "deprecated": true + }, + "scope": { + "shape": "ConnectionScope", + "internalonly": true + }, + "enableTrustedIdentityPropagation": { + "shape": "Boolean", + "internalonly": true + }, + "credentialId": { + "shape": "CredentialId", + "internalonly": true + } + } + }, + "CreateConnectionInputClientTokenString": { + "type": "string", + "max": 128, + "min": 0, + "pattern": "[\\S]*" + }, + "CreateConnectionInputDescriptionString": { + "type": "string", + "max": 128, + "min": 0, + "pattern": "[\\S\\s]*", + "sensitive": true + }, + "CreateConnectionOutput": { + "type": "structure", + "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], + "members": { + "connectionId": { + "shape": "ConnectionId" + }, + "configurations": { + "shape": "Configurations", + "internalonly": true + }, + "description": { + "shape": "Description" + }, + "domainId": { + "shape": "DomainId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "ConnectionName" + }, + "physicalEndpoints": { + "shape": "PhysicalEndpoints" + }, + "projectId": { + "shape": "ProjectId" + }, + "props": { + "shape": "ConnectionPropertiesOutput" + }, + "type": { + "shape": "ConnectionType" + }, + "scope": { + "shape": "ConnectionScope", + "internalonly": true + }, + "credentialId": { + "shape": "CredentialId", + "internalonly": true + } + } + }, + "CreateDataProductInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "owningProjectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "DataProductName" + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + }, + "description": { + "shape": "DataProductDescription" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "formsInput": { + "shape": "FormInputList" + }, + "items": { + "shape": "DataProductItems" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateDataProductOutput": { + "type": "structure", + "required": ["domainId", "id", "revision", "owningProjectId", "name", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DataProductId" + }, + "revision": { + "shape": "Revision" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "name": { + "shape": "DataProductName" + }, + "status": { + "shape": "DataProductStatus" + }, + "description": { + "shape": "DataProductDescription" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "items": { + "shape": "DataProductItems" + }, + "formsOutput": { + "shape": "FormOutputList" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + } + } + }, + "CreateDataProductRevisionInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier", "name"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataProductId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "DataProductName" + }, + "description": { + "shape": "DataProductDescription" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "items": { + "shape": "DataProductItems" + }, + "formsInput": { + "shape": "FormInputList" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateDataProductRevisionOutput": { + "type": "structure", + "required": ["domainId", "id", "revision", "owningProjectId", "name", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DataProductId" + }, + "revision": { + "shape": "Revision" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "name": { + "shape": "DataProductName" + }, + "status": { + "shape": "DataProductStatus" + }, + "description": { + "shape": "DataProductDescription" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "items": { + "shape": "DataProductItems" + }, + "formsOutput": { + "shape": "FormOutputList" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + } + } + }, + "CreateDataSourceInput": { + "type": "structure", + "required": ["name", "domainIdentifier", "projectIdentifier", "type"], + "members": { + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "CreateDataSourceInputProjectIdentifierString" + }, + "environmentIdentifier": { + "shape": "CreateDataSourceInputEnvironmentIdentifierString" + }, + "connectionIdentifier": { + "shape": "CreateDataSourceInputConnectionIdentifierString" + }, + "type": { + "shape": "CreateDataSourceInputTypeString" + }, + "configuration": { + "shape": "DataSourceConfigurationInput" + }, + "recommendation": { + "shape": "RecommendationConfiguration" + }, + "enableSetting": { + "shape": "EnableSetting" + }, + "schedule": { + "shape": "ScheduleConfiguration" + }, + "publishOnImport": { + "shape": "Boolean" + }, + "assetFormsInput": { + "shape": "FormInputList" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "CreateDataSourceInputConnectionIdentifierString": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "CreateDataSourceInputEnvironmentIdentifierString": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "CreateDataSourceInputProjectIdentifierString": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "CreateDataSourceInputTypeString": { + "type": "string", + "max": 256, + "min": 1 + }, + "CreateDataSourceOutput": { + "type": "structure", + "required": ["id", "name", "domainId", "projectId"], + "members": { + "id": { + "shape": "DataSourceId" + }, + "status": { + "shape": "DataSourceStatus" + }, + "type": { + "shape": "String" + }, + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "connectionId": { + "shape": "String" + }, + "configuration": { + "shape": "DataSourceConfigurationOutput" + }, + "recommendation": { + "shape": "RecommendationConfiguration" + }, + "enableSetting": { + "shape": "EnableSetting" + }, + "publishOnImport": { + "shape": "Boolean" + }, + "assetFormsOutput": { + "shape": "FormOutputList" + }, + "schedule": { + "shape": "ScheduleConfiguration" + }, + "lastRunStatus": { + "shape": "DataSourceRunStatus" + }, + "lastRunAt": { + "shape": "DateTime" + }, + "lastRunErrorMessage": { + "shape": "DataSourceErrorMessage" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + } + } + }, + "CreateDomainInput": { + "type": "structure", + "required": ["name"], + "members": { + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "singleSignOn": { + "shape": "SingleSignOn" + }, + "domainExecutionRole": { + "shape": "RoleArn" + }, + "kmsKeyIdentifier": { + "shape": "KmsKeyArn" + }, + "tags": { + "shape": "Tags" + }, + "domainVersion": { + "shape": "DomainVersion" + }, + "domainServiceRole": { + "shape": "AdminApiRoleArn", + "deprecated": true, + "deprecatedMessage": "This shape is no longer used. Use ServiceRole.", + "internalonly": true + }, + "serviceRole": { + "shape": "AdminApiRoleArn" + }, + "preferences": { + "shape": "Preferences", + "internalonly": true + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "CreateDomainOutput": { + "type": "structure", + "required": ["id"], + "members": { + "id": { + "shape": "DomainId" + }, + "rootDomainUnitId": { + "shape": "DomainUnitId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "singleSignOn": { + "shape": "SingleSignOn" + }, + "domainExecutionRole": { + "shape": "RoleArn" + }, + "arn": { + "shape": "String" + }, + "kmsKeyIdentifier": { + "shape": "KmsKeyArn" + }, + "status": { + "shape": "DomainStatus" + }, + "portalUrl": { + "shape": "String" + }, + "tags": { + "shape": "Tags" + }, + "domainVersion": { + "shape": "DomainVersion" + }, + "domainServiceRole": { + "shape": "AdminApiRoleArn", + "internalonly": true + }, + "serviceRole": { + "shape": "AdminApiRoleArn" + }, + "preferences": { + "shape": "Preferences", + "internalonly": true + } + } + }, + "CreateDomainPolicyInput": { + "type": "structure", + "required": ["domainId", "name", "owningProjectId", "policyType", "policyContent"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "policyType": { + "shape": "PolicyType" + }, + "policyContent": { + "shape": "PolicyContent" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "CreateDomainPolicyOutput": { + "type": "structure", + "required": ["policyId"], + "members": { + "policyId": { + "shape": "PolicyId" + } + } + }, + "CreateDomainUnitInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "parentDomainUnitIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "DomainUnitName" + }, + "parentDomainUnitIdentifier": { + "shape": "DomainUnitId" + }, + "description": { + "shape": "DomainUnitDescription" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateDomainUnitOutput": { + "type": "structure", + "required": ["id", "domainId", "name", "owners", "ancestorDomainUnitIds"], + "members": { + "id": { + "shape": "DomainUnitId" + }, + "domainUnitId": { + "shape": "DomainUnitId", + "internalonly": true + }, + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "DomainUnitName" + }, + "parentDomainUnitId": { + "shape": "DomainUnitId" + }, + "description": { + "shape": "DomainUnitDescription" + }, + "owners": { + "shape": "DomainUnitOwners" + }, + "ancestorDomainUnitIds": { + "shape": "DomainUnitIds" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + } + } + }, + "CreateDomainUnitPolicyDetail": { + "type": "structure", + "members": { + "principal": { + "shape": "UserGroupPolicyPrincipal" + }, + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateDomainUnitPolicyDetails": { + "type": "list", + "member": { + "shape": "CreateDomainUnitPolicyDetail" + } + }, + "CreateDomainUnitPolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateDomainUnitPolicyInput": { + "type": "structure", + "required": ["domainIdentifier", "description", "policyTarget", "details"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "description": { + "shape": "String" + }, + "policyTarget": { + "shape": "PolicyTarget" + }, + "details": { + "shape": "Details" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateDomainUnitPolicyOutput": { + "type": "structure", + "required": ["id", "domainId", "description", "policyTarget", "details"], + "members": { + "id": { + "shape": "DomainUnitPolicyId" + }, + "domainId": { + "shape": "DomainId" + }, + "description": { + "shape": "String" + }, + "policyTarget": { + "shape": "PolicyTarget" + }, + "details": { + "shape": "Details" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + } + } + }, + "CreateEnvironmentActionInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "name", "parameters"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "name": { + "shape": "String" + }, + "parameters": { + "shape": "ActionParameters" + }, + "description": { + "shape": "String" + } + } + }, + "CreateEnvironmentActionOutput": { + "type": "structure", + "required": ["domainId", "environmentId", "id", "name", "parameters"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "id": { + "shape": "EnvironmentActionId" + }, + "name": { + "shape": "String" + }, + "parameters": { + "shape": "ActionParameters" + }, + "description": { + "shape": "String" + } + } + }, + "CreateEnvironmentBlueprintInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "provisioningProperties"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "EnvironmentBlueprintName" + }, + "description": { + "shape": "Description" + }, + "provider": { + "shape": "String", + "internalonly": true + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "provisioningPolicy": { + "shape": "ProvisioningPolicy", + "internalonly": true + }, + "deploymentProperties": { + "shape": "DeploymentProperties", + "internalonly": true + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms", + "internalonly": true + } + } + }, + "CreateEnvironmentBlueprintOutput": { + "type": "structure", + "required": ["id", "name", "provider", "provisioningProperties"], + "members": { + "id": { + "shape": "EnvironmentBlueprintId" + }, + "name": { + "shape": "EnvironmentBlueprintName" + }, + "description": { + "shape": "Description" + }, + "changeLog": { + "shape": "String", + "internalonly": true + }, + "provider": { + "shape": "String" + }, + "provisioningPolicy": { + "shape": "ProvisioningPolicy", + "internalonly": true + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "deploymentProperties": { + "shape": "DeploymentProperties" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "blueprintCategory": { + "shape": "String", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "CreateEnvironmentInput": { + "type": "structure", + "required": ["projectIdentifier", "domainIdentifier", "name"], + "members": { + "projectIdentifier": { + "shape": "ProjectId" + }, + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "description": { + "shape": "String" + }, + "name": { + "shape": "String" + }, + "environmentProfileIdentifier": { + "shape": "EnvironmentProfileId" + }, + "userParameters": { + "shape": "EnvironmentParametersList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "environmentAccountIdentifier": { + "shape": "String" + }, + "environmentAccountRegion": { + "shape": "String" + }, + "environmentBlueprintIdentifier": { + "shape": "String" + }, + "resourceConfigurationId": { + "shape": "ResourceConfigurationId", + "internalonly": true + }, + "deploymentOrder": { + "shape": "Integer", + "internalonly": true + }, + "environmentConfigurationId": { + "shape": "String", + "internalonly": true + } + } + }, + "CreateEnvironmentOutput": { + "type": "structure", + "required": ["projectId", "domainId", "createdBy", "name", "provider"], + "members": { + "projectId": { + "shape": "ProjectId" + }, + "id": { + "shape": "EnvironmentId" + }, + "domainId": { + "shape": "DomainId" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentName" + }, + "description": { + "shape": "Description" + }, + "environmentProfileId": { + "shape": "EnvironmentProfileId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "provider": { + "shape": "String" + }, + "provisionedResources": { + "shape": "ResourceList" + }, + "permittedResources": { + "shape": "ResourceList", + "internalonly": true + }, + "status": { + "shape": "EnvironmentStatus" + }, + "environmentActions": { + "shape": "EnvironmentActionList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "lastDeployment": { + "shape": "Deployment" + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "deploymentProperties": { + "shape": "DeploymentProperties" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "environmentConfigurationId": { + "shape": "EnvironmentConfigurationId", + "internalonly": true + } + } + }, + "CreateEnvironmentProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "environmentBlueprintIdentifier", "projectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "EnvironmentProfileName" + }, + "description": { + "shape": "Description" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId" + }, + "projectIdentifier": { + "shape": "ProjectId" + }, + "userParameters": { + "shape": "EnvironmentParametersList" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "resourceConfigurationId": { + "shape": "ResourceConfigurationId" + } + } + }, + "CreateEnvironmentProfileOutput": { + "type": "structure", + "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], + "members": { + "id": { + "shape": "EnvironmentProfileId" + }, + "domainId": { + "shape": "DomainId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentProfileName" + }, + "description": { + "shape": "Description" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "projectId": { + "shape": "ProjectId" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "resourceConfigurationId": { + "shape": "ResourceConfigurationId" + } + } + }, + "CreateEnvironmentProfilePolicyGrantDetail": { + "type": "structure", + "members": { + "domainUnitId": { + "shape": "DomainUnitId" + } + } + }, + "CreateFormTypeInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "model", "owningProjectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "FormTypeName" + }, + "model": { + "shape": "Model" + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + }, + "status": { + "shape": "FormTypeStatus" + }, + "description": { + "shape": "Description" + } + } + }, + "CreateFormTypeOutput": { + "type": "structure", + "required": ["domainId", "name", "revision"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "FormTypeName" + }, + "revision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "originDomainId": { + "shape": "DomainId" + }, + "originProjectId": { + "shape": "ProjectId" + } + } + }, + "CreateFormTypePolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateGlossaryInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "owningProjectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "GlossaryName" + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + }, + "description": { + "shape": "GlossaryDescription" + }, + "status": { + "shape": "GlossaryStatus" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateGlossaryOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GlossaryId" + }, + "name": { + "shape": "GlossaryName" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "description": { + "shape": "GlossaryDescription" + }, + "status": { + "shape": "GlossaryStatus" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + } + } + }, + "CreateGlossaryPolicyDetail": { + "type": "structure", + "members": { + "principal": { + "shape": "UserGroupPolicyPrincipal" + }, + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateGlossaryPolicyDetails": { + "type": "list", + "member": { + "shape": "CreateGlossaryPolicyDetail" + } + }, + "CreateGlossaryPolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateGlossaryTermInput": { + "type": "structure", + "required": ["domainIdentifier", "glossaryIdentifier", "name"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "glossaryIdentifier": { + "shape": "GlossaryTermId" + }, + "name": { + "shape": "GlossaryTermName" + }, + "status": { + "shape": "GlossaryTermStatus" + }, + "shortDescription": { + "shape": "ShortDescription" + }, + "longDescription": { + "shape": "LongDescription" + }, + "termRelations": { + "shape": "TermRelations" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateGlossaryTermOutput": { + "type": "structure", + "required": ["id", "domainId", "glossaryId", "name", "status"], + "members": { + "id": { + "shape": "GlossaryTermId" + }, + "domainId": { + "shape": "DomainId" + }, + "glossaryId": { + "shape": "GlossaryId" + }, + "name": { + "shape": "GlossaryTermName" + }, + "status": { + "shape": "GlossaryTermStatus" + }, + "shortDescription": { + "shape": "ShortDescription" + }, + "longDescription": { + "shape": "LongDescription" + }, + "termRelations": { + "shape": "TermRelations" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + } + } + }, + "CreateGroupProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "groupIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "groupIdentifier": { + "shape": "GroupIdentifier" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "CreateGroupProfileOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GroupProfileId" + }, + "status": { + "shape": "GroupProfileStatus" + }, + "groupName": { + "shape": "GroupProfileName" + } + } + }, + "CreateListingChangeSetInput": { + "type": "structure", + "required": ["domainIdentifier", "entityIdentifier", "entityType", "action"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityIdentifier": { + "shape": "EntityIdentifier" + }, + "entityType": { + "shape": "EntityType" + }, + "entityRevision": { + "shape": "Revision" + }, + "action": { + "shape": "ChangeAction" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateListingChangeSetOutput": { + "type": "structure", + "required": ["listingId", "listingRevision", "status"], + "members": { + "listingId": { + "shape": "ListingId" + }, + "listingRevision": { + "shape": "Revision" + }, + "status": { + "shape": "ListingStatus" + } + } + }, + "CreatePartnerIntegrationInput": { + "type": "structure", + "required": ["name", "props"], + "members": { + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "props": { + "shape": "PartnerIntegrationPropertiesInput" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + }, + "internalonly": true + }, + "CreatePartnerIntegrationOutput": { + "type": "structure", + "required": ["id", "status", "partnerId", "name"], + "members": { + "id": { + "shape": "PartnerIntegrationId" + }, + "createdAt": { + "shape": "CreatedAtTimestamp" + }, + "updatedAt": { + "shape": "UpdatedAtTimestamp" + }, + "status": { + "shape": "PartnerIntegrationStatus" + }, + "partnerId": { + "shape": "PartnerId" + }, + "name": { + "shape": "Name" + }, + "props": { + "shape": "PartnerIntegrationPropertiesOutput" + } + }, + "internalonly": true + }, + "CreateProjectFromProjectProfilePolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + }, + "projectProfiles": { + "shape": "ProjectProfileList" + } + } + }, + "CreateProjectInput": { + "type": "structure", + "required": ["domainIdentifier", "name"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "ProjectName" + }, + "description": { + "shape": "Description" + }, + "tags": { + "shape": "Tags", + "internalonly": true + }, + "resourceTags": { + "shape": "CreateProjectInputResourceTagsMap" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "projectProfileId": { + "shape": "ProjectProfileId", + "internalonly": true + }, + "userParameters": { + "shape": "EnvironmentConfigurationUserParametersList", + "internalonly": true + }, + "customerProvidedRoleConfigs": { + "shape": "CustomerProvidedRoleConfigList", + "internalonly": true + }, + "membershipAssignments": { + "shape": "ProjectMembers", + "internalonly": true + } + } + }, + "CreateProjectInputResourceTagsMap": { + "type": "map", + "key": { + "shape": "TagKey" + }, + "value": { + "shape": "TagValue" + }, + "max": 25, + "min": 0 + }, + "CreateProjectMembershipInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier", "member"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "projectIdentifier" + }, + "member": { + "shape": "Member" + }, + "designation": { + "shape": "UserDesignation" + }, + "designationId": { + "shape": "DesignationId", + "internalonly": true + } + } + }, + "CreateProjectMembershipOutput": { + "type": "structure", + "members": {} + }, + "CreateProjectMembershipRequestInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier", "requestedDesignation", "reasonDescription"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "projectIdentifier" + }, + "requestedDesignation": { + "shape": "UserDesignation" + }, + "reasonDescription": { + "shape": "ReasonDescription" + }, + "requesterId": { + "shape": "String" + } + } + }, + "CreateProjectMembershipRequestOutput": { + "type": "structure", + "required": [ + "domainId", + "projectId", + "requestId", + "requestedDesignation", + "reasonDescription", + "requesterId" + ], + "members": { + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "requestId": { + "shape": "RequestId" + }, + "requestedDesignation": { + "shape": "UserDesignation" + }, + "requestStatus": { + "shape": "RequestStatus" + }, + "reasonDescription": { + "shape": "ReasonDescription" + }, + "requesterId": { + "shape": "String" + }, + "lastUpdatedBy": { + "shape": "String" + }, + "requestedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "CreateProjectOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectId" + }, + "name": { + "shape": "ProjectName" + }, + "description": { + "shape": "Description" + }, + "projectStatus": { + "shape": "ProjectStatus", + "documentation": "

Status of the project

" + }, + "failureReasons": { + "shape": "FailureReasons", + "documentation": "

Reasons for failed project deletion

" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "tags": { + "shape": "Tags", + "internalonly": true + }, + "resourceTags": { + "shape": "ResourceTags" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "projectProfileId": { + "shape": "ProjectProfileId", + "internalonly": true + }, + "userParameters": { + "shape": "EnvironmentConfigurationUserParametersList", + "internalonly": true + }, + "environmentDeploymentDetails": { + "shape": "EnvironmentDeploymentDetails", + "internalonly": true + }, + "projectCategory": { + "shape": "String", + "internalonly": true + } + } + }, + "CreateProjectPolicyDetail": { + "type": "structure", + "members": { + "principal": { + "shape": "UserGroupPolicyPrincipal" + }, + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateProjectPolicyDetails": { + "type": "list", + "member": { + "shape": "CreateProjectPolicyDetail" + } + }, + "CreateProjectPolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "CreateProjectProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "name"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "ProjectProfileName" + }, + "description": { + "shape": "Description" + }, + "status": { + "shape": "Status" + }, + "projectResourceTags": { + "shape": "ProjectResourceTagParameters" + }, + "allowCustomProjectResourceTags": { + "shape": "Boolean" + }, + "projectScopes": { + "shape": "ProjectScopesList", + "internalonly": true + }, + "environmentConfigurations": { + "shape": "EnvironmentConfigurationsList" + }, + "domainUnitIdentifier": { + "shape": "DomainUnitId" + }, + "designationConfigurations": { + "shape": "DesignationConfigurations", + "internalonly": true + } + } + }, + "CreateProjectProfileOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectProfileId" + }, + "name": { + "shape": "ProjectProfileName" + }, + "description": { + "shape": "Description" + }, + "changeLog": { + "shape": "String", + "internalonly": true + }, + "status": { + "shape": "Status" + }, + "projectResourceTags": { + "shape": "ProjectResourceTagParameters" + }, + "allowCustomProjectResourceTags": { + "shape": "Boolean" + }, + "projectScopes": { + "shape": "ProjectScopesList", + "internalonly": true + }, + "environmentConfigurations": { + "shape": "EnvironmentConfigurationsList" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "designationConfigurations": { + "shape": "DesignationConfigurations", + "internalonly": true + } + } + }, + "CreateRuleInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "target", "action", "scope", "detail"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "RuleName" + }, + "target": { + "shape": "RuleTarget" + }, + "action": { + "shape": "RuleAction" + }, + "scope": { + "shape": "RuleScope" + }, + "detail": { + "shape": "RuleDetail" + }, + "description": { + "shape": "Description" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "CreateRuleOutput": { + "type": "structure", + "required": [ + "identifier", + "name", + "ruleType", + "target", + "action", + "scope", + "detail", + "createdAt", + "createdBy" + ], + "members": { + "identifier": { + "shape": "RuleId" + }, + "name": { + "shape": "RuleName" + }, + "ruleType": { + "shape": "RuleType" + }, + "target": { + "shape": "RuleTarget" + }, + "action": { + "shape": "RuleAction" + }, + "scope": { + "shape": "RuleScope" + }, + "detail": { + "shape": "RuleDetail" + }, + "targetType": { + "shape": "RuleTargetType" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + } + } + }, + "CreateServiceLinkInput": { + "type": "structure", + "required": ["domainIdentifier", "name", "owningProjectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "ServiceLinkName" + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + }, + "identityMapping": { + "shape": "ServiceLinkIdentityMapping" + }, + "configurationInput": { + "shape": "ServiceLinkConfigurationInput" + } + }, + "internalonly": true + }, + "CreateServiceLinkOutput": { + "type": "structure", + "required": [ + "id", + "domainId", + "owningProjectId", + "domainUnitId", + "createdAt", + "updatedAt", + "status", + "type", + "name", + "createdBy", + "updatedBy", + "glueConnectionArn", + "serviceRoleArn", + "identityMapping", + "delegations", + "configurationOutput" + ], + "members": { + "id": { + "shape": "ServiceLinkId" + }, + "domainId": { + "shape": "DomainId" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "status": { + "shape": "ServiceLinkStatus" + }, + "type": { + "shape": "ServiceLinkType" + }, + "name": { + "shape": "ServiceLinkName" + }, + "error": { + "shape": "ServiceLinkError" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "glueConnectionArn": { + "shape": "String" + }, + "serviceRoleArn": { + "shape": "RoleArn" + }, + "identityMapping": { + "shape": "ServiceLinkIdentityMapping" + }, + "delegations": { + "shape": "ServiceLinkDelegations" + }, + "configurationOutput": { + "shape": "ServiceLinkConfigurationOutput" + } + }, + "internalonly": true + }, + "CreateSubscriptionGrantInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "grantedEntity"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId" + }, + "subscriptionTargetIdentifier": { + "shape": "SubscriptionTargetId" + }, + "grantedEntity": { + "shape": "GrantedEntityInput" + }, + "assetTargetNames": { + "shape": "AssetTargetNames" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "CreateSubscriptionGrantOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "createdAt", + "updatedAt", + "subscriptionTargetId", + "grantedEntity", + "status" + ], + "members": { + "id": { + "shape": "SubscriptionGrantId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "environmentId": { + "shape": "EnvironmentId", + "internalonly": true + }, + "subscriptionTargetId": { + "shape": "SubscriptionTargetId" + }, + "grantedEntity": { + "shape": "GrantedEntity" + }, + "status": { + "shape": "SubscriptionGrantOverallStatus" + }, + "assets": { + "shape": "SubscribedAssets" + }, + "subscriptionId": { + "shape": "SubscriptionId", + "deprecated": true, + "deprecatedMessage": "Multiple subscriptions can exist for a single grant" + } + } + }, + "CreateSubscriptionRequestInput": { + "type": "structure", + "required": ["domainIdentifier", "subscribedPrincipals", "subscribedListings"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "subscribedPrincipals": { + "shape": "SubscribedPrincipalInputs" + }, + "subscribedListings": { + "shape": "SubscribedListingInputs" + }, + "requestReason": { + "shape": "RequestReason" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + }, + "metadataForms": { + "shape": "MetadataFormInputs" + }, + "assetPermissions": { + "shape": "AssetPermissions" + }, + "assetScopes": { + "shape": "AcceptedAssetScopes" + } + } + }, + "CreateSubscriptionRequestOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "requestReason", + "subscribedPrincipals", + "subscribedListings" + ], + "members": { + "id": { + "shape": "SubscriptionRequestId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionRequestStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "requestReason": { + "shape": "RequestReason" + }, + "subscribedPrincipals": { + "shape": "CreateSubscriptionRequestOutputSubscribedPrincipalsList" + }, + "subscribedListings": { + "shape": "CreateSubscriptionRequestOutputSubscribedListingsList" + }, + "reviewerId": { + "shape": "String" + }, + "decisionComment": { + "shape": "DecisionComment" + }, + "existingSubscriptionId": { + "shape": "SubscriptionId" + }, + "metadataForms": { + "shape": "MetadataForms" + } + } + }, + "CreateSubscriptionRequestOutputSubscribedListingsList": { + "type": "list", + "member": { + "shape": "SubscribedListing" + }, + "max": 1, + "min": 1 + }, + "CreateSubscriptionRequestOutputSubscribedPrincipalsList": { + "type": "list", + "member": { + "shape": "SubscribedPrincipal" + }, + "max": 1, + "min": 1 + }, + "CreateSubscriptionTargetInput": { + "type": "structure", + "required": [ + "domainIdentifier", + "environmentIdentifier", + "name", + "type", + "authorizedPrincipals", + "applicableAssetTypes" + ], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "name": { + "shape": "SubscriptionTargetName" + }, + "type": { + "shape": "String" + }, + "subscriptionTargetConfig": { + "shape": "SubscriptionTargetForms" + }, + "authorizedPrincipals": { + "shape": "AuthorizedPrincipalIdentifiers" + }, + "manageAccessRole": { + "shape": "IamRoleArn" + }, + "applicableAssetTypes": { + "shape": "ApplicableAssetTypes" + }, + "provider": { + "shape": "String" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + }, + "timeoutMinutes": { + "shape": "CreateSubscriptionTargetInputTimeoutMinutesInteger" + } + } + }, + "CreateSubscriptionTargetInputTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "min": 1 + }, + "CreateSubscriptionTargetOutput": { + "type": "structure", + "required": [ + "id", + "authorizedPrincipals", + "domainId", + "projectId", + "environmentId", + "name", + "type", + "createdBy", + "createdAt", + "applicableAssetTypes", + "subscriptionTargetConfig", + "provider" + ], + "members": { + "id": { + "shape": "SubscriptionTargetId" + }, + "authorizedPrincipals": { + "shape": "AuthorizedPrincipalIdentifiers" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "SubscriptionTargetName" + }, + "type": { + "shape": "String" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "manageAccessRole": { + "shape": "IamRoleArn" + }, + "applicableAssetTypes": { + "shape": "ApplicableAssetTypes" + }, + "subscriptionTargetConfig": { + "shape": "SubscriptionTargetForms" + }, + "provider": { + "shape": "String" + }, + "timeoutMinutes": { + "shape": "CreateSubscriptionTargetOutputTimeoutMinutesInteger" + } + } + }, + "CreateSubscriptionTargetOutputTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "min": 1 + }, + "CreateUserProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "userIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "userIdentifier": { + "shape": "UserIdentifier" + }, + "userType": { + "shape": "UserType" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "CreateUserProfileOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "UserProfileId" + }, + "type": { + "shape": "UserProfileType" + }, + "status": { + "shape": "UserProfileStatus" + }, + "details": { + "shape": "UserProfileDetails" + } + } + }, + "CreatedAt": { + "type": "timestamp" + }, + "CreatedAtTimestamp": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "CreatedBy": { + "type": "string" + }, + "CredentialId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "CredentialMap": { + "type": "map", + "key": { + "shape": "CredentialMapKeyString" + }, + "value": { + "shape": "CredentialMapValueString" + }, + "sensitive": true + }, + "CredentialMapKeyString": { + "type": "string", + "max": 128, + "min": 1 + }, + "CredentialMapValueString": { + "type": "string", + "max": 4096, + "min": 1 + }, + "CronString": { + "type": "string", + "max": 256, + "min": 1, + "pattern": ".*cron\\((\\b[0-5]?[0-9]\\b) (\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\).*" + }, + "CustomAccountPoolHandler": { + "type": "structure", + "required": ["lambdaFunctionArn"], + "members": { + "lambdaFunctionArn": { + "shape": "LambdaFunctionArn" + }, + "lambdaExecutionRoleArn": { + "shape": "LambdaExecutionRoleArn" + } + } + }, + "CustomParameter": { + "type": "structure", + "required": ["keyName", "fieldType"], + "members": { + "keyName": { + "shape": "CustomParameterKeyNameString" + }, + "description": { + "shape": "Description" + }, + "fieldType": { + "shape": "String" + }, + "defaultValue": { + "shape": "String" + }, + "isEditable": { + "shape": "Boolean" + }, + "isOptional": { + "shape": "Boolean" + }, + "isUpdateSupported": { + "shape": "Boolean" + } + } + }, + "CustomParameterKeyNameString": { + "type": "string", + "pattern": "[a-zA-Z_][a-zA-Z0-9_]*" + }, + "CustomParameterList": { + "type": "list", + "member": { + "shape": "CustomParameter" + } + }, + "CustomResourceProperties": { + "type": "structure", + "members": { + "name": { + "shape": "String" + } + } + }, + "CustomerProvidedRoleConfig": { + "type": "structure", + "required": ["roleArn"], + "members": { + "roleArn": { + "shape": "CustomerProvidedRoleConfigRoleArnString" + }, + "roleDesignation": { + "shape": "CustomerProvidedRoleConfigRoleDesignationString" + } + }, + "internalonly": true + }, + "CustomerProvidedRoleConfigList": { + "type": "list", + "member": { + "shape": "CustomerProvidedRoleConfig" + }, + "internalonly": true + }, + "CustomerProvidedRoleConfigRoleArnString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role|role/aws-reserved/sso.amazonaws.com)/[\\w+=,.@-]*" + }, + "CustomerProvidedRoleConfigRoleDesignationString": { + "type": "string", + "max": 64, + "min": 0, + "pattern": "[\\w -]+" + }, + "DataAssetActivityStatus": { + "type": "string", + "enum": [ + "FAILED", + "PUBLISHING_FAILED", + "SUCCEEDED_CREATED", + "SUCCEEDED_UPDATED", + "SKIPPED_ALREADY_IMPORTED", + "SKIPPED_ARCHIVED", + "SKIPPED_NO_ACCESS", + "UNCHANGED" + ] + }, + "DataAssetIngestionDetail": { + "type": "structure", + "required": ["status", "externalIdentifier"], + "members": { + "id": { + "shape": "AssetId" + }, + "status": { + "shape": "DataAssetActivityStatus" + }, + "revision": { + "shape": "String" + }, + "externalIdentifier": { + "shape": "String" + }, + "errorType": { + "shape": "ErrorType" + }, + "errorDetail": { + "shape": "ErrorDetail" + } + } + }, + "DataAssetIngestionDetails": { + "type": "list", + "member": { + "shape": "DataAssetIngestionDetail" + }, + "max": 500, + "min": 0 + }, + "DataPointIdentifier": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{0,36}" + }, + "DataProductDescription": { + "type": "string", + "max": 4096, + "min": 1, + "sensitive": true + }, + "DataProductId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "DataProductItem": { + "type": "structure", + "required": ["itemType", "identifier"], + "members": { + "itemType": { + "shape": "DataProductItemType" + }, + "identifier": { + "shape": "EntityIdentifier" + }, + "revision": { + "shape": "Revision" + }, + "glossaryTerms": { + "shape": "ItemGlossaryTerms" + } + } + }, + "DataProductItemAdditionalAttributes": { + "type": "structure", + "members": { + "matchRationale": { + "shape": "MatchRationale" + } + } + }, + "DataProductItemCountsMap": { + "type": "map", + "key": { + "shape": "DataProductItemType" + }, + "value": { + "shape": "Integer" + }, + "internalonly": true + }, + "DataProductItemType": { + "type": "string", + "enum": ["ASSET"] + }, + "DataProductItems": { + "type": "list", + "member": { + "shape": "DataProductItem" + }, + "min": 1 + }, + "DataProductListing": { + "type": "structure", + "members": { + "dataProductId": { + "shape": "DataProductId" + }, + "dataProductRevision": { + "shape": "Revision" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "forms": { + "shape": "Forms" + }, + "dataProductFormsMetadata": { + "shape": "AssetFormMetadataList", + "internalonly": true + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "items": { + "shape": "ListingSummaries" + } + } + }, + "DataProductListingItem": { + "type": "structure", + "members": { + "listingId": { + "shape": "ListingId" + }, + "listingRevision": { + "shape": "Revision" + }, + "name": { + "shape": "DataProductName" + }, + "entityId": { + "shape": "DataProductId" + }, + "entityRevision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "listingCreatedAt": { + "shape": "CreatedAt", + "internalonly": true + }, + "listingUpdatedAt": { + "shape": "UpdatedAt", + "internalonly": true + }, + "listingCreatedBy": { + "shape": "CreatedBy" + }, + "listingUpdatedBy": { + "shape": "UpdatedBy" + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "additionalAttributes": { + "shape": "DataProductListingItemAdditionalAttributes" + }, + "items": { + "shape": "ListingSummaryItems" + } + } + }, + "DataProductListingItemAdditionalAttributes": { + "type": "structure", + "members": { + "forms": { + "shape": "Forms" + }, + "matchRationale": { + "shape": "MatchRationale" + } + }, + "sensitive": true + }, + "DataProductName": { + "type": "string", + "max": 64, + "min": 1, + "sensitive": true + }, + "DataProductResultItem": { + "type": "structure", + "required": ["domainId", "id", "name", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DataProductId" + }, + "name": { + "shape": "DataProductName" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "description": { + "shape": "DataProductDescription" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + }, + "itemCounts": { + "shape": "DataProductItemCountsMap", + "internalonly": true + }, + "additionalAttributes": { + "shape": "DataProductItemAdditionalAttributes" + } + } + }, + "DataProductRevision": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DataProductId" + }, + "revision": { + "shape": "Revision" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + } + } + }, + "DataProductRevisions": { + "type": "list", + "member": { + "shape": "DataProductRevision" + } + }, + "DataProductStatus": { + "type": "string", + "enum": ["CREATED", "CREATING", "CREATE_FAILED"] + }, + "DataSourceConfigurationInput": { + "type": "structure", + "members": { + "glueRunConfiguration": { + "shape": "GlueRunConfigurationInput" + }, + "redshiftRunConfiguration": { + "shape": "RedshiftRunConfigurationInput" + }, + "sageMakerRunConfiguration": { + "shape": "SageMakerRunConfigurationInput" + }, + "snowflakeRunConfiguration": { + "shape": "SnowflakeRunConfigurationInput", + "internalonly": true + }, + "databricksRunConfiguration": { + "shape": "DatabricksRunConfigurationInput", + "internalonly": true + }, + "kinesisRunConfiguration": { + "shape": "KinesisRunConfigurationInput", + "internalonly": true + }, + "mskRunConfiguration": { + "shape": "MskRunConfigurationInput", + "internalonly": true + } + }, + "union": true + }, + "DataSourceConfigurationOutput": { + "type": "structure", + "members": { + "glueRunConfiguration": { + "shape": "GlueRunConfigurationOutput" + }, + "redshiftRunConfiguration": { + "shape": "RedshiftRunConfigurationOutput" + }, + "sageMakerRunConfiguration": { + "shape": "SageMakerRunConfigurationOutput" + }, + "snowflakeRunConfiguration": { + "shape": "SnowflakeRunConfigurationOutput", + "internalonly": true + }, + "databricksRunConfiguration": { + "shape": "DatabricksRunConfigurationOutput", + "internalonly": true + }, + "kinesisRunConfiguration": { + "shape": "KinesisRunConfigurationOutput", + "internalonly": true + }, + "mskRunConfiguration": { + "shape": "MskRunConfigurationOutput", + "internalonly": true + } + }, + "union": true + }, + "DataSourceErrorMessage": { + "type": "structure", + "required": ["errorType"], + "members": { + "errorType": { + "shape": "DataSourceErrorType" + }, + "errorDetail": { + "shape": "String" + } + } + }, + "DataSourceErrorType": { + "type": "string", + "enum": [ + "ACCESS_DENIED_EXCEPTION", + "CONFLICT_EXCEPTION", + "INTERNAL_SERVER_EXCEPTION", + "RESOURCE_NOT_FOUND_EXCEPTION", + "SERVICE_QUOTA_EXCEEDED_EXCEPTION", + "THROTTLING_EXCEPTION", + "VALIDATION_EXCEPTION" + ] + }, + "DataSourceId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "DataSourceRunActivities": { + "type": "list", + "member": { + "shape": "DataSourceRunActivity" + } + }, + "DataSourceRunActivity": { + "type": "structure", + "required": [ + "database", + "dataSourceRunId", + "technicalName", + "dataAssetStatus", + "projectId", + "createdAt", + "updatedAt" + ], + "members": { + "database": { + "shape": "Name" + }, + "dataSourceRunId": { + "shape": "DataSourceRunId" + }, + "technicalName": { + "shape": "Name" + }, + "dataAssetStatus": { + "shape": "DataAssetActivityStatus" + }, + "projectId": { + "shape": "ProjectId" + }, + "dataAssetId": { + "shape": "String" + }, + "technicalDescription": { + "shape": "Description" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "lineageSummary": { + "shape": "LineageInfo" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + } + } + }, + "DataSourceRunCompletionStatus": { + "type": "string", + "enum": ["COMPLETED", "ABORTED", "TIMED_OUT"] + }, + "DataSourceRunId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "DataSourceRunLineageSummary": { + "type": "structure", + "members": { + "importStatus": { + "shape": "LineageImportStatus" + } + } + }, + "DataSourceRunStatus": { + "type": "string", + "enum": [ + "REQUESTED", + "RUNNING", + "FAILED", + "PARTIALLY_SUCCEEDED", + "SUCCESS", + "UPDATE_REQUESTED", + "UPDATING", + "UPDATE_FAILED", + "SKIPPED" + ] + }, + "DataSourceRunSummaries": { + "type": "list", + "member": { + "shape": "DataSourceRunSummary" + } + }, + "DataSourceRunSummary": { + "type": "structure", + "required": ["id", "dataSourceId", "type", "status", "projectId", "createdAt", "updatedAt"], + "members": { + "id": { + "shape": "DataSourceRunId" + }, + "dataSourceId": { + "shape": "DataSourceId" + }, + "type": { + "shape": "DataSourceRunType" + }, + "status": { + "shape": "DataSourceRunStatus" + }, + "projectId": { + "shape": "ProjectId" + }, + "runStatisticsForAssets": { + "shape": "RunStatisticsForAssets" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + }, + "startedAt": { + "shape": "DateTime" + }, + "stoppedAt": { + "shape": "DateTime" + }, + "lineageSummary": { + "shape": "DataSourceRunLineageSummary" + } + } + }, + "DataSourceRunType": { + "type": "string", + "enum": ["PRIORITIZED", "SCHEDULED"] + }, + "DataSourceStatus": { + "type": "string", + "enum": [ + "CREATING", + "FAILED_CREATION", + "READY", + "UPDATING", + "FAILED_UPDATE", + "RUNNING", + "DELETING", + "FAILED_DELETION" + ] + }, + "DataSourceSummaries": { + "type": "list", + "member": { + "shape": "DataSourceSummary" + } + }, + "DataSourceSummary": { + "type": "structure", + "required": ["domainId", "dataSourceId", "name", "type", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "String" + }, + "connectionId": { + "shape": "String" + }, + "dataSourceId": { + "shape": "DataSourceId" + }, + "name": { + "shape": "Name" + }, + "type": { + "shape": "String" + }, + "status": { + "shape": "DataSourceStatus" + }, + "enableSetting": { + "shape": "EnableSetting" + }, + "schedule": { + "shape": "ScheduleConfiguration" + }, + "lastRunStatus": { + "shape": "DataSourceRunStatus" + }, + "lastRunAt": { + "shape": "DateTime" + }, + "lastRunErrorMessage": { + "shape": "DataSourceErrorMessage" + }, + "lastRunAssetCount": { + "shape": "Integer" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + }, + "description": { + "shape": "Description" + } + } + }, + "DataZoneAction": { + "type": "string", + "enum": [ + "UPDATE_PROJECT", + "DELETE_PROJECT", + "CREATE_PROJECT_MEMBERSHIP", + "DELETE_PROJECT_MEMBERSHIP", + "UPDATE_GLOSSARY", + "DELETE_GLOSSARY", + "UPDATE_GLOSSARY_TERM", + "DELETE_GLOSSARY_TERM", + "RELATE_GLOSSARY_TERM", + "CREATE_LISTING_CHANGESET", + "DELETE_LISTING", + "CREATE_DATA_PRODUCT", + "CREATE_DATA_PRODUCT_REVISION", + "DELETE_DATA_PRODUCT", + "GET_DATA_PRODUCT", + "LIST_DATA_PRODUCT_REVISIONS", + "ACCEPT_PREDICTIONS", + "REJECT_PREDICTIONS", + "START_METADATA_GENERATION_RUN", + "GET_METADATA_GENERATION_RUN", + "CANCEL_METADATA_GENERATION_RUN", + "CREATE_DATA_SOURCE", + "UPDATE_DATA_SOURCE", + "DELETE_DATA_SOURCE", + "START_DATA_SOURCE_RUN", + "UPDATE_DATA_SOURCE_RUN_ACTIVITIES", + "POST_TIME_SERIES_DATA_POINTS", + "LIST_TIME_SERIES_DATA_POINTS", + "GET_TIME_SERIES_DATA_POINT", + "DELETE_TIME_SERIES_DATA_POINTS", + "DELETE_ENVIRONMENT", + "UPDATE_ENVIRONMENT", + "UPDATE_ENVIRONMENT_STATUS", + "GET_ENVIRONMENT_CREDENTIALS", + "GET_ENVIRONMENT_ACTION_LINK", + "ASSOCIATE_ENVIRONMENT_ROLE", + "DISASSOCIATE_ENVIRONMENT_ROLE", + "CREATE_ENVIRONMENT_ACTION", + "UPDATE_ENVIRONMENT_ACTION", + "DELETE_ENVIRONMENT_ACTION", + "GET_ENVIRONMENT_ACTION", + "LIST_ENVIRONMENT_ACTIONS", + "UPDATE_ENVIRONMENT_PROFILE", + "DELETE_ENVIRONMENT_PROFILE", + "CREATE_SUBSCRIPTION_GRANT", + "CREATE_SUBSCRIPTION_REQUEST", + "UPDATE_SUBSCRIPTION_REQUEST", + "ACCEPT_SUBSCRIPTION_REQUEST", + "REJECT_SUBSCRIPTION_REQUEST", + "DELETE_SUBSCRIPTION_REQUEST", + "DELETE_SUBSCRIPTION_GRANT", + "CANCEL_SUBSCRIPTION", + "REVOKE_SUBSCRIPTION", + "DELETE_FORM_TYPE", + "DELETE_ASSET_TYPE", + "CREATE_ASSET", + "CREATE_ASSET_REVISION", + "DELETE_ASSET", + "GET_ASSET", + "LIST_ASSET_REVISIONS", + "CREATE_ASSET_FILTER", + "GET_ASSET_FILTER", + "UPDATE_ASSET_FILTER", + "DELETE_ASSET_FILTER", + "LIST_ASSET_FILTERS", + "SEARCH", + "GET_ENVIRONMENT_ROLE", + "UPDATE_ENVIRONMENT_ROLE", + "LIST_ENVIRONMENT_ROLES", + "CREATE_CONNECTION", + "GET_CONNECTION", + "UPDATE_CONNECTION", + "DELETE_CONNECTION", + "LIST_CONNECTION", + "LIST_JOB_RUNS", + "GET_JOB_RUNS", + "ASSOCIATE_GOVERNED_TERMS", + "DISASSOCIATE_GOVERNED_TERMS" + ] + }, + "DataZoneDomainVersion": { + "type": "string", + "enum": ["V1", "V2"] + }, + "DataZoneEntityType": { + "type": "string", + "enum": ["DomainUnit", "DOMAIN_UNIT"] + }, + "DatabricksCredentials": { + "type": "structure", + "members": { + "oauth2": { + "shape": "OAuth2" + } + }, + "sensitive": true + }, + "DatabricksFilterConfiguration": { + "type": "structure", + "required": ["catalogName"], + "members": { + "catalogName": { + "shape": "DatabricksFilterConfigurationCatalogNameString" + }, + "schemaName": { + "shape": "DatabricksFilterConfigurationSchemaNameString" + }, + "filterExpressions": { + "shape": "FilterExpressions" + } + }, + "internalonly": true + }, + "DatabricksFilterConfigurationCatalogNameString": { + "type": "string", + "max": 255, + "min": 1 + }, + "DatabricksFilterConfigurationSchemaNameString": { + "type": "string", + "max": 255, + "min": 1 + }, + "DatabricksFilterConfigurations": { + "type": "list", + "member": { + "shape": "DatabricksFilterConfiguration" + }, + "internalonly": true + }, + "DatabricksPropertiesInput": { + "type": "structure", + "members": { + "credentials": { + "shape": "DatabricksCredentials" + }, + "glueConnectionName": { + "shape": "DatabricksPropertiesInputGlueConnectionNameString" + }, + "identityMapping": { + "shape": "IdentityMapping" + }, + "serviceRole": { + "shape": "String" + }, + "workspaceInstanceName": { + "shape": "DatabricksPropertiesInputWorkspaceInstanceNameString" + } + } + }, + "DatabricksPropertiesInputGlueConnectionNameString": { + "type": "string", + "max": 64, + "min": 0 + }, + "DatabricksPropertiesInputWorkspaceInstanceNameString": { + "type": "string", + "max": 64, + "min": 0 + }, + "DatabricksPropertiesOutput": { + "type": "structure", + "members": { + "identityMapping": { + "shape": "IdentityMapping" + }, + "serviceRole": { + "shape": "String" + }, + "status": { + "shape": "ConnectionStatus" + }, + "workspaceInstanceName": { + "shape": "String" + } + } + }, + "DatabricksRunConfigurationInput": { + "type": "structure", + "required": ["databricksFilterConfigurations"], + "members": { + "databricksFilterConfigurations": { + "shape": "DatabricksFilterConfigurations" + } + }, + "internalonly": true + }, + "DatabricksRunConfigurationOutput": { + "type": "structure", + "required": ["databricksFilterConfigurations"], + "members": { + "databricksFilterConfigurations": { + "shape": "DatabricksFilterConfigurations" + } + }, + "internalonly": true + }, + "DatabricksServiceLinkConfigurationInput": { + "type": "structure", + "required": ["accountId", "workspaceInstanceName", "credentials"], + "members": { + "accountId": { + "shape": "String" + }, + "workspaceInstanceName": { + "shape": "String" + }, + "credentials": { + "shape": "OAuth2Credentials" + } + }, + "internalonly": true + }, + "DatabricksServiceLinkConfigurationOutput": { + "type": "structure", + "required": ["accountId", "workspaceInstanceName"], + "members": { + "accountId": { + "shape": "String" + }, + "workspaceInstanceName": { + "shape": "String" + } + }, + "internalonly": true + }, + "DateTime": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "DeactivatePortalVersion": { + "type": "string", + "enum": ["V1", "NONE"] + }, + "DecisionComment": { + "type": "string", + "max": 4096, + "min": 1, + "sensitive": true + }, + "DeleteAccountPoolInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AccountPoolId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteAccountPoolOutput": { + "type": "structure", + "members": {} + }, + "DeleteAssetFilterInput": { + "type": "structure", + "required": ["domainIdentifier", "assetIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "assetIdentifier": { + "shape": "AssetId", + "location": "uri", + "locationName": "assetIdentifier" + }, + "identifier": { + "shape": "FilterId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteAssetInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetIdentifier", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteAssetOutput": { + "type": "structure", + "members": {} + }, + "DeleteAssetTypeInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetTypeIdentifier", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteAssetTypeOutput": { + "type": "structure", + "members": {} + }, + "DeleteConnectionInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ConnectionId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteConnectionOutput": { + "type": "structure", + "members": { + "status": { + "shape": "String" + } + } + }, + "DeleteDataProductInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataProductId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteDataProductOutput": { + "type": "structure", + "members": {} + }, + "DeleteDataSourceInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataSourceId", + "location": "uri", + "locationName": "identifier" + }, + "clientToken": { + "shape": "String", + "deprecated": true, + "deprecatedMessage": "This field is no longer required for idempotency.", + "idempotencyToken": true, + "location": "querystring", + "locationName": "clientToken" + }, + "retainPermissionsOnRevokeFailure": { + "shape": "Boolean", + "location": "querystring", + "locationName": "retainPermissionsOnRevokeFailure" + } + } + }, + "DeleteDataSourceOutput": { + "type": "structure", + "required": ["id", "name", "domainId", "projectId"], + "members": { + "id": { + "shape": "DataSourceId" + }, + "status": { + "shape": "DataSourceStatus" + }, + "type": { + "shape": "String" + }, + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "connectionId": { + "shape": "String" + }, + "configuration": { + "shape": "DataSourceConfigurationOutput" + }, + "enableSetting": { + "shape": "EnableSetting" + }, + "publishOnImport": { + "shape": "Boolean" + }, + "assetFormsOutput": { + "shape": "FormOutputList" + }, + "schedule": { + "shape": "ScheduleConfiguration" + }, + "lastRunStatus": { + "shape": "DataSourceRunStatus" + }, + "lastRunAt": { + "shape": "DateTime" + }, + "lastRunErrorMessage": { + "shape": "DataSourceErrorMessage" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + }, + "selfGrantStatus": { + "shape": "SelfGrantStatusOutput" + }, + "retainPermissionsOnRevokeFailure": { + "shape": "Boolean" + } + } + }, + "DeleteDomainInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "identifier" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true, + "location": "querystring", + "locationName": "clientToken" + }, + "skipDeletionCheck": { + "shape": "Boolean", + "documentation": "

Optional flag to delete all child entities within the domain

", + "location": "querystring", + "locationName": "skipDeletionCheck" + }, + "cascadeDelete": { + "shape": "Boolean", + "location": "querystring", + "locationName": "cascadeDelete" + } + } + }, + "DeleteDomainOutput": { + "type": "structure", + "required": ["status"], + "members": { + "status": { + "shape": "DomainStatus" + } + } + }, + "DeleteDomainPolicyInput": { + "type": "structure", + "required": ["domainId", "policyId"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "policyId": { + "shape": "PolicyId", + "location": "uri", + "locationName": "policyId" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true, + "location": "querystring", + "locationName": "clientToken" + } + } + }, + "DeleteDomainPolicyOutput": { + "type": "structure", + "required": ["domainId", "policyId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "policyId": { + "shape": "PolicyId" + } + } + }, + "DeleteDomainSharingPolicyInput": { + "type": "structure", + "required": ["domainArn"], + "members": { + "domainArn": { + "shape": "DomainArn", + "location": "uri", + "locationName": "domainArn" + } + } + }, + "DeleteDomainSharingPolicyOutput": { + "type": "structure", + "members": {} + }, + "DeleteDomainUnitInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DomainUnitId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteDomainUnitOutput": { + "type": "structure", + "members": {} + }, + "DeleteDomainUnitPolicyInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DomainUnitPolicyId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteDomainUnitPolicyOutput": { + "type": "structure", + "members": {} + }, + "DeleteEnvironmentActionInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "identifier": { + "shape": "String", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteEnvironmentBlueprintConfigurationInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentBlueprintIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId", + "location": "uri", + "locationName": "environmentBlueprintIdentifier" + } + } + }, + "DeleteEnvironmentBlueprintConfigurationOutput": { + "type": "structure", + "members": {} + }, + "DeleteEnvironmentBlueprintInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentBlueprintId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteEnvironmentInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteEnvironmentProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentProfileId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteFormTypeInput": { + "type": "structure", + "required": ["domainIdentifier", "formTypeIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "formTypeIdentifier": { + "shape": "FormTypeIdentifier", + "location": "uri", + "locationName": "formTypeIdentifier" + } + } + }, + "DeleteFormTypeOutput": { + "type": "structure", + "members": {} + }, + "DeleteGlossaryInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "GlossaryId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteGlossaryOutput": { + "type": "structure", + "members": {} + }, + "DeleteGlossaryTermInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "GlossaryTermId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteGlossaryTermOutput": { + "type": "structure", + "members": {} + }, + "DeleteGroupProfileInput": { + "type": "structure", + "required": ["domainId", "groupId"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "groupId": { + "shape": "GroupProfileId", + "location": "uri", + "locationName": "groupId" + } + } + }, + "DeleteGroupProfileOutput": { + "type": "structure", + "members": {} + }, + "DeleteLineageEventInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "LineageEventIdentifier", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteLineageEventOutput": { + "type": "structure", + "members": { + "id": { + "shape": "LineageEventIdentifier" + }, + "domainId": { + "shape": "DomainId" + }, + "processingStatus": { + "shape": "LineageEventProcessingStatus" + } + } + }, + "DeleteListingInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ListingId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteListingOutput": { + "type": "structure", + "members": {} + }, + "DeletePartnerIntegrationInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "PartnerIntegrationId", + "location": "uri", + "locationName": "identifier" + } + }, + "internalonly": true + }, + "DeletePartnerIntegrationOutput": { + "type": "structure", + "required": ["status"], + "members": { + "status": { + "shape": "PartnerIntegrationStatus" + } + }, + "internalonly": true + }, + "DeleteProjectInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "identifier" + }, + "skipDeletionCheck": { + "shape": "Boolean", + "documentation": "

Optional flag to asynchronously delete child entities within the project

", + "location": "querystring", + "locationName": "skipDeletionCheck" + } + } + }, + "DeleteProjectMembershipInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier", "member"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "projectIdentifier" + }, + "member": { + "shape": "Member" + }, + "designation": { + "shape": "UserDesignation", + "internalonly": true + } + } + }, + "DeleteProjectMembershipOutput": { + "type": "structure", + "members": {} + }, + "DeleteProjectOutput": { + "type": "structure", + "members": {} + }, + "DeleteProjectProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ProjectProfileId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteProjectProfileOutput": { + "type": "structure", + "members": {} + }, + "DeleteRuleInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "RuleId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteRuleOutput": { + "type": "structure", + "members": {} + }, + "DeleteServiceLinkInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ServiceLinkId", + "location": "uri", + "locationName": "identifier" + } + }, + "internalonly": true + }, + "DeleteSubscriptionGrantInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionGrantId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteSubscriptionGrantOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "createdAt", + "updatedAt", + "subscriptionTargetId", + "grantedEntity", + "status" + ], + "members": { + "id": { + "shape": "SubscriptionGrantId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "environmentId": { + "shape": "EnvironmentId", + "internalonly": true + }, + "subscriptionTargetId": { + "shape": "SubscriptionTargetId" + }, + "grantedEntity": { + "shape": "GrantedEntity" + }, + "status": { + "shape": "SubscriptionGrantOverallStatus" + }, + "assets": { + "shape": "SubscribedAssets" + }, + "subscriptionId": { + "shape": "SubscriptionId", + "deprecated": true, + "deprecatedMessage": "Multiple subscriptions can exist for a single grant" + } + } + }, + "DeleteSubscriptionRequestInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionRequestId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteSubscriptionTargetInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "identifier": { + "shape": "SubscriptionTargetId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DeleteTimeSeriesDataPointsInput": { + "type": "structure", + "required": ["domainIdentifier", "entityIdentifier", "entityType", "formName"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityIdentifier": { + "shape": "EntityIdentifier", + "location": "uri", + "locationName": "entityIdentifier" + }, + "entityType": { + "shape": "TimeSeriesEntityType", + "location": "uri", + "locationName": "entityType" + }, + "formName": { + "shape": "TimeSeriesFormName", + "location": "querystring", + "locationName": "formName" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true, + "location": "querystring", + "locationName": "clientToken" + } + } + }, + "DeleteTimeSeriesDataPointsOutput": { + "type": "structure", + "members": {} + }, + "DeleteUserProfileInput": { + "type": "structure", + "required": ["domainId", "userId"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "userId": { + "shape": "UserProfileId", + "location": "uri", + "locationName": "userId" + } + } + }, + "DeleteUserProfileOutput": { + "type": "structure", + "members": {} + }, + "Deployment": { + "type": "structure", + "members": { + "deploymentId": { + "shape": "String" + }, + "deploymentType": { + "shape": "DeploymentType" + }, + "deploymentStatus": { + "shape": "DeploymentStatus" + }, + "failureReason": { + "shape": "EnvironmentError" + }, + "messages": { + "shape": "DeploymentMessagesList" + }, + "isDeploymentComplete": { + "shape": "Boolean" + } + } + }, + "DeploymentId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "DeploymentMessage": { + "type": "string" + }, + "DeploymentMessagesList": { + "type": "list", + "member": { + "shape": "DeploymentMessage" + } + }, + "DeploymentMode": { + "type": "string", + "enum": ["ON_CREATE", "ON_DEMAND"] + }, + "DeploymentOrder": { + "type": "integer", + "box": true, + "max": 16, + "min": 0 + }, + "DeploymentProperties": { + "type": "structure", + "members": { + "startTimeoutMinutes": { + "shape": "DeploymentPropertiesStartTimeoutMinutesInteger" + }, + "endTimeoutMinutes": { + "shape": "DeploymentPropertiesEndTimeoutMinutesInteger" + } + } + }, + "DeploymentPropertiesEndTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "max": 225, + "min": 1 + }, + "DeploymentPropertiesStartTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "max": 225, + "min": 1 + }, + "DeploymentStatus": { + "type": "string", + "enum": ["IN_PROGRESS", "SUCCESSFUL", "FAILED", "PENDING_DEPLOYMENT"] + }, + "DeploymentType": { + "type": "string", + "enum": ["CREATE", "UPDATE", "DELETE"] + }, + "Description": { + "type": "string", + "max": 2048, + "min": 0, + "sensitive": true + }, + "DesignationConfiguration": { + "type": "structure", + "required": ["id", "name", "allowedActions", "roleTag"], + "members": { + "id": { + "shape": "DesignationConfigurationId" + }, + "name": { + "shape": "DesignationName" + }, + "allowedActions": { + "shape": "AllowedDataZoneActions" + }, + "description": { + "shape": "Description" + }, + "roleTag": { + "shape": "RoleTag" + } + } + }, + "DesignationConfigurationId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "DesignationConfigurations": { + "type": "list", + "member": { + "shape": "DesignationConfiguration" + } + }, + "DesignationId": { + "type": "string", + "max": 36, + "min": 1, + "pattern": "[a-zA-Z0-9_-]+" + }, + "DesignationName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+" + }, + "DesignationSummaries": { + "type": "list", + "member": { + "shape": "DesignationSummary" + } + }, + "DesignationSummary": { + "type": "structure", + "required": [ + "domainId", + "id", + "name", + "projectId", + "designationConfigurationId", + "roleTag", + "provider", + "createdBy" + ], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DesignationId" + }, + "name": { + "shape": "DesignationName" + }, + "projectId": { + "shape": "ProjectId" + }, + "designationConfigurationId": { + "shape": "DesignationConfigurationId" + }, + "roleTag": { + "shape": "RoleTag" + }, + "description": { + "shape": "Description" + }, + "provider": { + "shape": "String" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "domainUnitId": { + "shape": "DomainUnitId", + "internalonly": true + } + } + }, + "DetailedGlossaryTerm": { + "type": "structure", + "members": { + "id": { + "shape": "GlossaryTermId", + "internalonly": true + }, + "glossaryId": { + "shape": "GlossaryId", + "internalonly": true + }, + "name": { + "shape": "GlossaryTermName" + }, + "shortDescription": { + "shape": "ShortDescription" + } + } + }, + "DetailedGlossaryTerms": { + "type": "list", + "member": { + "shape": "DetailedGlossaryTerm" + } + }, + "Details": { + "type": "structure", + "members": { + "createDomainUnit": { + "shape": "CreateDomainUnitPolicyDetails" + }, + "createProject": { + "shape": "CreateProjectPolicyDetails" + }, + "projectMembership": { + "shape": "ProjectMembershipPolicyDetails" + }, + "createGlossary": { + "shape": "CreateGlossaryPolicyDetails" + } + }, + "union": true + }, + "DisassociateEnvironmentRoleInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "environmentRoleArn": { + "shape": "String", + "location": "uri", + "locationName": "environmentRoleArn" + } + } + }, + "DisassociateEnvironmentRoleOutput": { + "type": "structure", + "members": {} + }, + "DisassociateGovernedTermsInput": { + "type": "structure", + "required": ["domainIdentifier", "entityIdentifier", "entityType", "governedGlossaryTerms"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityIdentifier": { + "shape": "EntityIdentifier", + "location": "uri", + "locationName": "entityIdentifier" + }, + "entityType": { + "shape": "GovernedEntityType", + "location": "uri", + "locationName": "entityType" + }, + "governedGlossaryTerms": { + "shape": "DisassociateGovernedTermsInputGovernedGlossaryTermsList" + } + } + }, + "DisassociateGovernedTermsInputGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 5, + "min": 1 + }, + "DisassociateGovernedTermsOutput": { + "type": "structure", + "members": {} + }, + "DomainArn": { + "type": "string", + "pattern": "arn:aws(|-cn|-us-gov):datazone:\\w+(?:-\\w+)+:\\d{12}:domain/dzd[-_][a-zA-Z0-9_-]{1,36}" + }, + "DomainDescription": { + "type": "string", + "sensitive": true + }, + "DomainId": { + "type": "string", + "pattern": "dzd[-_][a-zA-Z0-9_-]{1,36}" + }, + "DomainName": { + "type": "string", + "sensitive": true + }, + "DomainPolicyItem": { + "type": "structure", + "required": ["domainId", "owningProjectId", "policyId", "name", "policyType", "policyContent"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "policyId": { + "shape": "PolicyId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "applicableScope": { + "shape": "ApplicableScopeList" + }, + "policyType": { + "shape": "PolicyType" + }, + "policyContent": { + "shape": "PolicyContent" + } + } + }, + "DomainStatus": { + "type": "string", + "enum": ["CREATING", "AVAILABLE", "CREATION_FAILED", "DELETING", "DELETED", "DELETION_FAILED"] + }, + "DomainSummaries": { + "type": "list", + "member": { + "shape": "DomainSummary" + } + }, + "DomainSummary": { + "type": "structure", + "required": ["id", "name", "arn", "managedAccountId", "status", "createdAt"], + "members": { + "id": { + "shape": "DomainId" + }, + "name": { + "shape": "DomainName" + }, + "description": { + "shape": "DomainDescription" + }, + "arn": { + "shape": "String" + }, + "managedAccountId": { + "shape": "String" + }, + "status": { + "shape": "DomainStatus" + }, + "portalUrl": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "domainVersion": { + "shape": "DomainVersion" + }, + "preferences": { + "shape": "Preferences", + "internalonly": true + } + } + }, + "DomainUnitDescription": { + "type": "string", + "max": 2048, + "min": 0, + "sensitive": true + }, + "DomainUnitDesignation": { + "type": "string", + "enum": ["OWNER"] + }, + "DomainUnitDesignator": { + "type": "string", + "deprecated": true, + "deprecatedMessage": "This enum will be removed going forward and will be replaced with domainUnitDesignation enum.", + "enum": ["Owner"], + "internalonly": true + }, + "DomainUnitFilter": { + "type": "structure", + "members": { + "all": { + "shape": "Boolean" + } + }, + "deprecated": true, + "deprecatedMessage": "This structure will be removed going forward and will be replaced with domainUnitGrantFilter union.", + "internalonly": true + }, + "DomainUnitFilterForProject": { + "type": "structure", + "required": ["domainUnit"], + "members": { + "domainUnit": { + "shape": "DomainUnitId" + }, + "includeChildDomainUnits": { + "shape": "Boolean", + "box": true + } + } + }, + "DomainUnitGrantFilter": { + "type": "structure", + "members": { + "allDomainUnitsGrantFilter": { + "shape": "AllDomainUnitsGrantFilter" + } + }, + "union": true + }, + "DomainUnitGroupProperties": { + "type": "structure", + "members": { + "groupId": { + "shape": "String" + } + } + }, + "DomainUnitId": { + "type": "string", + "max": 256, + "min": 1, + "pattern": "[a-z0-9_\\-]+" + }, + "DomainUnitIds": { + "type": "list", + "member": { + "shape": "DomainUnitId" + } + }, + "DomainUnitName": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "DomainUnitOwnerProperties": { + "type": "structure", + "members": { + "user": { + "shape": "DomainUnitUserProperties" + }, + "group": { + "shape": "DomainUnitGroupProperties" + } + }, + "union": true + }, + "DomainUnitOwners": { + "type": "list", + "member": { + "shape": "DomainUnitOwnerProperties" + }, + "max": 20, + "min": 0 + }, + "DomainUnitPolicyGrantPrincipal": { + "type": "structure", + "members": { + "domainUnitDesignator": { + "shape": "DomainUnitDesignator", + "deprecated": true, + "deprecatedMessage": "This field will be removed going forward and will be replaced with domainUnitDesignation field.", + "internalonly": true + }, + "domainUnitDesignation": { + "shape": "DomainUnitDesignation" + }, + "domainUnitIdentifier": { + "shape": "DomainUnitId" + }, + "domainUnitFilter": { + "shape": "DomainUnitFilter", + "deprecated": true, + "deprecatedMessage": "This field will be removed going forward and will be replaced with domainUnitGrantFilter field.", + "internalonly": true + }, + "domainUnitGrantFilter": { + "shape": "DomainUnitGrantFilter" + } + } + }, + "DomainUnitPolicyId": { + "type": "string", + "max": 32, + "min": 1 + }, + "DomainUnitPolicySummaries": { + "type": "list", + "member": { + "shape": "DomainUnitPolicySummary" + } + }, + "DomainUnitPolicySummary": { + "type": "structure", + "members": { + "id": { + "shape": "DomainUnitPolicyId" + }, + "description": { + "shape": "String" + }, + "domainId": { + "shape": "String" + }, + "policyTarget": { + "shape": "PolicyTarget" + }, + "details": { + "shape": "Details" + } + } + }, + "DomainUnitSummaries": { + "type": "list", + "member": { + "shape": "DomainUnitSummary" + } + }, + "DomainUnitSummary": { + "type": "structure", + "required": ["name", "id"], + "members": { + "name": { + "shape": "String" + }, + "id": { + "shape": "DomainUnitId" + }, + "domainUnitId": { + "shape": "DomainUnitId", + "internalonly": true + } + } + }, + "DomainUnitTarget": { + "type": "structure", + "required": ["domainUnitId"], + "members": { + "domainUnitId": { + "shape": "DomainUnitId" + }, + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "DomainUnitUserProperties": { + "type": "structure", + "members": { + "userId": { + "shape": "String" + } + } + }, + "DomainVersion": { + "type": "string", + "enum": ["V1", "V2"] + }, + "DurationSeconds": { + "type": "integer", + "box": true, + "max": 43200, + "min": 900 + }, + "EdgeDirection": { + "type": "string", + "enum": ["UPSTREAM", "DOWNSTREAM"] + }, + "EditedValue": { + "type": "string", + "max": 5000, + "min": 1, + "sensitive": true + }, + "EligibilityStatus": { + "type": "string", + "enum": ["UPDATE_AVAILABLE", "UPDATE_NOT_AVAILABLE", "UPDATE_NOT_ELIGIBLE"] + }, + "EligibilityType": { + "type": "string", + "enum": ["PROJECT_PROFILE", "PROJECT", "ENVIRONMENT_BLUEPRINT"] + }, + "EnableSetting": { + "type": "string", + "enum": ["ENABLED", "DISABLED"] + }, + "EnabledRegionList": { + "type": "list", + "member": { + "shape": "RegionName" + }, + "min": 0 + }, + "EntityId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "EntityIdentifier": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "EntityOwners": { + "type": "list", + "member": { + "shape": "OwnerPropertiesOutput" + } + }, + "EntityType": { + "type": "string", + "enum": ["ASSET", "DATA_PRODUCT"] + }, + "EnvironmentActionId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "EnvironmentActionList": { + "type": "list", + "member": { + "shape": "ConfigurableEnvironmentAction" + } + }, + "EnvironmentActionSummary": { + "type": "structure", + "required": ["domainId", "environmentId", "id", "name", "parameters"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "id": { + "shape": "EnvironmentActionId" + }, + "name": { + "shape": "String" + }, + "parameters": { + "shape": "ActionParameters" + }, + "description": { + "shape": "String" + } + } + }, + "EnvironmentActionURI": { + "type": "string", + "max": 2048, + "min": 1 + }, + "EnvironmentBlueprintConfigurationItem": { + "type": "structure", + "required": ["domainId", "environmentBlueprintId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "provisioningRoleArn": { + "shape": "RoleArn" + }, + "environmentRolePermissionBoundary": { + "shape": "PolicyArn" + }, + "manageAccessRoleArn": { + "shape": "RoleArn" + }, + "enabledRegions": { + "shape": "EnabledRegionList" + }, + "regionalParameters": { + "shape": "RegionalParameterMap" + }, + "allowUserProvidedConfigurations": { + "shape": "Boolean" + }, + "allowS3LocationRegistration": { + "shape": "Boolean", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "resourceConfigurations": { + "shape": "ResourceConfigurations" + }, + "lakeFormationConfiguration": { + "shape": "LakeFormationConfiguration", + "internalonly": true + }, + "globalParameters": { + "shape": "GlobalParameterMap", + "internalonly": true + }, + "provisioningConfigurations": { + "shape": "ProvisioningConfigurationList" + } + } + }, + "EnvironmentBlueprintConfigurationSummaries": { + "type": "list", + "member": { + "shape": "EnvironmentBlueprintConfigurationSummary" + } + }, + "EnvironmentBlueprintConfigurationSummary": { + "type": "structure", + "members": { + "awsAccountId": { + "shape": "AwsAccountId" + }, + "enabledRegions": { + "shape": "ConsumersEnabledRegionList" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId" + }, + "managingProjects": { + "shape": "String" + }, + "resourceConfigurations": { + "shape": "ResourceConfigurations" + }, + "allowUserProvidedConfigurations": { + "shape": "Boolean", + "internalonly": true + }, + "globalParameters": { + "shape": "GlobalParameterMap", + "internalonly": true + } + } + }, + "EnvironmentBlueprintConfigurations": { + "type": "list", + "member": { + "shape": "EnvironmentBlueprintConfigurationItem" + } + }, + "EnvironmentBlueprintId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "EnvironmentBlueprintName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+" + }, + "EnvironmentBlueprintSummaries": { + "type": "list", + "member": { + "shape": "EnvironmentBlueprintSummary" + } + }, + "EnvironmentBlueprintSummary": { + "type": "structure", + "required": ["id", "name", "provider", "provisioningProperties"], + "members": { + "id": { + "shape": "EnvironmentBlueprintId" + }, + "name": { + "shape": "EnvironmentBlueprintName" + }, + "description": { + "shape": "Description" + }, + "provider": { + "shape": "String" + }, + "provisioningPolicy": { + "shape": "ProvisioningPolicy", + "internalonly": true + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "deploymentProperties": { + "shape": "DeploymentProperties", + "internalonly": true + }, + "userParameters": { + "shape": "CustomParameterList", + "internalonly": true + }, + "glossaryTerms": { + "shape": "GlossaryTerms", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "blueprintCategory": { + "shape": "String", + "internalonly": true + }, + "supportedDomainVersions": { + "shape": "SupportedDomainVersionsList", + "internalonly": true + } + } + }, + "EnvironmentConfiguration": { + "type": "structure", + "required": ["name", "environmentBlueprintId"], + "members": { + "name": { + "shape": "EnvironmentConfigurationName" + }, + "id": { + "shape": "EnvironmentConfigurationId" + }, + "scopeName": { + "shape": "ProjectScopeName", + "internalonly": true + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "description": { + "shape": "Description" + }, + "deploymentMode": { + "shape": "DeploymentMode" + }, + "configurationParameters": { + "shape": "EnvironmentConfigurationParametersDetails" + }, + "awsAccount": { + "shape": "AwsAccount" + }, + "accountPools": { + "shape": "AccountPoolList" + }, + "awsRegion": { + "shape": "Region" + }, + "deploymentOrder": { + "shape": "DeploymentOrder" + }, + "designationsAuthorizedToManageEnvironment": { + "shape": "AuthorizedDesignations", + "internalonly": true + } + } + }, + "EnvironmentConfigurationId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "EnvironmentConfigurationName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "EnvironmentConfigurationParameter": { + "type": "structure", + "members": { + "name": { + "shape": "EnvironmentConfigurationParameterName" + }, + "value": { + "shape": "String" + }, + "isEditable": { + "shape": "Boolean" + } + } + }, + "EnvironmentConfigurationParameterName": { + "type": "string", + "pattern": "[a-zA-Z_][a-zA-Z0-9_]*" + }, + "EnvironmentConfigurationParametersDetails": { + "type": "structure", + "members": { + "ssmPath": { + "shape": "ParameterStorePath" + }, + "parameterOverrides": { + "shape": "EnvironmentConfigurationParametersList" + }, + "resolvedParameters": { + "shape": "EnvironmentConfigurationParametersList" + } + } + }, + "EnvironmentConfigurationParametersList": { + "type": "list", + "member": { + "shape": "EnvironmentConfigurationParameter" + } + }, + "EnvironmentConfigurationUserParameter": { + "type": "structure", + "members": { + "environmentId": { + "shape": "EnvironmentId", + "internalonly": true + }, + "environmentResolvedAccount": { + "shape": "EnvironmentResolvedAccount" + }, + "environmentConfigurationName": { + "shape": "EnvironmentConfigurationName" + }, + "environmentParameters": { + "shape": "EnvironmentParametersList" + } + } + }, + "EnvironmentConfigurationUserParametersList": { + "type": "list", + "member": { + "shape": "EnvironmentConfigurationUserParameter" + } + }, + "EnvironmentConfigurationsList": { + "type": "list", + "member": { + "shape": "EnvironmentConfiguration" + } + }, + "EnvironmentDeploymentDetails": { + "type": "structure", + "members": { + "overallDeploymentStatus": { + "shape": "OverallDeploymentStatus" + }, + "environmentFailureReasons": { + "shape": "EnvironmentFailureReasons" + } + } + }, + "EnvironmentDeploymentResult": { + "type": "string", + "enum": ["FAILED", "SUCCESSFUL"] + }, + "EnvironmentError": { + "type": "structure", + "required": ["message"], + "members": { + "code": { + "shape": "String" + }, + "message": { + "shape": "String" + } + } + }, + "EnvironmentFailureReasons": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "EnvironmentFailureReasonsList" + } + }, + "EnvironmentFailureReasonsList": { + "type": "list", + "member": { + "shape": "EnvironmentError" + } + }, + "EnvironmentId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "EnvironmentName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "EnvironmentParameter": { + "type": "structure", + "members": { + "name": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "EnvironmentParametersList": { + "type": "list", + "member": { + "shape": "EnvironmentParameter" + } + }, + "EnvironmentProfileId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{0,36}" + }, + "EnvironmentProfileName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "EnvironmentProfileSummaries": { + "type": "list", + "member": { + "shape": "EnvironmentProfileSummary" + } + }, + "EnvironmentProfileSummary": { + "type": "structure", + "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], + "members": { + "id": { + "shape": "EnvironmentProfileId" + }, + "domainId": { + "shape": "DomainId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentProfileName" + }, + "description": { + "shape": "Description" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "projectId": { + "shape": "ProjectId" + }, + "userParameters": { + "shape": "CustomParameterList", + "internalonly": true + }, + "resourceConfigurationId": { + "shape": "ResourceConfigurationId" + } + } + }, + "EnvironmentResolvedAccount": { + "type": "structure", + "required": ["awsAccountId", "regionName"], + "members": { + "awsAccountId": { + "shape": "AwsAccountId" + }, + "regionName": { + "shape": "AwsRegion" + }, + "sourceAccountPoolId": { + "shape": "AccountPoolId" + } + } + }, + "EnvironmentRoleSummary": { + "type": "structure", + "required": ["domainId", "environmentId", "arn", "provider", "roleTag"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "arn": { + "shape": "RoleArn" + }, + "provider": { + "shape": "String" + }, + "type": { + "shape": "EnvironmentRoleType" + }, + "roleTag": { + "shape": "RoleTag" + } + } + }, + "EnvironmentRoleType": { + "type": "string", + "enum": ["SHAREABLE_ROLE", "USER_ROLE", "SYSTEM_ROLE"] + }, + "EnvironmentStatus": { + "type": "string", + "enum": [ + "ACTIVE", + "CREATING", + "UPDATING", + "DELETING", + "CREATE_FAILED", + "UPDATE_FAILED", + "DELETE_FAILED", + "VALIDATION_FAILED", + "SUSPENDED", + "DISABLED", + "EXPIRED", + "DELETED", + "INACCESSIBLE" + ] + }, + "EnvironmentSummaries": { + "type": "list", + "member": { + "shape": "EnvironmentSummary" + } + }, + "EnvironmentSummary": { + "type": "structure", + "required": ["projectId", "domainId", "createdBy", "name", "provider"], + "members": { + "projectId": { + "shape": "ProjectId" + }, + "id": { + "shape": "EnvironmentId" + }, + "domainId": { + "shape": "DomainId" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentName" + }, + "description": { + "shape": "Description" + }, + "environmentProfileId": { + "shape": "EnvironmentProfileId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "provider": { + "shape": "String" + }, + "provisionedResources": { + "shape": "ResourceList", + "internalonly": true + }, + "permittedResources": { + "shape": "ResourceList", + "internalonly": true + }, + "status": { + "shape": "EnvironmentStatus" + }, + "environmentActions": { + "shape": "EnvironmentActionList", + "internalonly": true + }, + "deploymentOrder": { + "shape": "DeploymentOrder", + "internalonly": true + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId", + "internalonly": true + }, + "environmentConfigurationId": { + "shape": "EnvironmentConfigurationId", + "internalonly": true + }, + "failureReason": { + "shape": "EnvironmentError", + "internalonly": true + } + } + }, + "EqualToExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "ErrorDetail": { + "type": "string", + "max": 256, + "min": 1 + }, + "ErrorMessage": { + "type": "string" + }, + "ErrorType": { + "type": "string", + "enum": [ + "ACCESS_DENIED_EXCEPTION", + "CONFLICT_EXCEPTION", + "INTERNAL_SERVER_EXCEPTION", + "RESOURCE_NOT_FOUND_EXCEPTION", + "SERVICE_QUOTA_EXCEEDED_EXCEPTION", + "THROTTLING_EXCEPTION", + "VALIDATION_EXCEPTION" + ] + }, + "EventBridgeProperties": { + "type": "structure", + "required": ["targetAccountId"], + "members": { + "targetAccountId": { + "shape": "String" + } + } + }, + "EventSummary": { + "type": "structure", + "members": { + "openLineageRunEventSummary": { + "shape": "OpenLineageRunEventSummary" + } + }, + "union": true + }, + "ExternalIdentifier": { + "type": "string", + "max": 1200, + "min": 1 + }, + "FailedQueryProcessingErrorMessages": { + "type": "list", + "member": { + "shape": "String" + }, + "internalonly": true, + "max": 10, + "min": 0 + }, + "FailureCause": { + "type": "structure", + "members": { + "message": { + "shape": "String" + } + } + }, + "FailureReason": { + "type": "structure", + "members": { + "code": { + "shape": "String" + }, + "message": { + "shape": "String" + } + } + }, + "FailureReasons": { + "type": "list", + "member": { + "shape": "ProjectDeletionError" + } + }, + "FailureReasonsList": { + "type": "list", + "member": { + "shape": "FailureReason" + } + }, + "FeatureFlagList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "FieldValueFactor": { + "type": "structure", + "required": ["attribute", "rankMultiplier"], + "members": { + "attribute": { + "shape": "Attribute" + }, + "rankMultiplier": { + "shape": "Integer" + }, + "scoreModifier": { + "shape": "ScoreModifier" + } + } + }, + "FieldValueFactorList": { + "type": "list", + "member": { + "shape": "FieldValueFactor" + } + }, + "FieldValueFactorReranker": { + "type": "structure", + "members": { + "fieldValueFactors": { + "shape": "FieldValueFactorList" + } + } + }, + "Filter": { + "type": "structure", + "required": ["attribute", "value"], + "members": { + "attribute": { + "shape": "Attribute" + }, + "value": { + "shape": "FilterValueString" + } + } + }, + "FilterClause": { + "type": "structure", + "members": { + "filter": { + "shape": "Filter" + }, + "and": { + "shape": "FilterList" + }, + "or": { + "shape": "FilterList" + } + }, + "union": true + }, + "FilterExpression": { + "type": "structure", + "required": ["type", "expression"], + "members": { + "type": { + "shape": "FilterExpressionType" + }, + "expression": { + "shape": "FilterExpressionExpressionString" + } + }, + "internalonly": true + }, + "FilterExpressionExpressionString": { + "type": "string", + "max": 2048, + "min": 1 + }, + "FilterExpressionType": { + "type": "string", + "enum": ["INCLUDE", "EXCLUDE"] + }, + "FilterExpressions": { + "type": "list", + "member": { + "shape": "FilterExpression" + }, + "internalonly": true + }, + "FilterId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "FilterIds": { + "type": "list", + "member": { + "shape": "FilterId" + } + }, + "FilterList": { + "type": "list", + "member": { + "shape": "FilterClause" + }, + "max": 100, + "min": 1 + }, + "FilterName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "FilterStatus": { + "type": "string", + "enum": ["VALID", "INVALID"] + }, + "FilterValueString": { + "type": "string", + "max": 128, + "min": 1 + }, + "FirstName": { + "type": "string", + "sensitive": true + }, + "Float": { + "type": "float", + "box": true + }, + "FormEntryInput": { + "type": "structure", + "required": ["typeIdentifier", "typeRevision"], + "members": { + "typeIdentifier": { + "shape": "FormTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "required": { + "shape": "Boolean" + } + } + }, + "FormEntryOutput": { + "type": "structure", + "required": ["typeName", "typeRevision"], + "members": { + "typeName": { + "shape": "FormTypeName" + }, + "typeRevision": { + "shape": "Revision" + }, + "required": { + "shape": "Boolean" + } + } + }, + "FormInput": { + "type": "structure", + "required": ["formName"], + "members": { + "formName": { + "shape": "FormName" + }, + "typeIdentifier": { + "shape": "FormTypeIdentifier" + }, + "typeRevision": { + "shape": "RevisionInput" + }, + "content": { + "shape": "FormInputContentString" + }, + "renderingConfig": { + "shape": "RenderingConfig", + "internalonly": true + } + }, + "sensitive": true + }, + "FormInputContentString": { + "type": "string", + "max": 300000, + "min": 0 + }, + "FormInputList": { + "type": "list", + "member": { + "shape": "FormInput" + }, + "max": 10, + "min": 0, + "sensitive": true + }, + "FormName": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "(?![0-9_])\\w+$|^_\\w*[a-zA-Z0-9]\\w*" + }, + "FormOutput": { + "type": "structure", + "required": ["formName"], + "members": { + "formName": { + "shape": "FormName" + }, + "typeName": { + "shape": "FormTypeName" + }, + "typeRevision": { + "shape": "Revision" + }, + "content": { + "shape": "String" + }, + "renderingConfig": { + "shape": "RenderingConfig", + "internalonly": true + } + } + }, + "FormOutputList": { + "type": "list", + "member": { + "shape": "FormOutput" + }, + "max": 10, + "min": 0 + }, + "FormTypeData": { + "type": "structure", + "required": ["domainId", "name", "revision"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "FormTypeName" + }, + "revision": { + "shape": "Revision" + }, + "model": { + "shape": "Model" + }, + "status": { + "shape": "FormTypeStatus" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "originDomainId": { + "shape": "DomainId" + }, + "originProjectId": { + "shape": "ProjectId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "description": { + "shape": "Description" + }, + "imports": { + "shape": "ImportList" + } + } + }, + "FormTypeDataList": { + "type": "list", + "member": { + "shape": "FormTypeData" + } + }, + "FormTypeIdentifier": { + "type": "string", + "max": 385, + "min": 1, + "pattern": "(?!\\.)[\\w\\.]*\\w" + }, + "FormTypeName": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "(amazon.datazone.)?(?![0-9_])\\w+$|^_\\w*[a-zA-Z0-9]\\w*", + "sensitive": true + }, + "FormTypeStatus": { + "type": "string", + "enum": ["ENABLED", "DISABLED"] + }, + "Forms": { + "type": "string" + }, + "FormsInputMap": { + "type": "map", + "key": { + "shape": "FormName" + }, + "value": { + "shape": "FormEntryInput" + }, + "max": 10, + "min": 0 + }, + "FormsOutputMap": { + "type": "map", + "key": { + "shape": "FormName" + }, + "value": { + "shape": "FormEntryOutput" + }, + "max": 10, + "min": 0 + }, + "GenAIGovernance": { + "type": "structure", + "required": ["models"], + "members": { + "projectId": { + "shape": "ProjectId" + }, + "models": { + "shape": "GenAIGovernanceModelsList" + } + } + }, + "GenAIGovernanceModel": { + "type": "structure", + "required": [ + "modelArn", + "inferenceType", + "isCrossRegion", + "modelName", + "modelProvider", + "foundationModelId", + "inputModalities", + "outputModalities" + ], + "members": { + "modelArn": { + "shape": "BedrockModelArn" + }, + "inferenceOnlyS3BucketArn": { + "shape": "BedrockS3BucketArn" + }, + "applicationInferenceProfileArn": { + "shape": "BedrockModelArn" + }, + "modelProvisionRoleArn": { + "shape": "RoleArn" + }, + "modelConsumerRoleArn": { + "shape": "RoleArn" + }, + "inferenceType": { + "shape": "GenerativeAIInferenceType" + }, + "isCrossRegion": { + "shape": "Boolean" + }, + "modelName": { + "shape": "GenAIGovernanceModelModelNameString" + }, + "modelProvider": { + "shape": "GenAIGovernanceModelModelProviderString" + }, + "foundationModelId": { + "shape": "GenAIGovernanceModelFoundationModelIdString" + }, + "inputModalities": { + "shape": "ModalitiesType" + }, + "outputModalities": { + "shape": "ModalitiesType" + } + } + }, + "GenAIGovernanceModelFoundationModelIdString": { + "type": "string", + "pattern": "[0-9a-zA-Z_+=,.@:/()\\-]{1,256}" + }, + "GenAIGovernanceModelModelNameString": { + "type": "string", + "pattern": "[0-9a-zA-Z_+=, .@:/()\\-]{1,128}" + }, + "GenAIGovernanceModelModelProviderString": { + "type": "string", + "pattern": "[0-9a-zA-Z_+=, .@:/()\\-]{1,128}" + }, + "GenAIGovernanceModelsList": { + "type": "list", + "member": { + "shape": "GenAIGovernanceModel" + }, + "min": 1 + }, + "GenerativeAIInferenceType": { + "type": "string", + "enum": ["ON_DEMAND", "PROVISIONED", "INFERENCE_PROFILE"] + }, + "GetAccountPoolInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AccountPoolId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetAccountPoolOutput": { + "type": "structure", + "required": ["accountSource", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "AccountPoolName" + }, + "id": { + "shape": "AccountPoolId" + }, + "description": { + "shape": "Description" + }, + "resolutionStrategy": { + "shape": "ResolutionStrategy" + }, + "accountSource": { + "shape": "AccountSource" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainUnitId": { + "shape": "DomainUnitId" + } + } + }, + "GetAssetFilterInput": { + "type": "structure", + "required": ["domainIdentifier", "assetIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "assetIdentifier": { + "shape": "AssetId", + "location": "uri", + "locationName": "assetIdentifier" + }, + "identifier": { + "shape": "FilterId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetAssetFilterOutput": { + "type": "structure", + "required": ["id", "domainId", "assetId", "name", "configuration"], + "members": { + "id": { + "shape": "FilterId" + }, + "domainId": { + "shape": "DomainId" + }, + "assetId": { + "shape": "AssetId" + }, + "name": { + "shape": "FilterName" + }, + "description": { + "shape": "Description" + }, + "status": { + "shape": "FilterStatus" + }, + "configuration": { + "shape": "AssetFilterConfiguration" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "errorMessage": { + "shape": "String" + }, + "effectiveColumnNames": { + "shape": "ColumnNameList" + }, + "effectiveRowFilter": { + "shape": "String" + } + } + }, + "GetAssetInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "revision": { + "shape": "Revision", + "location": "querystring", + "locationName": "revision" + } + } + }, + "GetAssetOutput": { + "type": "structure", + "required": [ + "id", + "name", + "typeIdentifier", + "typeRevision", + "revision", + "owningProjectId", + "domainId", + "formsOutput" + ], + "members": { + "id": { + "shape": "AssetId" + }, + "name": { + "shape": "AssetName" + }, + "typeIdentifier": { + "shape": "AssetTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "externalIdentifier": { + "shape": "ExternalIdentifier" + }, + "revision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "governedGlossaryTerms": { + "shape": "GetAssetOutputGovernedGlossaryTermsList" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "domainId": { + "shape": "DomainId" + }, + "listing": { + "shape": "AssetListingDetails" + }, + "formsOutput": { + "shape": "GetAssetOutputFormsOutputList" + }, + "readOnlyFormsOutput": { + "shape": "FormOutputList" + }, + "latestTimeSeriesDataPointFormsOutput": { + "shape": "TimeSeriesDataPointSummaryFormOutputList" + } + } + }, + "GetAssetOutputFormsOutputList": { + "type": "list", + "member": { + "shape": "FormOutput" + }, + "max": 20, + "min": 0 + }, + "GetAssetOutputGovernedGlossaryTermsList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 20, + "min": 0 + }, + "GetAssetTypeInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetTypeIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "revision": { + "shape": "Revision", + "location": "querystring", + "locationName": "revision" + } + } + }, + "GetAssetTypeOutput": { + "type": "structure", + "required": ["domainId", "name", "revision", "formsOutput", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "TypeName" + }, + "revision": { + "shape": "Revision" + }, + "description": { + "shape": "Description" + }, + "formsOutput": { + "shape": "FormsOutputMap" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "originDomainId": { + "shape": "DomainId" + }, + "originProjectId": { + "shape": "ProjectId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + } + } + }, + "GetAttributeOutput": { + "type": "structure", + "required": ["attributeIdentifier", "revision"], + "members": { + "attributeIdentifier": { + "shape": "AttributeIdentifier" + }, + "revision": { + "shape": "Revision" + }, + "readMe": { + "shape": "GetAttributeOutputReadMeString" + }, + "forms": { + "shape": "FormOutputList" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + } + }, + "internalonly": true + }, + "GetAttributeOutputReadMeString": { + "type": "string", + "max": 5000, + "min": 0 + }, + "GetConnectionInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ConnectionId", + "location": "uri", + "locationName": "identifier" + }, + "withSecret": { + "shape": "Boolean", + "location": "querystring", + "locationName": "withSecret" + }, + "designation": { + "shape": "DesignationName", + "internalonly": true, + "location": "querystring", + "locationName": "designation" + } + } + }, + "GetConnectionOutput": { + "type": "structure", + "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], + "members": { + "connectionCredentials": { + "shape": "ConnectionCredentials" + }, + "configurations": { + "shape": "Configurations", + "internalonly": true + }, + "connectionId": { + "shape": "ConnectionId" + }, + "description": { + "shape": "Description" + }, + "domainId": { + "shape": "DomainId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "environmentUserRole": { + "shape": "String" + }, + "name": { + "shape": "ConnectionName" + }, + "physicalEndpoints": { + "shape": "PhysicalEndpoints" + }, + "projectId": { + "shape": "ProjectId" + }, + "props": { + "shape": "ConnectionPropertiesOutput" + }, + "type": { + "shape": "ConnectionType" + }, + "scope": { + "shape": "ConnectionScope", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "credentialId": { + "shape": "CredentialId", + "internalonly": true + } + } + }, + "GetDataProductInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataProductId", + "location": "uri", + "locationName": "identifier" + }, + "revision": { + "shape": "Revision", + "location": "querystring", + "locationName": "revision" + } + } + }, + "GetDataProductOutput": { + "type": "structure", + "required": ["domainId", "id", "revision", "owningProjectId", "name", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DataProductId" + }, + "revision": { + "shape": "Revision" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "name": { + "shape": "DataProductName" + }, + "status": { + "shape": "DataProductStatus" + }, + "description": { + "shape": "DataProductDescription" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "items": { + "shape": "DataProductItems" + }, + "formsOutput": { + "shape": "FormOutputList" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "firstRevisionCreatedAt": { + "shape": "CreatedAt" + }, + "firstRevisionCreatedBy": { + "shape": "CreatedBy" + } + } + }, + "GetDataSourceInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataSourceId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetDataSourceOutput": { + "type": "structure", + "required": ["id", "name", "domainId", "projectId"], + "members": { + "id": { + "shape": "DataSourceId" + }, + "status": { + "shape": "DataSourceStatus" + }, + "type": { + "shape": "String" + }, + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "connectionId": { + "shape": "String" + }, + "configuration": { + "shape": "DataSourceConfigurationOutput" + }, + "recommendation": { + "shape": "RecommendationConfiguration" + }, + "enableSetting": { + "shape": "EnableSetting" + }, + "publishOnImport": { + "shape": "Boolean" + }, + "assetFormsOutput": { + "shape": "FormOutputList" + }, + "schedule": { + "shape": "ScheduleConfiguration" + }, + "lastRunStatus": { + "shape": "DataSourceRunStatus" + }, + "lastRunAt": { + "shape": "DateTime" + }, + "lastRunErrorMessage": { + "shape": "DataSourceErrorMessage" + }, + "lastRunAssetCount": { + "shape": "Integer" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + }, + "selfGrantStatus": { + "shape": "SelfGrantStatusOutput" + } + } + }, + "GetDataSourceRunInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataSourceRunId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetDataSourceRunOutput": { + "type": "structure", + "required": ["domainId", "dataSourceId", "id", "projectId", "status", "type", "createdAt", "updatedAt"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "dataSourceId": { + "shape": "DataSourceId" + }, + "id": { + "shape": "DataSourceRunId" + }, + "projectId": { + "shape": "ProjectId" + }, + "status": { + "shape": "DataSourceRunStatus" + }, + "type": { + "shape": "DataSourceRunType" + }, + "dataSourceConfigurationSnapshot": { + "shape": "String" + }, + "runStatisticsForAssets": { + "shape": "RunStatisticsForAssets" + }, + "lineageSummary": { + "shape": "DataSourceRunLineageSummary" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + }, + "startedAt": { + "shape": "DateTime" + }, + "stoppedAt": { + "shape": "DateTime" + } + } + }, + "GetDesignationInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DesignationId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetDesignationOutput": { + "type": "structure", + "required": [ + "domainId", + "id", + "name", + "projectId", + "designationConfigurationId", + "allowedActions", + "roleTag", + "provider", + "createdBy" + ], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DesignationId" + }, + "name": { + "shape": "DesignationName" + }, + "projectId": { + "shape": "ProjectId" + }, + "designationConfigurationId": { + "shape": "DesignationConfigurationId" + }, + "allowedActions": { + "shape": "AllowedDataZoneActions" + }, + "roleTag": { + "shape": "RoleTag" + }, + "description": { + "shape": "Description" + }, + "provider": { + "shape": "String" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "domainUnitId": { + "shape": "DomainUnitId", + "internalonly": true + } + } + }, + "GetDomainExecutionRoleCredentialsRequest": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + } + } + }, + "GetDomainExecutionRoleCredentialsResponse": { + "type": "structure", + "members": { + "credentials": { + "shape": "AwsCredentials" + } + } + }, + "GetDomainInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetDomainOutput": { + "type": "structure", + "required": ["id", "status"], + "members": { + "id": { + "shape": "DomainId" + }, + "rootDomainUnitId": { + "shape": "DomainUnitId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "singleSignOn": { + "shape": "SingleSignOn" + }, + "domainExecutionRole": { + "shape": "RoleArn" + }, + "arn": { + "shape": "String" + }, + "kmsKeyIdentifier": { + "shape": "KmsKeyArn" + }, + "status": { + "shape": "DomainStatus" + }, + "failureReasons": { + "shape": "FailureReasonsList" + }, + "portalUrl": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "tags": { + "shape": "Tags" + }, + "provisionStatus": { + "shape": "ProvisionStatus", + "internalonly": true + }, + "domainVersion": { + "shape": "DomainVersion" + }, + "domainServiceRole": { + "shape": "AdminApiRoleArn", + "deprecated": true, + "internalonly": true + }, + "serviceRole": { + "shape": "AdminApiRoleArn" + }, + "supportedDomainVersions": { + "shape": "SupportedDomainVersions", + "internalonly": true + }, + "preferences": { + "shape": "Preferences", + "internalonly": true + } + } + }, + "GetDomainPolicyInput": { + "type": "structure", + "required": ["domainId", "policyId"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "policyId": { + "shape": "PolicyId", + "location": "uri", + "locationName": "policyId" + } + } + }, + "GetDomainPolicyOutput": { + "type": "structure", + "required": ["sourceDomainId", "owningProjectId", "name"], + "members": { + "sourceDomainId": { + "shape": "DomainId" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "applicableScope": { + "shape": "ApplicableScopeList" + }, + "policyType": { + "shape": "PolicyType" + }, + "policyContent": { + "shape": "PolicyContent" + } + } + }, + "GetDomainSharingPolicyInput": { + "type": "structure", + "required": ["domainArn"], + "members": { + "domainArn": { + "shape": "DomainArn", + "location": "uri", + "locationName": "domainArn" + } + } + }, + "GetDomainSharingPolicyOutput": { + "type": "structure", + "members": { + "domainArn": { + "shape": "DomainArn" + }, + "policy": { + "shape": "String" + } + } + }, + "GetDomainUnitInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DomainUnitId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetDomainUnitOutput": { + "type": "structure", + "required": ["id", "domainId", "name", "owners", "ancestorDomainUnitIds"], + "members": { + "id": { + "shape": "DomainUnitId" + }, + "domainUnitId": { + "shape": "DomainUnitId", + "internalonly": true + }, + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "DomainUnitName" + }, + "parentDomainUnitId": { + "shape": "DomainUnitId" + }, + "description": { + "shape": "DomainUnitDescription" + }, + "owners": { + "shape": "DomainUnitOwners" + }, + "ancestorDomainUnitIds": { + "shape": "DomainUnitIds" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "lastUpdatedBy": { + "shape": "UpdatedBy" + } + } + }, + "GetDomainUnitPolicyInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DomainUnitPolicyId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetDomainUnitPolicyOutput": { + "type": "structure", + "required": ["id", "domainId", "description", "policyTarget", "details"], + "members": { + "id": { + "shape": "DomainUnitPolicyId" + }, + "domainId": { + "shape": "DomainId" + }, + "description": { + "shape": "String" + }, + "policyTarget": { + "shape": "PolicyTarget" + }, + "details": { + "shape": "Details" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "lastUpdatedBy": { + "shape": "UpdatedBy" + } + } + }, + "GetEnvironmentActionInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "identifier": { + "shape": "String", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetEnvironmentActionLinkInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "consoleType": { + "shape": "String", + "location": "querystring", + "locationName": "consoleType" + }, + "durationSeconds": { + "shape": "DurationSeconds", + "internalonly": true, + "location": "querystring", + "locationName": "durationSeconds" + } + } + }, + "GetEnvironmentActionLinkOutput": { + "type": "structure", + "members": { + "actionLink": { + "shape": "String" + } + } + }, + "GetEnvironmentActionOutput": { + "type": "structure", + "required": ["domainId", "environmentId", "id", "name", "parameters"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "id": { + "shape": "EnvironmentActionId" + }, + "name": { + "shape": "String" + }, + "parameters": { + "shape": "ActionParameters" + }, + "description": { + "shape": "String" + } + } + }, + "GetEnvironmentBlueprintConfigurationInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentBlueprintIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId", + "location": "uri", + "locationName": "environmentBlueprintIdentifier" + } + } + }, + "GetEnvironmentBlueprintConfigurationOutput": { + "type": "structure", + "required": ["domainId", "environmentBlueprintId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "provisioningRoleArn": { + "shape": "RoleArn" + }, + "environmentRolePermissionBoundary": { + "shape": "PolicyArn" + }, + "manageAccessRoleArn": { + "shape": "RoleArn" + }, + "enabledRegions": { + "shape": "EnabledRegionList" + }, + "regionalParameters": { + "shape": "RegionalParameterMap" + }, + "allowUserProvidedConfigurations": { + "shape": "Boolean" + }, + "allowS3LocationRegistration": { + "shape": "Boolean", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "resourceConfigurations": { + "shape": "ResourceConfigurations" + }, + "lakeFormationConfiguration": { + "shape": "LakeFormationConfiguration", + "internalonly": true + }, + "globalParameters": { + "shape": "GlobalParameterMap", + "internalonly": true + }, + "provisioningConfigurations": { + "shape": "ProvisioningConfigurationList" + } + } + }, + "GetEnvironmentBlueprintInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentBlueprintId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetEnvironmentBlueprintOutput": { + "type": "structure", + "required": ["id", "name", "provider", "provisioningProperties"], + "members": { + "id": { + "shape": "EnvironmentBlueprintId" + }, + "name": { + "shape": "EnvironmentBlueprintName" + }, + "description": { + "shape": "Description" + }, + "changeLog": { + "shape": "String", + "internalonly": true + }, + "provider": { + "shape": "String" + }, + "provisioningPolicy": { + "shape": "ProvisioningPolicy", + "internalonly": true + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "deploymentProperties": { + "shape": "DeploymentProperties" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "blueprintCategory": { + "shape": "String", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "GetEnvironmentCredentialsInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "durationSeconds": { + "shape": "DurationSeconds", + "internalonly": true, + "location": "querystring", + "locationName": "durationSeconds" + }, + "designation": { + "shape": "DesignationName", + "internalonly": true, + "location": "querystring", + "locationName": "designation" + } + } + }, + "GetEnvironmentCredentialsOutput": { + "type": "structure", + "members": { + "accessKeyId": { + "shape": "String" + }, + "secretAccessKey": { + "shape": "String" + }, + "sessionToken": { + "shape": "String" + }, + "expiration": { + "shape": "SyntheticTimestamp_date_time" + }, + "identityEnhancedCredentials": { + "shape": "IdentityEnhancedCredentials", + "internalonly": true + } + }, + "sensitive": true + }, + "GetEnvironmentInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetEnvironmentOutput": { + "type": "structure", + "required": ["projectId", "domainId", "createdBy", "name", "provider"], + "members": { + "projectId": { + "shape": "ProjectId" + }, + "id": { + "shape": "EnvironmentId" + }, + "domainId": { + "shape": "DomainId" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentName" + }, + "description": { + "shape": "Description" + }, + "environmentProfileId": { + "shape": "EnvironmentProfileId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "provider": { + "shape": "String" + }, + "provisionedResources": { + "shape": "ResourceList" + }, + "permittedResources": { + "shape": "ResourceList", + "internalonly": true + }, + "status": { + "shape": "EnvironmentStatus" + }, + "environmentActions": { + "shape": "EnvironmentActionList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "lastDeployment": { + "shape": "Deployment" + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "deploymentProperties": { + "shape": "DeploymentProperties" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "environmentConfigurationId": { + "shape": "EnvironmentConfigurationId", + "internalonly": true + } + } + }, + "GetEnvironmentProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentProfileId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetEnvironmentProfileOutput": { + "type": "structure", + "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], + "members": { + "id": { + "shape": "EnvironmentProfileId" + }, + "domainId": { + "shape": "DomainId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentProfileName" + }, + "description": { + "shape": "Description" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "projectId": { + "shape": "ProjectId" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "resourceConfigurationId": { + "shape": "ResourceConfigurationId" + } + } + }, + "GetEnvironmentRoleInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "environmentRoleArn": { + "shape": "RoleArn", + "location": "uri", + "locationName": "environmentRoleArn" + } + } + }, + "GetEnvironmentRoleOutput": { + "type": "structure", + "required": ["domainId", "environmentId", "arn", "provider", "roleTag"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "arn": { + "shape": "RoleArn" + }, + "provider": { + "shape": "String" + }, + "type": { + "shape": "EnvironmentRoleType" + }, + "roleTag": { + "shape": "RoleTag" + } + } + }, + "GetFormTypeInput": { + "type": "structure", + "required": ["domainIdentifier", "formTypeIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "formTypeIdentifier": { + "shape": "FormTypeIdentifier", + "location": "uri", + "locationName": "formTypeIdentifier" + }, + "revision": { + "shape": "Revision", + "location": "querystring", + "locationName": "revision" + }, + "modelFormat": { + "shape": "ModelFormat", + "internalonly": true, + "location": "querystring", + "locationName": "modelFormat" + } + } + }, + "GetFormTypeOutput": { + "type": "structure", + "required": ["domainId", "name", "revision", "model"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "FormTypeName" + }, + "revision": { + "shape": "Revision" + }, + "model": { + "shape": "Model" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "originDomainId": { + "shape": "DomainId" + }, + "originProjectId": { + "shape": "ProjectId" + }, + "status": { + "shape": "FormTypeStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "description": { + "shape": "Description" + }, + "imports": { + "shape": "ImportList" + } + } + }, + "GetGlossaryInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "GlossaryId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetGlossaryOutput": { + "type": "structure", + "required": ["domainId", "id", "owningProjectId", "name", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GlossaryId" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "name": { + "shape": "GlossaryName" + }, + "description": { + "shape": "GlossaryDescription" + }, + "status": { + "shape": "GlossaryStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + } + } + }, + "GetGlossaryTermInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "GlossaryTermId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetGlossaryTermOutput": { + "type": "structure", + "required": ["domainId", "glossaryId", "id", "name", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "glossaryId": { + "shape": "GlossaryId" + }, + "id": { + "shape": "GlossaryTermId" + }, + "name": { + "shape": "GlossaryTermName" + }, + "shortDescription": { + "shape": "ShortDescription" + }, + "longDescription": { + "shape": "LongDescription" + }, + "termRelations": { + "shape": "TermRelations" + }, + "status": { + "shape": "GlossaryTermStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + } + } + }, + "GetGroupProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "groupIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "groupIdentifier": { + "shape": "GroupIdentifier", + "location": "uri", + "locationName": "groupIdentifier" + } + } + }, + "GetGroupProfileOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GroupProfileId" + }, + "status": { + "shape": "GroupProfileStatus" + }, + "groupName": { + "shape": "GroupProfileName" + } + } + }, + "GetIamPortalLoginUrlInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "portalVersion": { + "shape": "PortalVersion", + "internalonly": true + } + } + }, + "GetIamPortalLoginUrlOutput": { + "type": "structure", + "required": ["userProfileId"], + "members": { + "authCodeUrl": { + "shape": "AuthCodeUrl" + }, + "userProfileId": { + "shape": "String" + } + } + }, + "GetJobRunInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "RunIdentifier", + "location": "uri", + "locationName": "identifier" + } + }, + "internalonly": true + }, + "GetJobRunOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "String" + }, + "jobId": { + "shape": "String" + }, + "jobType": { + "shape": "JobType" + }, + "runMode": { + "shape": "JobRunMode" + }, + "details": { + "shape": "JobRunDetails" + }, + "status": { + "shape": "JobRunStatus" + }, + "error": { + "shape": "JobRunError" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "Timestamp" + }, + "startTime": { + "shape": "Timestamp" + }, + "endTime": { + "shape": "Timestamp" + } + }, + "internalonly": true + }, + "GetLineageEventInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "LineageEventIdentifier", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetLineageEventOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId", + "location": "header", + "locationName": "Domain-Id" + }, + "id": { + "shape": "LineageEventIdentifier", + "location": "header", + "locationName": "Id" + }, + "event": { + "shape": "LineageEvent" + }, + "createdBy": { + "shape": "CreatedBy", + "location": "header", + "locationName": "Created-By" + }, + "processingStatus": { + "shape": "LineageEventProcessingStatus", + "location": "header", + "locationName": "Processing-Status" + }, + "eventTime": { + "shape": "Timestamp", + "location": "header", + "locationName": "Event-Time" + }, + "createdAt": { + "shape": "CreatedAt", + "location": "header", + "locationName": "Created-At" + } + }, + "payload": "event" + }, + "GetLineageNodeInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "LineageNodeIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "eventTimestamp": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "timestamp" + } + } + }, + "GetLineageNodeOutput": { + "type": "structure", + "required": ["domainId", "id", "typeName"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "id": { + "shape": "LineageNodeId" + }, + "typeName": { + "shape": "String" + }, + "typeRevision": { + "shape": "Revision" + }, + "sourceIdentifier": { + "shape": "String" + }, + "eventTimestamp": { + "shape": "Timestamp" + }, + "formsOutput": { + "shape": "FormOutputList" + }, + "upstreamNodes": { + "shape": "LineageNodeReferenceList" + }, + "downstreamNodes": { + "shape": "LineageNodeReferenceList" + } + } + }, + "GetListingInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ListingId", + "location": "uri", + "locationName": "identifier" + }, + "listingRevision": { + "shape": "Revision", + "location": "querystring", + "locationName": "listingRevision" + } + } + }, + "GetListingOutput": { + "type": "structure", + "required": ["domainId", "id", "listingRevision"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ListingId" + }, + "listingRevision": { + "shape": "Revision" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "item": { + "shape": "ListingItem" + }, + "name": { + "shape": "ListingName" + }, + "description": { + "shape": "Description" + }, + "status": { + "shape": "ListingStatus" + } + } + }, + "GetMetadataGenerationRunInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "MetadataGenerationRunIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "type": { + "shape": "MetadataGenerationRunType", + "internalonly": true, + "location": "querystring", + "locationName": "type" + } + } + }, + "GetMetadataGenerationRunOutput": { + "type": "structure", + "required": ["domainId", "id", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "MetadataGenerationRunIdentifier" + }, + "target": { + "shape": "MetadataGenerationRunTarget" + }, + "status": { + "shape": "MetadataGenerationRunStatus" + }, + "type": { + "shape": "MetadataGenerationRunType" + }, + "types": { + "shape": "MetadataGenerationRunTypes", + "internalonly": true + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "typeStats": { + "shape": "MetadataGenerationRunTypeStats", + "internalonly": true + } + } + }, + "GetPartnerIntegrationInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "PartnerIntegrationId", + "location": "uri", + "locationName": "identifier" + } + }, + "internalonly": true + }, + "GetPartnerIntegrationOutput": { + "type": "structure", + "required": ["id", "status", "partnerId", "name"], + "members": { + "id": { + "shape": "PartnerIntegrationId" + }, + "createdAt": { + "shape": "CreatedAtTimestamp" + }, + "updatedAt": { + "shape": "UpdatedAtTimestamp" + }, + "status": { + "shape": "PartnerIntegrationStatus" + }, + "partnerId": { + "shape": "PartnerId" + }, + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "props": { + "shape": "PartnerIntegrationPropertiesOutput" + } + }, + "internalonly": true + }, + "GetPortalFeatureFlagsInput": { + "type": "structure", + "required": ["domainId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "jwtToken": { + "shape": "String", + "location": "header", + "locationName": "jwt-token" + }, + "csrfToken": { + "shape": "String", + "location": "header", + "locationName": "x-csrf-token" + } + } + }, + "GetPortalFeatureFlagsOutput": { + "type": "structure", + "members": { + "featureFlags": { + "shape": "FeatureFlagList" + } + } + }, + "GetProjectInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetProjectMembershipRequestInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier", "requestIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "projectIdentifier" + }, + "requestIdentifier": { + "shape": "RequestId", + "location": "uri", + "locationName": "requestIdentifier" + } + } + }, + "GetProjectMembershipRequestOutput": { + "type": "structure", + "required": [ + "domainId", + "projectId", + "requestId", + "requestedDesignation", + "reasonDescription", + "requesterId" + ], + "members": { + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "requestId": { + "shape": "RequestId" + }, + "requestedDesignation": { + "shape": "UserDesignation" + }, + "requestStatus": { + "shape": "RequestStatus" + }, + "reasonDescription": { + "shape": "ReasonDescription" + }, + "requesterId": { + "shape": "String" + }, + "lastUpdatedBy": { + "shape": "String" + }, + "requestedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "GetProjectOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectId" + }, + "name": { + "shape": "ProjectName" + }, + "description": { + "shape": "Description" + }, + "projectStatus": { + "shape": "ProjectStatus", + "documentation": "

Status of the project

" + }, + "failureReasons": { + "shape": "FailureReasons", + "documentation": "

Reasons for failed project deletion

" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "tags": { + "shape": "Tags", + "internalonly": true + }, + "resourceTags": { + "shape": "ResourceTags" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "projectProfileId": { + "shape": "ProjectProfileId", + "internalonly": true + }, + "userParameters": { + "shape": "EnvironmentConfigurationUserParametersList", + "internalonly": true + }, + "environmentDeploymentDetails": { + "shape": "EnvironmentDeploymentDetails", + "internalonly": true + }, + "projectCategory": { + "shape": "String", + "internalonly": true + } + } + }, + "GetProjectProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ProjectProfileId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetProjectProfileOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectProfileId" + }, + "name": { + "shape": "ProjectProfileName" + }, + "description": { + "shape": "Description" + }, + "changeLog": { + "shape": "String", + "internalonly": true + }, + "status": { + "shape": "Status" + }, + "projectResourceTags": { + "shape": "ProjectResourceTagParameters" + }, + "allowCustomProjectResourceTags": { + "shape": "Boolean" + }, + "projectScopes": { + "shape": "ProjectScopesList", + "internalonly": true + }, + "environmentConfigurations": { + "shape": "EnvironmentConfigurationsList" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "designationConfigurations": { + "shape": "DesignationConfigurations", + "internalonly": true + } + } + }, + "GetResourcePolicyInternalRequest": { + "type": "structure", + "members": { + "resourceArn": { + "shape": "RAMResourceARN" + }, + "internalId": { + "shape": "RAMInternalId" + } + } + }, + "GetResourcePolicyInternalResponse": { + "type": "structure", + "members": { + "policy": { + "shape": "RAMPolicy" + } + } + }, + "GetRuleInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "RuleId", + "location": "uri", + "locationName": "identifier" + }, + "revision": { + "shape": "Revision", + "location": "querystring", + "locationName": "revision" + } + } + }, + "GetRuleOutput": { + "type": "structure", + "required": [ + "identifier", + "revision", + "name", + "ruleType", + "target", + "action", + "scope", + "detail", + "createdAt", + "updatedAt", + "createdBy", + "lastUpdatedBy" + ], + "members": { + "identifier": { + "shape": "RuleId" + }, + "revision": { + "shape": "Revision" + }, + "name": { + "shape": "RuleName" + }, + "ruleType": { + "shape": "RuleType" + }, + "target": { + "shape": "RuleTarget" + }, + "action": { + "shape": "RuleAction" + }, + "scope": { + "shape": "RuleScope" + }, + "detail": { + "shape": "RuleDetail" + }, + "targetType": { + "shape": "RuleTargetType" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "lastUpdatedBy": { + "shape": "UpdatedBy" + } + } + }, + "GetServiceLinkInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ServiceLinkId", + "location": "uri", + "locationName": "identifier" + } + }, + "internalonly": true + }, + "GetServiceLinkOutput": { + "type": "structure", + "required": [ + "id", + "domainId", + "owningProjectId", + "domainUnitId", + "createdAt", + "updatedAt", + "status", + "type", + "name", + "createdBy", + "updatedBy", + "glueConnectionArn", + "serviceRoleArn", + "identityMapping", + "delegations", + "configurationOutput" + ], + "members": { + "id": { + "shape": "ServiceLinkId" + }, + "domainId": { + "shape": "DomainId" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "status": { + "shape": "ServiceLinkStatus" + }, + "type": { + "shape": "ServiceLinkType" + }, + "name": { + "shape": "ServiceLinkName" + }, + "error": { + "shape": "ServiceLinkError" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "glueConnectionArn": { + "shape": "String" + }, + "serviceRoleArn": { + "shape": "RoleArn" + }, + "identityMapping": { + "shape": "ServiceLinkIdentityMapping" + }, + "delegations": { + "shape": "ServiceLinkDelegations" + }, + "configurationOutput": { + "shape": "ServiceLinkConfigurationOutput" + } + }, + "internalonly": true + }, + "GetSharedResourcesInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "PartnerIntegrationId", + "location": "uri", + "locationName": "identifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + }, + "internalonly": true + }, + "GetSharedResourcesOutput": { + "type": "structure", + "required": ["id", "status", "partnerId", "name", "items"], + "members": { + "id": { + "shape": "PartnerIntegrationId" + }, + "createdAt": { + "shape": "CreatedAtTimestamp" + }, + "updatedAt": { + "shape": "UpdatedAtTimestamp" + }, + "status": { + "shape": "PartnerIntegrationStatus" + }, + "partnerId": { + "shape": "PartnerId" + }, + "name": { + "shape": "Name" + }, + "items": { + "shape": "SharedResources" + }, + "nextToken": { + "shape": "PaginationToken" + } + }, + "internalonly": true + }, + "GetSubscriptionEligibilityInput": { + "type": "structure", + "required": ["domainIdentifier", "listingId"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "listingId": { + "shape": "ListingId", + "location": "querystring", + "locationName": "listingId" + }, + "isBeforePublishing": { + "shape": "Boolean", + "location": "querystring", + "locationName": "isBeforePublishing" + } + } + }, + "GetSubscriptionEligibilityOutput": { + "type": "structure", + "required": ["status"], + "members": { + "status": { + "shape": "SubscriptionEligibilityStatus" + }, + "message": { + "shape": "String" + } + } + }, + "GetSubscriptionGrantInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionGrantId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetSubscriptionGrantOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "createdAt", + "updatedAt", + "subscriptionTargetId", + "grantedEntity", + "status" + ], + "members": { + "id": { + "shape": "SubscriptionGrantId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "environmentId": { + "shape": "EnvironmentId", + "internalonly": true + }, + "subscriptionTargetId": { + "shape": "SubscriptionTargetId" + }, + "grantedEntity": { + "shape": "GrantedEntity" + }, + "status": { + "shape": "SubscriptionGrantOverallStatus" + }, + "assets": { + "shape": "SubscribedAssets" + }, + "subscriptionId": { + "shape": "SubscriptionId", + "deprecated": true, + "deprecatedMessage": "Multiple subscriptions can exist for a single grant" + } + } + }, + "GetSubscriptionInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetSubscriptionOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "subscribedPrincipal", + "subscribedListing" + ], + "members": { + "id": { + "shape": "SubscriptionId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "subscribedPrincipal": { + "shape": "SubscribedPrincipal" + }, + "subscribedListing": { + "shape": "SubscribedListing" + }, + "subscriptionRequestId": { + "shape": "SubscriptionRequestId" + }, + "retainPermissions": { + "shape": "Boolean" + }, + "pushedSubscription": { + "shape": "Boolean" + }, + "expirationTimestamp": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "GetSubscriptionRequestDetailsInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionRequestId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetSubscriptionRequestDetailsOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "requestReason", + "subscribedPrincipals", + "subscribedListings" + ], + "members": { + "id": { + "shape": "SubscriptionRequestId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionRequestStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "requestReason": { + "shape": "RequestReason" + }, + "subscribedPrincipals": { + "shape": "GetSubscriptionRequestDetailsOutputSubscribedPrincipalsList" + }, + "subscribedListings": { + "shape": "GetSubscriptionRequestDetailsOutputSubscribedListingsList" + }, + "reviewerId": { + "shape": "String" + }, + "decisionComment": { + "shape": "DecisionComment" + }, + "existingSubscriptionId": { + "shape": "SubscriptionId" + }, + "metadataForms": { + "shape": "MetadataForms" + } + } + }, + "GetSubscriptionRequestDetailsOutputSubscribedListingsList": { + "type": "list", + "member": { + "shape": "SubscribedListing" + }, + "max": 1, + "min": 1 + }, + "GetSubscriptionRequestDetailsOutputSubscribedPrincipalsList": { + "type": "list", + "member": { + "shape": "SubscribedPrincipal" + }, + "max": 1, + "min": 1 + }, + "GetSubscriptionTargetInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "identifier": { + "shape": "SubscriptionTargetId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "GetSubscriptionTargetOutput": { + "type": "structure", + "required": [ + "id", + "authorizedPrincipals", + "domainId", + "projectId", + "environmentId", + "name", + "type", + "createdBy", + "createdAt", + "applicableAssetTypes", + "subscriptionTargetConfig", + "provider" + ], + "members": { + "id": { + "shape": "SubscriptionTargetId" + }, + "authorizedPrincipals": { + "shape": "AuthorizedPrincipalIdentifiers" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "SubscriptionTargetName" + }, + "type": { + "shape": "String" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "manageAccessRole": { + "shape": "IamRoleArn" + }, + "applicableAssetTypes": { + "shape": "ApplicableAssetTypes" + }, + "subscriptionTargetConfig": { + "shape": "SubscriptionTargetForms" + }, + "provider": { + "shape": "String" + }, + "timeoutMinutes": { + "shape": "GetSubscriptionTargetOutputTimeoutMinutesInteger" + } + } + }, + "GetSubscriptionTargetOutputTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "min": 1 + }, + "GetTimeSeriesDataPointInput": { + "type": "structure", + "required": ["domainIdentifier", "entityIdentifier", "entityType", "identifier", "formName"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityIdentifier": { + "shape": "EntityIdentifier", + "location": "uri", + "locationName": "entityIdentifier" + }, + "entityType": { + "shape": "TimeSeriesEntityType", + "location": "uri", + "locationName": "entityType" + }, + "identifier": { + "shape": "TimeSeriesDataPointIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "formName": { + "shape": "TimeSeriesFormName", + "location": "querystring", + "locationName": "formName" + } + } + }, + "GetTimeSeriesDataPointOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "entityId": { + "shape": "EntityId" + }, + "entityType": { + "shape": "TimeSeriesEntityType" + }, + "formName": { + "shape": "TimeSeriesFormName" + }, + "form": { + "shape": "TimeSeriesDataPointFormOutput" + } + } + }, + "GetUpdateEligibilityInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier", "type"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "String", + "location": "uri", + "locationName": "identifier" + }, + "type": { + "shape": "EligibilityType", + "location": "querystring", + "locationName": "type" + } + } + }, + "GetUpdateEligibilityOutput": { + "type": "structure", + "required": ["status"], + "members": { + "status": { + "shape": "EligibilityStatus" + }, + "message": { + "shape": "String" + } + } + }, + "GetUserProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "userIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "userIdentifier": { + "shape": "UserIdentifier", + "location": "uri", + "locationName": "userIdentifier" + }, + "type": { + "shape": "UserProfileType", + "location": "querystring", + "locationName": "type" + } + } + }, + "GetUserProfileOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "UserProfileId" + }, + "type": { + "shape": "UserProfileType" + }, + "status": { + "shape": "UserProfileStatus" + }, + "details": { + "shape": "UserProfileDetails" + } + } + }, + "GitPropertiesInput": { + "type": "structure", + "members": { + "branch": { + "shape": "String" + }, + "codestarConnectionArn": { + "shape": "String" + }, + "ownerId": { + "shape": "String" + }, + "repositoryName": { + "shape": "String" + }, + "repositoryType": { + "shape": "RepositoryType" + } + } + }, + "GitPropertiesOutput": { + "type": "structure", + "members": { + "branch": { + "shape": "String" + }, + "codestarConnectionArn": { + "shape": "String" + }, + "ownerId": { + "shape": "String" + }, + "repositoryName": { + "shape": "String" + }, + "repositoryType": { + "shape": "RepositoryType" + } + } + }, + "GlobalParameterMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "GlossaryDescription": { + "type": "string", + "max": 4096, + "min": 0, + "sensitive": true + }, + "GlossaryId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "GlossaryItem": { + "type": "structure", + "required": ["domainId", "id", "name", "owningProjectId", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GlossaryId" + }, + "name": { + "shape": "GlossaryName" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "description": { + "shape": "GlossaryDescription" + }, + "status": { + "shape": "GlossaryStatus" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "additionalAttributes": { + "shape": "GlossaryItemAdditionalAttributes" + } + } + }, + "GlossaryItemAdditionalAttributes": { + "type": "structure", + "members": { + "matchRationale": { + "shape": "MatchRationale" + } + } + }, + "GlossaryItems": { + "type": "list", + "member": { + "shape": "GlossaryItem" + } + }, + "GlossaryName": { + "type": "string", + "max": 256, + "min": 1, + "sensitive": true + }, + "GlossaryStatus": { + "type": "string", + "enum": ["DISABLED", "ENABLED"] + }, + "GlossaryTermEnforcementDetail": { + "type": "structure", + "members": { + "requiredGlossaryTermIds": { + "shape": "GlossaryTermIdentifiers" + } + }, + "internalonly": true + }, + "GlossaryTermId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "GlossaryTermIdentifiers": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "internalonly": true, + "max": 5, + "min": 1 + }, + "GlossaryTermItem": { + "type": "structure", + "required": ["domainId", "glossaryId", "id", "name", "status"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "glossaryId": { + "shape": "GlossaryId" + }, + "id": { + "shape": "GlossaryTermId" + }, + "name": { + "shape": "GlossaryTermName" + }, + "shortDescription": { + "shape": "ShortDescription" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + }, + "longDescription": { + "shape": "LongDescription" + }, + "termRelations": { + "shape": "TermRelations" + }, + "status": { + "shape": "GlossaryTermStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "additionalAttributes": { + "shape": "GlossaryTermItemAdditionalAttributes" + } + } + }, + "GlossaryTermItemAdditionalAttributes": { + "type": "structure", + "members": { + "matchRationale": { + "shape": "MatchRationale" + } + } + }, + "GlossaryTermItems": { + "type": "list", + "member": { + "shape": "GlossaryTermItem" + } + }, + "GlossaryTermName": { + "type": "string", + "max": 256, + "min": 1, + "sensitive": true + }, + "GlossaryTermStatus": { + "type": "string", + "enum": ["ENABLED", "DISABLED"] + }, + "GlossaryTerms": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 20, + "min": 1 + }, + "GlossaryUsageRestriction": { + "type": "string", + "enum": ["ASSET_GOVERNED_TERMS"] + }, + "GlossaryUsageRestrictions": { + "type": "list", + "member": { + "shape": "GlossaryUsageRestriction" + }, + "max": 1, + "min": 1 + }, + "GlueCatalogId": { + "type": "string", + "max": 255, + "min": 1, + "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" + }, + "GlueConnection": { + "type": "structure", + "members": { + "name": { + "shape": "String" + }, + "description": { + "shape": "GlueConnectionDescriptionString" + }, + "connectionType": { + "shape": "ConnectionType" + }, + "matchCriteria": { + "shape": "MatchCriteria" + }, + "connectionProperties": { + "shape": "ConnectionProperties" + }, + "sparkProperties": { + "shape": "PropertyMap" + }, + "athenaProperties": { + "shape": "PropertyMap" + }, + "pythonProperties": { + "shape": "PropertyMap" + }, + "physicalConnectionRequirements": { + "shape": "PhysicalConnectionRequirements" + }, + "creationTime": { + "shape": "Timestamp" + }, + "lastUpdatedTime": { + "shape": "Timestamp" + }, + "lastUpdatedBy": { + "shape": "String" + }, + "status": { + "shape": "ConnectionStatus" + }, + "statusReason": { + "shape": "GlueConnectionStatusReasonString" + }, + "lastConnectionValidationTime": { + "shape": "Timestamp" + }, + "authenticationConfiguration": { + "shape": "AuthenticationConfiguration" + }, + "connectionSchemaVersion": { + "shape": "GlueConnectionConnectionSchemaVersionInteger" + }, + "compatibleComputeEnvironments": { + "shape": "ComputeEnvironmentsList" + } + } + }, + "GlueConnectionConnectionSchemaVersionInteger": { + "type": "integer", + "box": true, + "max": 2, + "min": 1 + }, + "GlueConnectionDescriptionString": { + "type": "string", + "max": 2048, + "min": 0 + }, + "GlueConnectionInput": { + "type": "structure", + "members": { + "connectionProperties": { + "shape": "ConnectionProperties" + }, + "physicalConnectionRequirements": { + "shape": "PhysicalConnectionRequirements" + }, + "name": { + "shape": "GlueConnectionInputNameString" + }, + "description": { + "shape": "GlueConnectionInputDescriptionString" + }, + "connectionType": { + "shape": "GlueConnectionType" + }, + "matchCriteria": { + "shape": "GlueConnectionInputMatchCriteriaString" + }, + "validateCredentials": { + "shape": "Boolean" + }, + "validateForComputeEnvironments": { + "shape": "ComputeEnvironmentsList" + }, + "sparkProperties": { + "shape": "PropertyMap" + }, + "athenaProperties": { + "shape": "PropertyMap" + }, + "pythonProperties": { + "shape": "PropertyMap" + }, + "authenticationConfiguration": { + "shape": "AuthenticationConfigurationInput" + } + } + }, + "GlueConnectionInputDescriptionString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\r\\n\\t]*" + }, + "GlueConnectionInputMatchCriteriaString": { + "type": "string", + "max": 10, + "min": 0 + }, + "GlueConnectionInputNameString": { + "type": "string", + "max": 41, + "min": 1, + "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" + }, + "GlueConnectionName": { + "type": "string", + "max": 255, + "min": 1, + "pattern": "[\\S]*" + }, + "GlueConnectionPatch": { + "type": "structure", + "members": { + "description": { + "shape": "GlueConnectionPatchDescriptionString" + }, + "connectionProperties": { + "shape": "ConnectionProperties" + }, + "authenticationConfiguration": { + "shape": "AuthenticationConfigurationPatch" + } + } + }, + "GlueConnectionPatchDescriptionString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "[\\S\\s]*", + "sensitive": true + }, + "GlueConnectionStatusReasonString": { + "type": "string", + "max": 16384, + "min": 1 + }, + "GlueConnectionType": { + "type": "string", + "enum": [ + "SNOWFLAKE", + "BIGQUERY", + "DOCUMENTDB", + "DYNAMODB", + "MYSQL", + "OPENSEARCH", + "ORACLE", + "POSTGRESQL", + "REDSHIFT", + "SAPHANA", + "SQLSERVER", + "TERADATA", + "VERTICA", + "ICEBERGRESTCATALOG", + "SNOWFLAKEICEBERGRESTCATALOG", + "DATABRICKSICEBERGRESTCATALOG" + ] + }, + "GlueOAuth2Credentials": { + "type": "structure", + "members": { + "userManagedClientApplicationClientSecret": { + "shape": "GlueOAuth2CredentialsUserManagedClientApplicationClientSecretString" + }, + "accessToken": { + "shape": "GlueOAuth2CredentialsAccessTokenString" + }, + "refreshToken": { + "shape": "GlueOAuth2CredentialsRefreshTokenString" + }, + "jwtToken": { + "shape": "GlueOAuth2CredentialsJwtTokenString" + } + }, + "sensitive": true + }, + "GlueOAuth2CredentialsAccessTokenString": { + "type": "string", + "max": 4096, + "min": 0, + "pattern": "[\\x20-\\x7E]*" + }, + "GlueOAuth2CredentialsJwtTokenString": { + "type": "string", + "max": 8000, + "min": 0, + "pattern": "([a-zA-Z0-9_=]+)\\.([a-zA-Z0-9_=]+)\\.([a-zA-Z0-9_\\-\\+\\/=]*)" + }, + "GlueOAuth2CredentialsRefreshTokenString": { + "type": "string", + "max": 4096, + "min": 0, + "pattern": "[\\x20-\\x7E]*" + }, + "GlueOAuth2CredentialsUserManagedClientApplicationClientSecretString": { + "type": "string", + "max": 512, + "min": 0, + "pattern": "[\\x20-\\x7E]*" + }, + "GluePropertiesInput": { + "type": "structure", + "members": { + "glueConnectionInput": { + "shape": "GlueConnectionInput" + }, + "provisioningMode": { + "shape": "ProvisioningMode", + "internalonly": true + } + } + }, + "GluePropertiesOutput": { + "type": "structure", + "members": { + "status": { + "shape": "ConnectionStatus" + }, + "errorMessage": { + "shape": "String" + }, + "provisioningMode": { + "shape": "ProvisioningMode", + "internalonly": true + }, + "provisionedResources": { + "shape": "ProvisionedResources" + } + } + }, + "GluePropertiesPatch": { + "type": "structure", + "members": { + "glueConnectionInput": { + "shape": "GlueConnectionPatch" + }, + "provisioningMode": { + "shape": "ProvisioningMode", + "internalonly": true + } + } + }, + "GlueRunConfigurationInput": { + "type": "structure", + "required": ["relationalFilterConfigurations"], + "members": { + "dataAccessRole": { + "shape": "GlueRunConfigurationInputDataAccessRoleString" + }, + "relationalFilterConfigurations": { + "shape": "RelationalFilterConfigurations" + }, + "autoImportDataQualityResult": { + "shape": "Boolean", + "internalonly": true + }, + "selfGrantSetting": { + "shape": "SelfGrantSetting" + }, + "catalogName": { + "shape": "GlueRunConfigurationInputCatalogNameString", + "internalonly": true + } + } + }, + "GlueRunConfigurationInputCatalogNameString": { + "type": "string", + "max": 128, + "min": 1 + }, + "GlueRunConfigurationInputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "GlueRunConfigurationOutput": { + "type": "structure", + "required": ["relationalFilterConfigurations"], + "members": { + "accountId": { + "shape": "GlueRunConfigurationOutputAccountIdString" + }, + "region": { + "shape": "GlueRunConfigurationOutputRegionString" + }, + "dataAccessRole": { + "shape": "GlueRunConfigurationOutputDataAccessRoleString" + }, + "relationalFilterConfigurations": { + "shape": "RelationalFilterConfigurations" + }, + "autoImportDataQualityResult": { + "shape": "Boolean", + "internalonly": true + }, + "selfGrantSetting": { + "shape": "SelfGrantSetting" + }, + "catalogName": { + "shape": "GlueRunConfigurationOutputCatalogNameString", + "internalonly": true + } + } + }, + "GlueRunConfigurationOutputAccountIdString": { + "type": "string", + "max": 12, + "min": 12, + "pattern": "\\d{12}" + }, + "GlueRunConfigurationOutputCatalogNameString": { + "type": "string", + "max": 128, + "min": 1 + }, + "GlueRunConfigurationOutputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "GlueRunConfigurationOutputRegionString": { + "type": "string", + "max": 16, + "min": 4, + "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" + }, + "GlueSelfGrantStatusOutput": { + "type": "structure", + "required": ["selfGrantStatusDetails"], + "members": { + "selfGrantStatusDetails": { + "shape": "SelfGrantStatusDetails" + } + } + }, + "GovernanceType": { + "type": "string", + "enum": ["AWS_MANAGED", "USER_MANAGED"] + }, + "GovernedEntityType": { + "type": "string", + "enum": ["ASSET"] + }, + "GrantIdentifier": { + "type": "string", + "pattern": "[A-Za-z0-9+/]{10}" + }, + "GrantedEntity": { + "type": "structure", + "members": { + "listing": { + "shape": "ListingRevision" + } + }, + "union": true + }, + "GrantedEntityInput": { + "type": "structure", + "members": { + "listing": { + "shape": "ListingRevisionInput" + } + }, + "union": true + }, + "GreaterThanExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "GreaterThanOrEqualToExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "GroupDetails": { + "type": "structure", + "required": ["groupId"], + "members": { + "groupId": { + "shape": "String" + } + } + }, + "GroupIdentifier": { + "type": "string", + "pattern": ".*(^([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$|[\\p{L}\\p{M}\\p{S}\\p{N}\\p{P}\\t\\n\\r ]+).*" + }, + "GroupPolicyGrantPrincipal": { + "type": "structure", + "members": { + "groupIdentifier": { + "shape": "GroupIdentifier" + } + }, + "union": true + }, + "GroupPolicyPrincipal": { + "type": "structure", + "members": { + "groupIdentifier": { + "shape": "GroupIdentifier" + } + } + }, + "GroupProfile": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GroupProfileId" + }, + "status": { + "shape": "GroupProfileStatus" + }, + "groupName": { + "shape": "GroupProfileName" + } + } + }, + "GroupProfileId": { + "type": "string", + "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + }, + "GroupProfileName": { + "type": "string", + "max": 1024, + "min": 1, + "pattern": "[a-zA-Z_0-9+=,.@-]+", + "sensitive": true + }, + "GroupProfileStatus": { + "type": "string", + "enum": ["ASSIGNED", "NOT_ASSIGNED"] + }, + "GroupProfileSummaries": { + "type": "list", + "member": { + "shape": "GroupProfileSummary" + } + }, + "GroupProfileSummary": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GroupProfileId" + }, + "status": { + "shape": "GroupProfileStatus" + }, + "groupName": { + "shape": "GroupProfileName" + } + } + }, + "GroupProfiles": { + "type": "list", + "member": { + "shape": "GroupProfile" + } + }, + "GroupSearchText": { + "type": "string", + "max": 1024, + "min": 0, + "sensitive": true + }, + "GroupSearchType": { + "type": "string", + "enum": ["SSO_GROUP", "DATAZONE_SSO_GROUP"] + }, + "HyperPodOrchestrator": { + "type": "string", + "enum": ["EKS", "SLURM"] + }, + "HyperPodPropertiesInput": { + "type": "structure", + "required": ["clusterName"], + "members": { + "clusterName": { + "shape": "HyperPodPropertiesInputClusterNameString" + } + } + }, + "HyperPodPropertiesInputClusterNameString": { + "type": "string", + "max": 63, + "min": 1, + "pattern": "[a-zA-Z0-9](-*[a-zA-Z0-9])*" + }, + "HyperPodPropertiesOutput": { + "type": "structure", + "required": ["clusterName"], + "members": { + "clusterName": { + "shape": "String" + }, + "clusterArn": { + "shape": "String" + }, + "orchestrator": { + "shape": "HyperPodOrchestrator" + } + } + }, + "IamCredential": { + "type": "structure", + "members": { + "accessKeyId": { + "shape": "String" + }, + "secretAccessKey": { + "shape": "String" + }, + "sessionToken": { + "shape": "String" + } + } + }, + "IamPropertiesInput": { + "type": "structure", + "members": { + "glueLineageSyncEnabled": { + "shape": "Boolean" + } + } + }, + "IamPropertiesOutput": { + "type": "structure", + "members": { + "environmentId": { + "shape": "String" + }, + "glueLineageSyncEnabled": { + "shape": "Boolean" + } + } + }, + "IamPropertiesPatch": { + "type": "structure", + "members": { + "glueLineageSyncEnabled": { + "shape": "Boolean" + } + } + }, + "IamRoleArn": { + "type": "string", + "pattern": "arn:aws(|-cn|-us-gov):iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" + }, + "IamRolePropertiesOutput": { + "type": "structure", + "members": { + "environmentId": { + "shape": "String" + }, + "glueLineageSyncEnabled": { + "shape": "Boolean" + } + } + }, + "IamUserProfileDetails": { + "type": "structure", + "members": { + "arn": { + "shape": "String" + }, + "principalId": { + "shape": "String" + } + } + }, + "IdentityEnhancedCredentials": { + "type": "structure", + "members": { + "accessKeyId": { + "shape": "String" + }, + "secretAccessKey": { + "shape": "String" + }, + "sessionToken": { + "shape": "String" + }, + "expiration": { + "shape": "SyntheticTimestamp_date_time" + } + }, + "sensitive": true + }, + "IdentityMapping": { + "type": "structure", + "required": ["usernameAttribute"], + "members": { + "usernameAttribute": { + "shape": "String" + }, + "prefix": { + "shape": "String" + } + } + }, + "Import": { + "type": "structure", + "required": ["name", "revision"], + "members": { + "name": { + "shape": "FormTypeName" + }, + "revision": { + "shape": "Revision" + } + } + }, + "ImportList": { + "type": "list", + "member": { + "shape": "Import" + }, + "max": 10, + "min": 1 + }, + "InExpression": { + "type": "structure", + "required": ["columnName", "values"], + "members": { + "columnName": { + "shape": "String" + }, + "values": { + "shape": "StringList" + } + } + }, + "Integer": { + "type": "integer", + "box": true + }, + "InternalServerException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 500 + }, + "exception": true, + "fault": true, + "retryable": { + "throttling": false + } + }, + "InventorySearchScope": { + "type": "string", + "enum": ["ASSET", "GLOSSARY", "GLOSSARY_TERM", "DATA_PRODUCT"] + }, + "IsNotNullExpression": { + "type": "structure", + "required": ["columnName"], + "members": { + "columnName": { + "shape": "String" + } + } + }, + "IsNullExpression": { + "type": "structure", + "required": ["columnName"], + "members": { + "columnName": { + "shape": "String" + } + } + }, + "ItemGlossaryTerms": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 2, + "min": 1 + }, + "JdbcCredentials": { + "type": "structure", + "members": { + "secretArn": { + "shape": "JdbcCredentialsSecretArnString" + }, + "usernamePassword": { + "shape": "UsernamePassword" + } + }, + "sensitive": true, + "union": true + }, + "JdbcCredentialsSecretArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws[^:]*:secretsmanager:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:secret:.*" + }, + "JdbcPropertiesInput": { + "type": "structure", + "members": { + "credentials": { + "shape": "JdbcCredentials" + }, + "dbName": { + "shape": "JdbcPropertiesInputDbNameString" + }, + "engine": { + "shape": "JdbcPropertiesInputEngineString" + }, + "host": { + "shape": "JdbcPropertiesInputHostString" + }, + "port": { + "shape": "JdbcPropertiesInputPortInteger" + } + } + }, + "JdbcPropertiesInputDbNameString": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[a-z0-9]+" + }, + "JdbcPropertiesInputEngineString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "JdbcPropertiesInputHostString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "JdbcPropertiesInputPortInteger": { + "type": "integer", + "box": true, + "max": 65535, + "min": 0 + }, + "JdbcPropertiesOutput": { + "type": "structure", + "members": { + "credentials": { + "shape": "JdbcCredentials" + }, + "isProvisionedSecret": { + "shape": "Boolean" + }, + "jdbcIamUrl": { + "shape": "String" + }, + "jdbcUrl": { + "shape": "String" + }, + "redshiftTempDir": { + "shape": "String" + } + } + }, + "JdbcPropertiesPatch": { + "type": "structure", + "members": { + "credentials": { + "shape": "JdbcCredentials" + }, + "dbName": { + "shape": "JdbcPropertiesPatchDbNameString" + }, + "engine": { + "shape": "JdbcPropertiesPatchEngineString" + }, + "host": { + "shape": "JdbcPropertiesPatchHostString" + }, + "port": { + "shape": "JdbcPropertiesPatchPortInteger" + } + } + }, + "JdbcPropertiesPatchDbNameString": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[a-z0-9]+" + }, + "JdbcPropertiesPatchEngineString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "JdbcPropertiesPatchHostString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "JdbcPropertiesPatchPortInteger": { + "type": "integer", + "box": true, + "max": 65535, + "min": 0 + }, + "JobRunDetails": { + "type": "structure", + "members": { + "lineageRunDetails": { + "shape": "LineageRunDetails" + } + }, + "internalonly": true, + "union": true + }, + "JobRunError": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "String" + } + }, + "internalonly": true + }, + "JobRunMode": { + "type": "string", + "enum": ["SCHEDULED", "ON_DEMAND"], + "internalonly": true + }, + "JobRunStatus": { + "type": "string", + "enum": [ + "SCHEDULED", + "IN_PROGRESS", + "SUCCESS", + "PARTIALLY_SUCCEEDED", + "FAILED", + "ABORTED", + "TIMED_OUT", + "CANCELED" + ], + "internalonly": true + }, + "JobRunSummaries": { + "type": "list", + "member": { + "shape": "JobRunSummary" + }, + "internalonly": true + }, + "JobRunSummary": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "jobId": { + "shape": "String" + }, + "jobType": { + "shape": "JobType" + }, + "runId": { + "shape": "String" + }, + "runMode": { + "shape": "JobRunMode" + }, + "status": { + "shape": "JobRunStatus" + }, + "error": { + "shape": "JobRunError" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "Timestamp" + }, + "startTime": { + "shape": "Timestamp" + }, + "endTime": { + "shape": "Timestamp" + } + }, + "internalonly": true + }, + "JobType": { + "type": "string", + "enum": ["LINEAGE"], + "internalonly": true + }, + "KinesisPropertiesInput": { + "type": "structure", + "members": {} + }, + "KinesisPropertiesOutput": { + "type": "structure", + "members": {} + }, + "KinesisRunConfigurationInput": { + "type": "structure", + "members": {} + }, + "KinesisRunConfigurationOutput": { + "type": "structure", + "members": { + "accountId": { + "shape": "KinesisRunConfigurationOutputAccountIdString" + }, + "region": { + "shape": "KinesisRunConfigurationOutputRegionString" + }, + "dataAccessRole": { + "shape": "KinesisRunConfigurationOutputDataAccessRoleString" + } + } + }, + "KinesisRunConfigurationOutputAccountIdString": { + "type": "string", + "max": 12, + "min": 12, + "pattern": "\\d{12}" + }, + "KinesisRunConfigurationOutputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "KinesisRunConfigurationOutputRegionString": { + "type": "string", + "max": 16, + "min": 4, + "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" + }, + "KmsKeyArn": { + "type": "string", + "max": 1024, + "min": 1, + "pattern": "arn:aws(|-cn|-us-gov):kms:[a-zA-Z0-9-]*:[0-9]{12}:key/[a-zA-Z0-9-]{36}" + }, + "LakeFormationConfiguration": { + "type": "structure", + "members": { + "locationRegistrationRole": { + "shape": "RoleArn" + }, + "locationRegistrationExcludeS3Locations": { + "shape": "S3LocationList" + }, + "lakeFormationLocationRegistrationRole": { + "shape": "RoleArn", + "internalonly": true + }, + "excludeS3Locations": { + "shape": "S3LocationList", + "internalonly": true + } + } + }, + "LakehousePropertiesInput": { + "type": "structure", + "members": { + "glueCatalogId": { + "shape": "GlueCatalogId" + }, + "captureDataLineage": { + "shape": "Boolean", + "documentation": "

Enabling this flag captures lineage for tables managed by glue crawlers

" + } + } + }, + "LakehousePropertiesOutput": { + "type": "structure", + "members": { + "glueCatalogId": { + "shape": "GlueCatalogId" + }, + "captureDataLineage": { + "shape": "Boolean", + "documentation": "

Enabling this flag captures lineage for tables managed by glue crawlers

" + } + } + }, + "LakehousePropertiesPatch": { + "type": "structure", + "members": { + "glueCatalogId": { + "shape": "GlueCatalogId" + }, + "captureDataLineage": { + "shape": "Boolean", + "documentation": "

Enabling this flag captures lineage for tables managed by glue crawlers

" + } + } + }, + "LambdaExecutionRoleArn": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" + }, + "LambdaFunctionArn": { + "type": "string", + "pattern": "arn:(?:aws|aws-cn|aws-us-gov):lambda:(?:[a-z]{2}(?:-gov)?-[a-z]+-\\d{1,}):(\\d{12}):function:[a-zA-Z0-9-_]+(?::[a-zA-Z0-9-_]+)?(?:\\$[\\w-]+)?" + }, + "LastName": { + "type": "string", + "sensitive": true + }, + "LessThanExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "LessThanOrEqualToExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "LikeExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "LineageEvent": { + "type": "blob", + "max": 300000, + "min": 0, + "sensitive": true + }, + "LineageEventErrorMessage": { + "type": "string" + }, + "LineageEventIdentifier": { + "type": "string", + "internalonly": true, + "pattern": "[a-z0-9]{14}" + }, + "LineageEventProcessingStatus": { + "type": "string", + "enum": [ + "REQUESTED", + "PROCESSING", + "SUCCESS", + "FAILED", + "DELETE_PROCESSING", + "DELETE_PENDING", + "DELETE_FAILED" + ] + }, + "LineageEventSummaries": { + "type": "list", + "member": { + "shape": "LineageEventSummary" + } + }, + "LineageEventSummary": { + "type": "structure", + "members": { + "id": { + "shape": "LineageEventIdentifier" + }, + "domainId": { + "shape": "DomainId" + }, + "processingStatus": { + "shape": "LineageEventProcessingStatus" + }, + "eventTime": { + "shape": "Timestamp" + }, + "eventSummary": { + "shape": "EventSummary" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + } + } + }, + "LineageImportStatus": { + "type": "string", + "enum": ["IN_PROGRESS", "SUCCESS", "FAILED", "PARTIALLY_SUCCEEDED"] + }, + "LineageInfo": { + "type": "structure", + "members": { + "eventId": { + "shape": "String" + }, + "eventStatus": { + "shape": "LineageEventProcessingStatus" + }, + "errorMessage": { + "shape": "LineageEventErrorMessage" + } + } + }, + "LineageNodeId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "LineageNodeIdentifier": { + "type": "string", + "max": 2086, + "min": 1 + }, + "LineageNodeReference": { + "type": "structure", + "members": { + "id": { + "shape": "LineageNodeId" + }, + "eventTimestamp": { + "shape": "Timestamp" + } + } + }, + "LineageNodeReferenceList": { + "type": "list", + "member": { + "shape": "LineageNodeReference" + }, + "max": 100, + "min": 0 + }, + "LineageNodeSummaries": { + "type": "list", + "member": { + "shape": "LineageNodeSummary" + } + }, + "LineageNodeSummary": { + "type": "structure", + "required": ["domainId", "id", "typeName"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "id": { + "shape": "LineageNodeId" + }, + "typeName": { + "shape": "String" + }, + "typeRevision": { + "shape": "Revision" + }, + "sourceIdentifier": { + "shape": "String" + }, + "eventTimestamp": { + "shape": "Timestamp" + } + } + }, + "LineageNodeTypeItem": { + "type": "structure", + "required": ["domainId", "revision", "formsOutput"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "revision": { + "shape": "Revision" + }, + "formsOutput": { + "shape": "FormsOutputMap" + } + } + }, + "LineageRunDetails": { + "type": "structure", + "members": { + "sqlQueryRunDetails": { + "shape": "LineageSqlQueryRunDetails" + } + }, + "internalonly": true + }, + "LineageSqlQueryRunDetails": { + "type": "structure", + "members": { + "queryStartTime": { + "shape": "Timestamp" + }, + "queryEndTime": { + "shape": "Timestamp" + }, + "totalQueriesProcessed": { + "shape": "Integer" + }, + "numQueriesFailed": { + "shape": "Integer" + }, + "errorMessages": { + "shape": "FailedQueryProcessingErrorMessages" + } + }, + "internalonly": true + }, + "LineageSyncInput": { + "type": "structure", + "required": ["enabled"], + "members": { + "timezone": { + "shape": "Timezone" + }, + "enabled": { + "shape": "Boolean" + }, + "schedule": { + "shape": "LineageSyncScheduleCronString" + } + } + }, + "LineageSyncOutput": { + "type": "structure", + "members": { + "lineageJobId": { + "shape": "String" + }, + "timezone": { + "shape": "Timezone" + }, + "enabled": { + "shape": "Boolean" + }, + "schedule": { + "shape": "LineageSyncScheduleCronString" + } + } + }, + "LineageSyncSchedule": { + "type": "structure", + "members": { + "schedule": { + "shape": "LineageSyncScheduleScheduleString" + } + } + }, + "LineageSyncScheduleCronString": { + "type": "string", + "max": 256, + "min": 1, + "pattern": ".*cron\\((\\b[0-5]?[0-9]\\b) (\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\).*" + }, + "LineageSyncScheduleScheduleString": { + "type": "string", + "pattern": "cron\\((\\b[0-5]?[0-9]\\b) (\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\)" + }, + "LinkedTypeAuthorizedPrincipals": { + "type": "list", + "member": { + "shape": "AuthorizedPrincipal" + }, + "max": 10, + "min": 1 + }, + "LinkedTypeError": { + "type": "structure", + "required": ["itemIdentifier", "code", "errorMessage"], + "members": { + "itemIdentifier": { + "shape": "String" + }, + "code": { + "shape": "Integer" + }, + "errorMessage": { + "shape": "String" + } + } + }, + "LinkedTypeItemIdentifiers": { + "type": "list", + "member": { + "shape": "String" + }, + "max": 10, + "min": 1 + }, + "LinkedTypeItemType": { + "type": "string", + "enum": ["SAGEMAKER_DOMAIN", "SAGEMAKER_USER_PROFILE", "CUSTOM"] + }, + "ListAccountEnvironmentsInput": { + "type": "structure", + "required": ["domainIdentifier", "awsAccountId"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "awsAccountId": { + "shape": "AwsAccountId", + "location": "uri", + "locationName": "awsAccountId" + }, + "sortBy": { + "shape": "SearchFieldEnvironment", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListAccountEnvironmentsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "EnvironmentSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListAccountPoolsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "AccountPoolName", + "location": "querystring", + "locationName": "name" + }, + "sortBy": { + "shape": "SortFieldAccountPool", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListAccountPoolsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "AccountPoolSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListAccountsInAccountPoolInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AccountPoolId", + "location": "uri", + "locationName": "identifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListAccountsInAccountPoolOutput": { + "type": "structure", + "members": { + "items": { + "shape": "AccountInfoList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListAssetFiltersInput": { + "type": "structure", + "required": ["domainIdentifier", "assetIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "assetIdentifier": { + "shape": "AssetId", + "location": "uri", + "locationName": "assetIdentifier" + }, + "status": { + "shape": "FilterStatus", + "location": "querystring", + "locationName": "status" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListAssetFiltersOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "AssetFilters" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListAssetRevisionsInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListAssetRevisionsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "AssetRevisions" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListAssetTypesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListAssetTypesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "AssetTypeList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListConnectionsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "ListConnectionsInputNextTokenString", + "location": "querystring", + "locationName": "nextToken" + }, + "sortBy": { + "shape": "SortFieldConnection", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "name": { + "shape": "ConnectionName", + "location": "querystring", + "locationName": "name" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "querystring", + "locationName": "environmentIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "projectIdentifier" + }, + "type": { + "shape": "ConnectionType", + "location": "querystring", + "locationName": "type" + }, + "scope": { + "shape": "ConnectionScope", + "internalonly": true, + "location": "querystring", + "locationName": "scope" + } + } + }, + "ListConnectionsInputNextTokenString": { + "type": "string", + "max": 8192, + "min": 1, + "pattern": "[A-Za-z0-9+/=]*" + }, + "ListConnectionsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "ConnectionSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListConsumerAccountsRequest": { + "type": "structure", + "required": ["resourceType"], + "members": { + "resourceType": { + "shape": "ResourceType" + }, + "maxResults": { + "shape": "MaxResults" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListConsumerAccountsResponse": { + "type": "structure", + "members": { + "nextToken": { + "shape": "String" + }, + "accountIds": { + "shape": "AccountIdList" + } + } + }, + "ListDataProductRevisionsInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataProductId", + "location": "uri", + "locationName": "identifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListDataProductRevisionsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "DataProductRevisions" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListDataSourceRunActivitiesInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataSourceRunId", + "location": "uri", + "locationName": "identifier" + }, + "status": { + "shape": "DataAssetActivityStatus", + "location": "querystring", + "locationName": "status" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListDataSourceRunActivitiesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "DataSourceRunActivities" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListDataSourceRunsInput": { + "type": "structure", + "required": ["domainIdentifier", "dataSourceIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "dataSourceIdentifier": { + "shape": "DataSourceId", + "location": "uri", + "locationName": "dataSourceIdentifier" + }, + "status": { + "shape": "DataSourceRunStatus", + "location": "querystring", + "locationName": "status" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListDataSourceRunsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "DataSourceRunSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListDataSourcesInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "projectIdentifier" + }, + "environmentIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "environmentIdentifier" + }, + "connectionIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "connectionIdentifier" + }, + "type": { + "shape": "String", + "location": "querystring", + "locationName": "type" + }, + "status": { + "shape": "DataSourceStatus", + "location": "querystring", + "locationName": "status" + }, + "name": { + "shape": "Name", + "location": "querystring", + "locationName": "name" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListDataSourcesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "DataSourceSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListDesignationsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListDesignationsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "DesignationSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListDomainUnitPoliciesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "scopeFilter": { + "shape": "String", + "location": "querystring", + "locationName": "scopeFilter" + }, + "maxResults": { + "shape": "MaxResultsForListDomains", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListDomainUnitPoliciesOutput": { + "type": "structure", + "required": ["domainIdentifier", "items"], + "members": { + "domainIdentifier": { + "shape": "DomainId" + }, + "items": { + "shape": "DomainUnitPolicySummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListDomainUnitsForParentInput": { + "type": "structure", + "required": ["domainIdentifier", "parentDomainUnitIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "parentDomainUnitIdentifier": { + "shape": "DomainUnitId", + "location": "querystring", + "locationName": "parentDomainUnitIdentifier" + }, + "maxResults": { + "shape": "MaxResultsForListDomains", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListDomainUnitsForParentOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "DomainUnitSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListDomainsInput": { + "type": "structure", + "members": { + "status": { + "shape": "DomainStatus", + "location": "querystring", + "locationName": "status" + }, + "maxResults": { + "shape": "MaxResultsForListDomains", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListDomainsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "DomainSummaries" + }, + "domains": { + "shape": "DomainSummaries", + "internalonly": true + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEntityOwnersInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "DataZoneEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "String", + "location": "uri", + "locationName": "entityIdentifier" + }, + "maxResults": { + "shape": "MaxResultsForListDomains", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListEntityOwnersOutput": { + "type": "structure", + "required": ["owners"], + "members": { + "owners": { + "shape": "EntityOwners" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEnvironmentActionSummaries": { + "type": "list", + "member": { + "shape": "EnvironmentActionSummary" + } + }, + "ListEnvironmentActionsInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListEnvironmentActionsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "ListEnvironmentActionSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEnvironmentBlueprintConfigurationSummariesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "awsAccountId": { + "shape": "AwsAccountId", + "location": "querystring", + "locationName": "awsAccountId" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId", + "location": "querystring", + "locationName": "environmentBlueprintIdentifier" + } + } + }, + "ListEnvironmentBlueprintConfigurationSummariesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "EnvironmentBlueprintConfigurationSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEnvironmentBlueprintConfigurationsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListEnvironmentBlueprintConfigurationsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "EnvironmentBlueprintConfigurations" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEnvironmentBlueprintsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "name": { + "shape": "EnvironmentBlueprintName", + "location": "querystring", + "locationName": "name" + }, + "managed": { + "shape": "Boolean", + "location": "querystring", + "locationName": "managed" + }, + "provider": { + "shape": "String", + "location": "querystring", + "locationName": "provider" + }, + "sortBy": { + "shape": "SearchFieldEnvironment", + "internalonly": true, + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "internalonly": true, + "location": "querystring", + "locationName": "sortOrder" + } + } + }, + "ListEnvironmentBlueprintsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "EnvironmentBlueprintSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEnvironmentProfilesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "awsAccountId": { + "shape": "AwsAccountId", + "location": "querystring", + "locationName": "awsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion", + "location": "querystring", + "locationName": "awsAccountRegion" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId", + "location": "querystring", + "locationName": "environmentBlueprintIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "projectIdentifier" + }, + "name": { + "shape": "EnvironmentProfileName", + "location": "querystring", + "locationName": "name" + }, + "sortBy": { + "shape": "SearchFieldEnvironment", + "internalonly": true, + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "internalonly": true, + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListEnvironmentProfilesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "EnvironmentProfileSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEnvironmentRoleSummaries": { + "type": "list", + "member": { + "shape": "EnvironmentRoleSummary" + } + }, + "ListEnvironmentRolesInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListEnvironmentRolesOutput": { + "type": "structure", + "members": { + "items": { + "shape": "ListEnvironmentRoleSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListEnvironmentsInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "awsAccountId": { + "shape": "AwsAccountId", + "location": "querystring", + "locationName": "awsAccountId" + }, + "status": { + "shape": "EnvironmentStatus", + "location": "querystring", + "locationName": "status" + }, + "awsAccountRegion": { + "shape": "AwsRegion", + "location": "querystring", + "locationName": "awsAccountRegion" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "projectIdentifier" + }, + "environmentProfileIdentifier": { + "shape": "EnvironmentProfileId", + "location": "querystring", + "locationName": "environmentProfileIdentifier" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId", + "location": "querystring", + "locationName": "environmentBlueprintIdentifier" + }, + "provider": { + "shape": "String", + "location": "querystring", + "locationName": "provider" + }, + "name": { + "shape": "String", + "location": "querystring", + "locationName": "name" + }, + "sortBy": { + "shape": "SearchFieldEnvironment", + "internalonly": true, + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "internalonly": true, + "location": "querystring", + "locationName": "sortOrder" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListEnvironmentsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "EnvironmentSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListFormTypesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListFormTypesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "FormTypeDataList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListGlossariesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListGlossariesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "GlossaryItems" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListGlossaryTermsInput": { + "type": "structure", + "required": ["domainIdentifier", "glossaryIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "glossaryIdentifier": { + "shape": "GlossaryTermId", + "location": "uri", + "locationName": "glossaryIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListGlossaryTermsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "GlossaryTermItems" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListGroupsForUserInput": { + "type": "structure", + "required": ["domainId", "userId"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "userId": { + "shape": "UserProfileId", + "location": "uri", + "locationName": "userId" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListGroupsForUserOutput": { + "type": "structure", + "members": { + "groupProfiles": { + "shape": "GroupProfiles" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListJobRunsInput": { + "type": "structure", + "required": ["domainIdentifier", "jobIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "jobIdentifier": { + "shape": "ListJobRunsInputJobIdentifierString", + "location": "uri", + "locationName": "jobIdentifier" + }, + "status": { + "shape": "JobRunStatus", + "location": "querystring", + "locationName": "status" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + }, + "internalonly": true + }, + "ListJobRunsInputJobIdentifierString": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "ListJobRunsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "JobRunSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + }, + "internalonly": true + }, + "ListLineageEventsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "timestampAfter": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "timestampAfter" + }, + "timestampBefore": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "timestampBefore" + }, + "processingStatus": { + "shape": "LineageEventProcessingStatus", + "location": "querystring", + "locationName": "processingStatus" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListLineageEventsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "LineageEventSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListLineageNodeHistoryInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "identifier": { + "shape": "LineageNodeIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "direction": { + "shape": "EdgeDirection", + "location": "querystring", + "locationName": "direction" + }, + "eventTimestampGTE": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "timestampGTE" + }, + "eventTimestampLTE": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "timestampLTE" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + } + } + }, + "ListLineageNodeHistoryOutput": { + "type": "structure", + "members": { + "nodes": { + "shape": "LineageNodeSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListLinkedTypeItem": { + "type": "structure", + "required": ["itemIdentifier", "itemType"], + "members": { + "itemIdentifier": { + "shape": "String" + }, + "itemType": { + "shape": "LinkedTypeItemType" + }, + "name": { + "shape": "String" + }, + "arn": { + "shape": "String" + }, + "configuration": { + "shape": "ConfigurationMap" + }, + "authorizedPrincipals": { + "shape": "LinkedTypeAuthorizedPrincipals" + }, + "connectedEntities": { + "shape": "ConnectedEntities" + }, + "projectIdentifier": { + "shape": "ProjectId" + }, + "environmentIdentifier": { + "shape": "EnvironmentId" + } + } + }, + "ListLinkedTypesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "projectIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "querystring", + "locationName": "environmentIdentifier" + }, + "principalIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "principalIdentifier" + }, + "itemIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "itemIdentifier" + }, + "itemType": { + "shape": "LinkedTypeItemType", + "location": "querystring", + "locationName": "itemType" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "ListLinkedTypesInputMaxResultsInteger", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListLinkedTypesInputMaxResultsInteger": { + "type": "integer", + "box": true, + "max": 50, + "min": 1 + }, + "ListLinkedTypesItems": { + "type": "list", + "member": { + "shape": "ListLinkedTypeItem" + } + }, + "ListLinkedTypesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "ListLinkedTypesItems" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListMetadataGenerationRunsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "status": { + "shape": "MetadataGenerationRunStatus", + "location": "querystring", + "locationName": "status" + }, + "type": { + "shape": "MetadataGenerationRunType", + "location": "querystring", + "locationName": "type" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "targetIdentifier": { + "shape": "EntityId", + "internalonly": true, + "location": "querystring", + "locationName": "targetIdentifier" + } + } + }, + "ListMetadataGenerationRunsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "MetadataGenerationRuns" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListNotificationsInput": { + "type": "structure", + "required": ["domainIdentifier", "type"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "type": { + "shape": "NotificationType", + "location": "querystring", + "locationName": "type" + }, + "afterTimestamp": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "afterTimestamp" + }, + "beforeTimestamp": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "beforeTimestamp" + }, + "subjects": { + "shape": "NotificationSubjects", + "location": "querystring", + "locationName": "subjects" + }, + "taskStatus": { + "shape": "TaskStatus", + "location": "querystring", + "locationName": "taskStatus" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListNotificationsOutput": { + "type": "structure", + "members": { + "notifications": { + "shape": "NotificationsList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListPartnerIntegrationsInput": { + "type": "structure", + "members": { + "status": { + "shape": "PartnerIntegrationStatus", + "location": "querystring", + "locationName": "status" + }, + "partnerId": { + "shape": "PartnerId", + "location": "querystring", + "locationName": "partnerId" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + }, + "internalonly": true + }, + "ListPartnerIntegrationsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "PartnerIntegrationSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + }, + "internalonly": true + }, + "ListPolicyGrantsInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "policyType"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "TargetEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "String", + "location": "uri", + "locationName": "entityIdentifier" + }, + "policyType": { + "shape": "ManagedPolicyType", + "location": "querystring", + "locationName": "policyType" + }, + "maxResults": { + "shape": "MaxResultsForListDomains", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListPolicyGrantsOutput": { + "type": "structure", + "required": ["grantList"], + "members": { + "grantList": { + "shape": "PolicyGrantList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListProjectMembershipRequestsInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "projectIdentifier" + }, + "sortBy": { + "shape": "SortFieldProjectMembershipRequest", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListProjectMembershipRequestsOutput": { + "type": "structure", + "required": ["requests"], + "members": { + "requests": { + "shape": "MembershipRequests" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListProjectMembershipsInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "projectIdentifier" + }, + "sortBy": { + "shape": "SortFieldProject", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListProjectMembershipsOutput": { + "type": "structure", + "required": ["members"], + "members": { + "members": { + "shape": "ProjectMembers" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListProjectProfilesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "name": { + "shape": "ProjectProfileName", + "location": "querystring", + "locationName": "name" + }, + "sortBy": { + "shape": "SortFieldProject", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListProjectProfilesOutput": { + "type": "structure", + "members": { + "items": { + "shape": "ProjectProfileSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListProjectsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "userIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "userIdentifier" + }, + "groupIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "groupIdentifier" + }, + "projectCreator": { + "shape": "String", + "location": "querystring", + "locationName": "projectCreator" + }, + "projectCategory": { + "shape": "String", + "internalonly": true, + "location": "querystring", + "locationName": "projectCategory" + }, + "name": { + "shape": "ProjectName", + "location": "querystring", + "locationName": "name" + }, + "sortBy": { + "shape": "SortFieldProject", + "internalonly": true, + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "internalonly": true, + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListProjectsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "ProjectSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListResourcesSupportPolicyRequest": { + "type": "structure", + "members": { + "resourceType": { + "shape": "ResourceType" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "maxResults": { + "shape": "MaxResults" + } + } + }, + "ListResourcesSupportPolicyResponse": { + "type": "structure", + "required": ["resources"], + "members": { + "resources": { + "shape": "RAMResourceList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListRulesInput": { + "type": "structure", + "required": ["domainIdentifier", "targetType", "targetIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "targetType": { + "shape": "RuleTargetType", + "location": "uri", + "locationName": "targetType" + }, + "targetIdentifier": { + "shape": "String", + "location": "uri", + "locationName": "targetIdentifier" + }, + "ruleType": { + "shape": "RuleType", + "location": "querystring", + "locationName": "ruleType" + }, + "action": { + "shape": "RuleAction", + "location": "querystring", + "locationName": "ruleAction" + }, + "projectIds": { + "shape": "ProjectIds", + "location": "querystring", + "locationName": "projectIds" + }, + "assetTypes": { + "shape": "AssetTypeIdentifiers", + "location": "querystring", + "locationName": "assetTypes" + }, + "dataProduct": { + "shape": "Boolean", + "location": "querystring", + "locationName": "dataProduct" + }, + "includeCascaded": { + "shape": "Boolean", + "location": "querystring", + "locationName": "includeCascaded" + }, + "maxResults": { + "shape": "ListRulesInputMaxResultsInteger", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListRulesInputMaxResultsInteger": { + "type": "integer", + "box": true, + "max": 50, + "min": 25 + }, + "ListRulesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "RuleSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListServiceLinksInput": { + "type": "structure", + "required": ["domainIdentifier", "type"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "domainUnitId": { + "shape": "DomainUnitId", + "location": "querystring", + "locationName": "domainUnitId" + }, + "owningProjectId": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "owningProjectId" + }, + "type": { + "shape": "ServiceLinkType", + "location": "querystring", + "locationName": "type" + }, + "status": { + "shape": "ServiceLinkStatus", + "location": "querystring", + "locationName": "status" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + }, + "internalonly": true + }, + "ListServiceLinksOutput": { + "type": "structure", + "required": ["items"], + "members": { + "nextToken": { + "shape": "PaginationToken" + }, + "items": { + "shape": "ServiceLinkSummaries" + } + }, + "internalonly": true + }, + "ListSharedResourcesRequest": { + "type": "structure", + "required": ["consumerAccountId"], + "members": { + "consumerAccountId": { + "shape": "AwsAccountId" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "maxResults": { + "shape": "MaxResults" + }, + "resourceType": { + "shape": "ResourceType" + } + } + }, + "ListSharedResourcesResponse": { + "type": "structure", + "required": ["versionedResources"], + "members": { + "versionedResources": { + "shape": "RAMVersionedSharedResourceList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListSubscriptionGrantsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentId": { + "shape": "EnvironmentId", + "location": "querystring", + "locationName": "environmentId" + }, + "subscriptionTargetId": { + "shape": "SubscriptionTargetId", + "location": "querystring", + "locationName": "subscriptionTargetId" + }, + "subscribedListingId": { + "shape": "ListingId", + "location": "querystring", + "locationName": "subscribedListingId" + }, + "subscriptionId": { + "shape": "SubscriptionId", + "location": "querystring", + "locationName": "subscriptionId" + }, + "owningProjectId": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "owningProjectId" + }, + "owningUserId": { + "shape": "UserProfileId", + "location": "querystring", + "locationName": "owningUserId" + }, + "owningGroupId": { + "shape": "GroupProfileId", + "location": "querystring", + "locationName": "owningGroupId" + }, + "sortBy": { + "shape": "SortKey", + "deprecated": true, + "deprecatedMessage": "Results are always sorted by updatedAt", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListSubscriptionGrantsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "SubscriptionGrants" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListSubscriptionRequestsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "status": { + "shape": "SubscriptionRequestStatus", + "location": "querystring", + "locationName": "status" + }, + "subscribedListingId": { + "shape": "ListingId", + "location": "querystring", + "locationName": "subscribedListingId" + }, + "owningProjectId": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "owningProjectId" + }, + "owningUserId": { + "shape": "UserProfileId", + "location": "querystring", + "locationName": "owningUserId" + }, + "owningGroupId": { + "shape": "GroupProfileId", + "location": "querystring", + "locationName": "owningGroupId" + }, + "approverProjectId": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "approverProjectId" + }, + "sortBy": { + "shape": "SortKey", + "deprecated": true, + "deprecatedMessage": "Results are always sorted by updatedAt", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListSubscriptionRequestsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "SubscriptionRequests" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListSubscriptionTargetsInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "sortBy": { + "shape": "SortKey", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListSubscriptionTargetsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "SubscriptionTargets" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListSubscriptionsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "subscriptionRequestIdentifier": { + "shape": "SubscriptionRequestId", + "location": "querystring", + "locationName": "subscriptionRequestIdentifier" + }, + "status": { + "shape": "SubscriptionStatus", + "location": "querystring", + "locationName": "status" + }, + "subscribedListingId": { + "shape": "ListingId", + "location": "querystring", + "locationName": "subscribedListingId" + }, + "owningProjectId": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "owningProjectId" + }, + "owningUserId": { + "shape": "UserProfileId", + "location": "querystring", + "locationName": "owningUserId" + }, + "owningGroupId": { + "shape": "GroupProfileId", + "location": "querystring", + "locationName": "owningGroupId" + }, + "approverProjectId": { + "shape": "ProjectId", + "location": "querystring", + "locationName": "approverProjectId" + }, + "sortBy": { + "shape": "SortKey", + "deprecated": true, + "deprecatedMessage": "Results are always sorted by updatedAt", + "location": "querystring", + "locationName": "sortBy" + }, + "sortOrder": { + "shape": "SortOrder", + "location": "querystring", + "locationName": "sortOrder" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "ListSubscriptionsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "Subscriptions" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListTagsForResourceRequest": { + "type": "structure", + "required": ["resourceArn"], + "members": { + "resourceArn": { + "shape": "String", + "location": "uri", + "locationName": "resourceArn" + } + } + }, + "ListTagsForResourceResponse": { + "type": "structure", + "members": { + "tags": { + "shape": "Tags" + } + } + }, + "ListTimeSeriesDataPointsInput": { + "type": "structure", + "required": ["domainIdentifier", "entityIdentifier", "entityType", "formName"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityIdentifier": { + "shape": "EntityIdentifier", + "location": "uri", + "locationName": "entityIdentifier" + }, + "entityType": { + "shape": "TimeSeriesEntityType", + "location": "uri", + "locationName": "entityType" + }, + "formName": { + "shape": "TimeSeriesFormName", + "location": "querystring", + "locationName": "formName" + }, + "startedAt": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "startedAt" + }, + "endedAt": { + "shape": "Timestamp", + "location": "querystring", + "locationName": "endedAt" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + } + } + }, + "ListTimeSeriesDataPointsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "TimeSeriesDataPointSummaryFormOutputList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListWarehouseMetadataInput": { + "type": "structure", + "required": ["domainIdentifier", "awsAccountId", "environmentProfileIdentifier", "regionName", "target"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "awsAccountId": { + "shape": "AwsAccountId", + "location": "uri", + "locationName": "awsAccountId" + }, + "environmentProfileIdentifier": { + "shape": "String", + "location": "querystring", + "locationName": "environmentProfileIdentifier" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "regionName": { + "shape": "AwsRegion", + "location": "querystring", + "locationName": "region" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "target": { + "shape": "WarehouseMetadataListingTarget", + "location": "querystring", + "locationName": "target" + } + } + }, + "ListWarehouseMetadataOutput": { + "type": "structure", + "required": ["metadata"], + "members": { + "metadata": { + "shape": "MetadataList" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "ListingId": { + "type": "string", + "pattern": "([a-zA-Z0-9_-]{1,16}/)?[a-zA-Z0-9_-]{1,36}" + }, + "ListingItem": { + "type": "structure", + "members": { + "assetListing": { + "shape": "AssetListing" + }, + "dataProductListing": { + "shape": "DataProductListing" + } + }, + "union": true + }, + "ListingName": { + "type": "string", + "max": 64, + "min": 1 + }, + "ListingRevision": { + "type": "structure", + "required": ["id", "revision"], + "members": { + "id": { + "shape": "ListingId" + }, + "revision": { + "shape": "Revision" + } + } + }, + "ListingRevisionInput": { + "type": "structure", + "required": ["identifier", "revision"], + "members": { + "identifier": { + "shape": "ListingId" + }, + "revision": { + "shape": "Revision" + } + } + }, + "ListingStatus": { + "type": "string", + "enum": ["CREATING", "ACTIVE", "INACTIVE"] + }, + "ListingSummaries": { + "type": "list", + "member": { + "shape": "ListingSummary" + } + }, + "ListingSummary": { + "type": "structure", + "members": { + "listingId": { + "shape": "ListingId" + }, + "listingRevision": { + "shape": "Revision" + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + } + } + }, + "ListingSummaryItem": { + "type": "structure", + "members": { + "listingId": { + "shape": "ListingId" + }, + "listingRevision": { + "shape": "Revision" + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + } + } + }, + "ListingSummaryItems": { + "type": "list", + "member": { + "shape": "ListingSummaryItem" + } + }, + "LongDescription": { + "type": "string", + "max": 4096, + "min": 0, + "sensitive": true + }, + "MalformedResourcePolicyDocumentException": { + "type": "structure", + "members": { + "message": { + "shape": "String" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "ManagedEndpointCredentials": { + "type": "structure", + "members": { + "id": { + "shape": "ManagedEndpointCredentialsIdString" + }, + "token": { + "shape": "String" + } + }, + "sensitive": true + }, + "ManagedEndpointCredentialsIdString": { + "type": "string", + "max": 64, + "min": 0 + }, + "ManagedPolicyType": { + "type": "string", + "enum": [ + "CreateDomainUnit", + "OverrideDomainUnitOwners", + "AddToProjectMemberPool", + "OverrideProjectOwners", + "CreateGlossary", + "CreateFormType", + "CreateAssetType", + "CreateProject", + "CreateEnvironmentProfile", + "DelegateCreateEnvironmentProfile", + "CreateEnvironment", + "CREATE_DOMAIN_UNIT", + "OVERRIDE_DOMAIN_UNIT_OWNERS", + "ADD_TO_PROJECT_MEMBER_POOL", + "OVERRIDE_PROJECT_OWNERS", + "CREATE_GLOSSARY", + "CREATE_FORM_TYPE", + "CREATE_ASSET_TYPE", + "CREATE_PROJECT", + "CREATE_ENVIRONMENT_PROFILE", + "DELEGATE_CREATE_ENVIRONMENT_PROFILE", + "CREATE_ENVIRONMENT", + "CREATE_ENVIRONMENT_FROM_BLUEPRINT", + "CREATE_PROJECT_FROM_PROJECT_PROFILE", + "USE_ASSET_TYPE", + "ATTACH_GOVERNED_GLOSSARY_TERMS" + ] + }, + "ManualProperties": { + "type": "structure", + "members": { + "name": { + "shape": "String" + } + } + }, + "MatchCriteria": { + "type": "list", + "member": { + "shape": "String" + }, + "max": 10, + "min": 0 + }, + "MatchOffset": { + "type": "structure", + "members": { + "startOffset": { + "shape": "Integer" + }, + "endOffset": { + "shape": "Integer" + } + } + }, + "MatchOffsets": { + "type": "list", + "member": { + "shape": "MatchOffset" + } + }, + "MatchRationale": { + "type": "list", + "member": { + "shape": "MatchRationaleItem" + } + }, + "MatchRationaleItem": { + "type": "structure", + "members": { + "textMatches": { + "shape": "TextMatches" + } + }, + "union": true + }, + "MaxListResults": { + "type": "integer", + "box": true, + "max": 100, + "min": 1 + }, + "MaxResults": { + "type": "integer", + "box": true, + "max": 50, + "min": 1 + }, + "MaxResultsForListDomains": { + "type": "integer", + "box": true, + "max": 25, + "min": 1 + }, + "Member": { + "type": "structure", + "members": { + "userIdentifier": { + "shape": "String" + }, + "groupIdentifier": { + "shape": "String" + } + }, + "union": true + }, + "MemberDetails": { + "type": "structure", + "members": { + "user": { + "shape": "UserDetails" + }, + "group": { + "shape": "GroupDetails" + } + }, + "union": true + }, + "MemberType": { + "type": "string", + "enum": ["IAM_ROLE", "IAM_USER", "SSO_USER", "SSO_GROUP"], + "internalonly": true + }, + "MembershipRequests": { + "type": "list", + "member": { + "shape": "ProjectMembershipRequestOutput" + } + }, + "Message": { + "type": "string", + "max": 16384, + "min": 0, + "sensitive": true + }, + "MessageParametersMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "MetadataFormEnforcementDetail": { + "type": "structure", + "members": { + "requiredMetadataForms": { + "shape": "RequiredMetadataFormList" + } + } + }, + "MetadataFormInputs": { + "type": "list", + "member": { + "shape": "FormInput" + } + }, + "MetadataFormReference": { + "type": "structure", + "required": ["typeIdentifier", "typeRevision"], + "members": { + "typeIdentifier": { + "shape": "FormTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + } + } + }, + "MetadataFormSummary": { + "type": "structure", + "required": ["typeName", "typeRevision"], + "members": { + "formName": { + "shape": "FormName" + }, + "typeName": { + "shape": "FormTypeName" + }, + "typeRevision": { + "shape": "Revision" + } + } + }, + "MetadataForms": { + "type": "list", + "member": { + "shape": "FormOutput" + } + }, + "MetadataFormsSummary": { + "type": "list", + "member": { + "shape": "MetadataFormSummary" + } + }, + "MetadataGenerationRunIdentifier": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "MetadataGenerationRunItem": { + "type": "structure", + "required": ["domainId", "id", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "MetadataGenerationRunIdentifier" + }, + "target": { + "shape": "MetadataGenerationRunTarget" + }, + "status": { + "shape": "MetadataGenerationRunStatus" + }, + "type": { + "shape": "MetadataGenerationRunType" + }, + "types": { + "shape": "MetadataGenerationRunTypes", + "internalonly": true + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "owningProjectId": { + "shape": "ProjectId" + } + } + }, + "MetadataGenerationRunStatus": { + "type": "string", + "enum": ["SUBMITTED", "IN_PROGRESS", "CANCELED", "SUCCEEDED", "FAILED", "PARTIALLY_SUCCEEDED"] + }, + "MetadataGenerationRunTarget": { + "type": "structure", + "required": ["type", "identifier"], + "members": { + "type": { + "shape": "MetadataGenerationTargetType" + }, + "identifier": { + "shape": "String" + }, + "revision": { + "shape": "Revision" + } + } + }, + "MetadataGenerationRunType": { + "type": "string", + "enum": ["BUSINESS_DESCRIPTIONS", "BUSINESS_NAMES", "BUSINESS_GLOSSARY_ASSOCIATIONS"] + }, + "MetadataGenerationRunTypeStat": { + "type": "structure", + "required": ["type", "status"], + "members": { + "type": { + "shape": "MetadataGenerationRunType" + }, + "status": { + "shape": "MetadataGenerationRunStatus" + }, + "errorMessage": { + "shape": "String" + } + }, + "internalonly": true + }, + "MetadataGenerationRunTypeStats": { + "type": "list", + "member": { + "shape": "MetadataGenerationRunTypeStat" + }, + "internalonly": true + }, + "MetadataGenerationRunTypes": { + "type": "list", + "member": { + "shape": "MetadataGenerationRunType" + }, + "max": 2, + "min": 1 + }, + "MetadataGenerationRuns": { + "type": "list", + "member": { + "shape": "MetadataGenerationRunItem" + } + }, + "MetadataGenerationTargetType": { + "type": "string", + "enum": ["ASSET"] + }, + "MetadataList": { + "type": "list", + "member": { + "shape": "MetadataOutput" + } + }, + "MetadataMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "MetadataOutput": { + "type": "structure", + "required": ["secretArn", "target"], + "members": { + "secretArn": { + "shape": "String" + }, + "target": { + "shape": "String" + }, + "database": { + "shape": "String" + } + } + }, + "MlflowPropertiesInput": { + "type": "structure", + "members": { + "trackingServerName": { + "shape": "String" + }, + "trackingServerArn": { + "shape": "String" + } + } + }, + "MlflowPropertiesOutput": { + "type": "structure", + "members": { + "trackingServerName": { + "shape": "String" + }, + "trackingServerArn": { + "shape": "String" + } + } + }, + "ModalitiesType": { + "type": "list", + "member": { + "shape": "ModalityType" + }, + "min": 1 + }, + "ModalityType": { + "type": "string", + "enum": ["TEXT", "IMAGE", "EMBEDDING", "VIDEO"] + }, + "Model": { + "type": "structure", + "members": { + "smithy": { + "shape": "Smithy" + } + }, + "sensitive": true, + "union": true + }, + "ModelFormat": { + "type": "string", + "enum": ["SMITHY", "SMITHY_JSON"] + }, + "MskPropertiesInput": { + "type": "structure", + "members": {} + }, + "MskPropertiesOutput": { + "type": "structure", + "members": {} + }, + "MskRunConfigurationInput": { + "type": "structure", + "required": ["clusters"], + "members": { + "clusters": { + "shape": "Clusters", + "documentation": "

A list of MSK cluster names.

", + "internalonly": true + } + } + }, + "MskRunConfigurationOutput": { + "type": "structure", + "required": ["clusters"], + "members": { + "accountId": { + "shape": "MskRunConfigurationOutputAccountIdString" + }, + "region": { + "shape": "MskRunConfigurationOutputRegionString" + }, + "dataAccessRole": { + "shape": "MskRunConfigurationOutputDataAccessRoleString" + }, + "clusters": { + "shape": "Clusters", + "internalonly": true + } + } + }, + "MskRunConfigurationOutputAccountIdString": { + "type": "string", + "max": 12, + "min": 12, + "pattern": "\\d{12}" + }, + "MskRunConfigurationOutputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "MskRunConfigurationOutputRegionString": { + "type": "string", + "max": 16, + "min": 4, + "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" + }, + "Name": { + "type": "string", + "max": 256, + "min": 1, + "sensitive": true + }, + "NameIdentifier": { + "type": "structure", + "members": { + "name": { + "shape": "String" + }, + "namespace": { + "shape": "String" + } + } + }, + "NameIdentifiers": { + "type": "list", + "member": { + "shape": "NameIdentifier" + } + }, + "NgramReranker": { + "type": "structure", + "members": {} + }, + "NotEqualToExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "NotInExpression": { + "type": "structure", + "required": ["columnName", "values"], + "members": { + "columnName": { + "shape": "String" + }, + "values": { + "shape": "StringList" + } + } + }, + "NotLikeExpression": { + "type": "structure", + "required": ["columnName", "value"], + "members": { + "columnName": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "NotificationOutput": { + "type": "structure", + "required": [ + "identifier", + "domainIdentifier", + "type", + "topic", + "title", + "message", + "actionLink", + "creationTimestamp", + "lastUpdatedTimestamp" + ], + "members": { + "identifier": { + "shape": "TaskId" + }, + "domainIdentifier": { + "shape": "DomainId" + }, + "type": { + "shape": "NotificationType" + }, + "topic": { + "shape": "Topic" + }, + "title": { + "shape": "Title" + }, + "message": { + "shape": "Message" + }, + "status": { + "shape": "TaskStatus" + }, + "actionLink": { + "shape": "ActionLink" + }, + "creationTimestamp": { + "shape": "Timestamp" + }, + "lastUpdatedTimestamp": { + "shape": "Timestamp" + }, + "metadata": { + "shape": "MetadataMap" + }, + "messageKey": { + "shape": "String" + }, + "messageParameters": { + "shape": "MessageParametersMap" + } + } + }, + "NotificationResource": { + "type": "structure", + "required": ["type", "id"], + "members": { + "type": { + "shape": "NotificationResourceType" + }, + "id": { + "shape": "String" + }, + "name": { + "shape": "String" + } + } + }, + "NotificationResourceType": { + "type": "string", + "enum": ["PROJECT", "DOMAIN_UNIT"] + }, + "NotificationRole": { + "type": "string", + "enum": [ + "PROJECT_OWNER", + "PROJECT_CONTRIBUTOR", + "PROJECT_VIEWER", + "DOMAIN_OWNER", + "PROJECT_SUBSCRIBER", + "DOMAIN_UNIT_OWNER" + ] + }, + "NotificationSubjects": { + "type": "list", + "member": { + "shape": "String" + } + }, + "NotificationType": { + "type": "string", + "enum": ["TASK", "EVENT"] + }, + "NotificationsList": { + "type": "list", + "member": { + "shape": "NotificationOutput" + } + }, + "OAuth2": { + "type": "structure", + "members": { + "clientId": { + "shape": "String" + }, + "clientSecret": { + "shape": "String" + } + }, + "sensitive": true + }, + "OAuth2ClientApplication": { + "type": "structure", + "members": { + "userManagedClientApplicationClientId": { + "shape": "OAuth2ClientApplicationUserManagedClientApplicationClientIdString" + }, + "aWSManagedClientApplicationReference": { + "shape": "OAuth2ClientApplicationAWSManagedClientApplicationReferenceString" + } + } + }, + "OAuth2ClientApplicationAWSManagedClientApplicationReferenceString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "\\S+" + }, + "OAuth2ClientApplicationUserManagedClientApplicationClientIdString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "\\S+" + }, + "OAuth2Credentials": { + "type": "structure", + "required": ["clientId", "clientSecret"], + "members": { + "clientId": { + "shape": "String" + }, + "clientSecret": { + "shape": "String" + } + }, + "internalonly": true, + "sensitive": true + }, + "OAuth2GrantType": { + "type": "string", + "enum": ["AUTHORIZATION_CODE", "CLIENT_CREDENTIALS", "JWT_BEARER"] + }, + "OAuth2Properties": { + "type": "structure", + "members": { + "oAuth2GrantType": { + "shape": "OAuth2GrantType" + }, + "oAuth2ClientApplication": { + "shape": "OAuth2ClientApplication" + }, + "tokenUrl": { + "shape": "OAuth2PropertiesTokenUrlString" + }, + "tokenUrlParametersMap": { + "shape": "TokenUrlParametersMap" + }, + "authorizationCodeProperties": { + "shape": "AuthorizationCodeProperties" + }, + "oAuth2Credentials": { + "shape": "GlueOAuth2Credentials" + } + } + }, + "OAuth2PropertiesTokenUrlString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]" + }, + "OpenLineageRunEventSummary": { + "type": "structure", + "members": { + "eventType": { + "shape": "OpenLineageRunState" + }, + "runId": { + "shape": "String" + }, + "job": { + "shape": "NameIdentifier" + }, + "inputs": { + "shape": "NameIdentifiers" + }, + "outputs": { + "shape": "NameIdentifiers" + } + } + }, + "OpenLineageRunState": { + "type": "string", + "enum": ["START", "RUNNING", "COMPLETE", "ABORT", "FAIL", "OTHER"] + }, + "OverallDeploymentStatus": { + "type": "string", + "enum": ["PENDING_DEPLOYMENT", "IN_PROGRESS", "SUCCESSFUL", "FAILED_VALIDATION", "FAILED_DEPLOYMENT"] + }, + "OverrideDomainUnitOwnersPolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "OverrideProjectOwnersPolicyGrantDetail": { + "type": "structure", + "members": { + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "OwnerGroupProperties": { + "type": "structure", + "required": ["groupIdentifier"], + "members": { + "groupIdentifier": { + "shape": "GroupIdentifier" + } + } + }, + "OwnerGroupPropertiesOutput": { + "type": "structure", + "members": { + "groupId": { + "shape": "String" + } + } + }, + "OwnerProperties": { + "type": "structure", + "members": { + "user": { + "shape": "OwnerUserProperties" + }, + "group": { + "shape": "OwnerGroupProperties" + } + }, + "union": true + }, + "OwnerPropertiesOutput": { + "type": "structure", + "members": { + "user": { + "shape": "OwnerUserPropertiesOutput" + }, + "group": { + "shape": "OwnerGroupPropertiesOutput" + } + }, + "union": true + }, + "OwnerUserProperties": { + "type": "structure", + "required": ["userIdentifier"], + "members": { + "userIdentifier": { + "shape": "UserIdentifier" + } + } + }, + "OwnerUserPropertiesOutput": { + "type": "structure", + "members": { + "userId": { + "shape": "String" + } + } + }, + "PaginationToken": { + "type": "string", + "max": 8192, + "min": 1 + }, + "ParameterStorePath": { + "type": "string", + "max": 2048, + "min": 1 + }, + "PartnerId": { + "type": "string", + "enum": ["SAP"], + "internalonly": true + }, + "PartnerIntegrationId": { + "type": "string", + "internalonly": true, + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "PartnerIntegrationPropertiesInput": { + "type": "structure", + "members": { + "sapProperties": { + "shape": "SAPPropertiesInput" + } + }, + "internalonly": true, + "union": true + }, + "PartnerIntegrationPropertiesOutput": { + "type": "structure", + "members": { + "sapProperties": { + "shape": "SAPPropertiesOutput" + } + }, + "internalonly": true, + "union": true + }, + "PartnerIntegrationPropertiesPatch": { + "type": "structure", + "members": { + "sapProperties": { + "shape": "SAPPropertiesInput" + } + }, + "internalonly": true, + "union": true + }, + "PartnerIntegrationStatus": { + "type": "string", + "enum": ["CREATING", "UPDATING", "DELETING", "ACTIVE"], + "internalonly": true + }, + "PartnerIntegrationSummaries": { + "type": "list", + "member": { + "shape": "PartnerIntegrationSummary" + }, + "internalonly": true + }, + "PartnerIntegrationSummary": { + "type": "structure", + "required": ["id", "status", "partnerId", "name"], + "members": { + "id": { + "shape": "PartnerIntegrationId" + }, + "createdAt": { + "shape": "CreatedAtTimestamp" + }, + "updatedAt": { + "shape": "UpdatedAtTimestamp" + }, + "status": { + "shape": "PartnerIntegrationStatus" + }, + "partnerId": { + "shape": "PartnerId" + }, + "name": { + "shape": "Name" + } + }, + "internalonly": true + }, + "Password": { + "type": "string", + "max": 64, + "min": 0, + "pattern": "[\\S]*", + "sensitive": true + }, + "Permissions": { + "type": "structure", + "members": { + "s3": { + "shape": "S3Permissions" + } + }, + "union": true + }, + "PhysicalConnectionRequirements": { + "type": "structure", + "members": { + "subnetId": { + "shape": "SubnetId" + }, + "subnetIdList": { + "shape": "SubnetIdList" + }, + "securityGroupIdList": { + "shape": "SecurityGroupIdList" + }, + "availabilityZone": { + "shape": "PhysicalConnectionRequirementsAvailabilityZoneString" + } + } + }, + "PhysicalConnectionRequirementsAvailabilityZoneString": { + "type": "string", + "max": 255, + "min": 1 + }, + "PhysicalEndpoint": { + "type": "structure", + "members": { + "awsLocation": { + "shape": "AwsLocation" + }, + "glueConnectionName": { + "shape": "String" + }, + "glueConnection": { + "shape": "GlueConnection" + }, + "enableTrustedIdentityPropagation": { + "shape": "Boolean", + "internalonly": true + }, + "host": { + "shape": "String" + }, + "port": { + "shape": "Integer" + }, + "protocol": { + "shape": "Protocol" + }, + "stage": { + "shape": "String" + } + } + }, + "PhysicalEndpoints": { + "type": "list", + "member": { + "shape": "PhysicalEndpoint" + } + }, + "PolicyArn": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::(aws|\\d{12}):policy/[\\w+=,.@-]*" + }, + "PolicyContent": { + "type": "structure", + "members": { + "authorizationPolicy": { + "shape": "AuthorizationPolicy" + } + }, + "union": true + }, + "PolicyFilter": { + "type": "structure", + "members": { + "attribute": { + "shape": "String" + }, + "value": { + "shape": "String" + } + } + }, + "PolicyFilterClause": { + "type": "structure", + "members": { + "filter": { + "shape": "PolicyFilter" + }, + "and": { + "shape": "PolicyFilterList" + }, + "or": { + "shape": "PolicyFilterList" + } + }, + "union": true + }, + "PolicyFilterList": { + "type": "list", + "member": { + "shape": "PolicyFilterClause" + } + }, + "PolicyGrantDetail": { + "type": "structure", + "members": { + "createDomainUnit": { + "shape": "CreateDomainUnitPolicyGrantDetail" + }, + "overrideDomainUnitOwners": { + "shape": "OverrideDomainUnitOwnersPolicyGrantDetail" + }, + "addToProjectMemberPool": { + "shape": "AddToProjectMemberPoolPolicyGrantDetail" + }, + "overrideProjectOwners": { + "shape": "OverrideProjectOwnersPolicyGrantDetail" + }, + "createGlossary": { + "shape": "CreateGlossaryPolicyGrantDetail" + }, + "createFormType": { + "shape": "CreateFormTypePolicyGrantDetail" + }, + "createAssetType": { + "shape": "CreateAssetTypePolicyGrantDetail" + }, + "createProject": { + "shape": "CreateProjectPolicyGrantDetail" + }, + "createEnvironmentProfile": { + "shape": "CreateEnvironmentProfilePolicyGrantDetail" + }, + "delegateCreateEnvironmentProfile": { + "shape": "Unit" + }, + "createEnvironment": { + "shape": "Unit" + }, + "createEnvironmentFromBlueprint": { + "shape": "Unit" + }, + "createProjectFromProjectProfile": { + "shape": "CreateProjectFromProjectProfilePolicyGrantDetail" + }, + "useAssetType": { + "shape": "UseAssetTypePolicyGrantDetail" + }, + "attachGovernedGlossaryTerms": { + "shape": "AttachGovernedGlossaryTermsPolicyGrantDetail", + "internalonly": true + } + }, + "union": true + }, + "PolicyGrantList": { + "type": "list", + "member": { + "shape": "PolicyGrantMember" + } + }, + "PolicyGrantMember": { + "type": "structure", + "members": { + "principal": { + "shape": "PolicyGrantPrincipal" + }, + "detail": { + "shape": "PolicyGrantDetail" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "grantId": { + "shape": "GrantIdentifier" + } + } + }, + "PolicyGrantPrincipal": { + "type": "structure", + "members": { + "user": { + "shape": "UserPolicyGrantPrincipal" + }, + "group": { + "shape": "GroupPolicyGrantPrincipal" + }, + "project": { + "shape": "ProjectPolicyGrantPrincipal" + }, + "domainUnit": { + "shape": "DomainUnitPolicyGrantPrincipal" + } + }, + "union": true + }, + "PolicyId": { + "type": "string" + }, + "PolicySyncInput": { + "type": "structure", + "required": ["schedule"], + "members": { + "timezone": { + "shape": "Timezone" + }, + "schedule": { + "shape": "PolicySyncScheduleCronString" + } + } + }, + "PolicySyncOutput": { + "type": "structure", + "members": { + "policySyncId": { + "shape": "String" + }, + "timezone": { + "shape": "Timezone" + }, + "schedule": { + "shape": "PolicySyncScheduleCronString" + } + } + }, + "PolicySyncScheduleCronString": { + "type": "string", + "max": 256, + "min": 1, + "pattern": ".*cron\\((\\b[0-5]?[0-9]\\b) ([*]|\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\).*" + }, + "PolicyTarget": { + "type": "structure", + "members": { + "domainUnitIdentifier": { + "shape": "DomainUnitId" + }, + "environmentProfileIdentifier": { + "shape": "EnvironmentProfileId" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId" + } + }, + "union": true + }, + "PolicyType": { + "type": "string", + "enum": ["AUTHORIZATION_POLICY"] + }, + "PortalVersion": { + "type": "string", + "enum": ["DATAZONE", "SAGEMAKER_UNIFIED_STUDIO"] + }, + "PostLineageEventInput": { + "type": "structure", + "required": ["domainIdentifier", "event"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "event": { + "shape": "LineageEvent" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true, + "location": "header", + "locationName": "Client-Token" + } + }, + "payload": "event" + }, + "PostLineageEventOutput": { + "type": "structure", + "members": { + "id": { + "shape": "LineageEventIdentifier" + }, + "domainId": { + "shape": "DomainId" + } + } + }, + "PostTimeSeriesDataPointsInput": { + "type": "structure", + "required": ["domainIdentifier", "entityIdentifier", "entityType", "forms"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityIdentifier": { + "shape": "EntityIdentifier", + "location": "uri", + "locationName": "entityIdentifier" + }, + "entityType": { + "shape": "TimeSeriesEntityType", + "location": "uri", + "locationName": "entityType" + }, + "forms": { + "shape": "TimeSeriesDataPointFormInputList" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "PostTimeSeriesDataPointsOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "entityId": { + "shape": "EntityId" + }, + "entityType": { + "shape": "TimeSeriesEntityType" + }, + "forms": { + "shape": "TimeSeriesDataPointFormOutputList" + } + } + }, + "PredictionChoices": { + "type": "list", + "member": { + "shape": "Integer" + } + }, + "PredictionConfiguration": { + "type": "structure", + "members": { + "businessNameGeneration": { + "shape": "BusinessNameGenerationConfiguration" + } + } + }, + "PreferenceKey": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "[\\w \\.:/=+@-]+" + }, + "PreferenceValue": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\w \\.:/=+@-]*" + }, + "Preferences": { + "type": "map", + "key": { + "shape": "PreferenceKey" + }, + "value": { + "shape": "PreferenceValue" + }, + "max": 10, + "min": 0 + }, + "ProjectDeletionError": { + "type": "structure", + "members": { + "code": { + "shape": "String", + "documentation": "

Project Deletion Error Code

" + }, + "message": { + "shape": "String", + "documentation": "

Project Deletion Error Message

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

Error that occurred during project deletion

" + }, + "ProjectDesignation": { + "type": "string", + "enum": ["OWNER", "CONTRIBUTOR", "PROJECT_CATALOG_STEWARD"] + }, + "ProjectDesignator": { + "type": "string", + "deprecated": true, + "deprecatedMessage": "This structure will be removed going forward and will be replaced with projectDesignation enum.", + "enum": ["Owner", "Contributor", "ProjectCatalogSteward"], + "internalonly": true + }, + "ProjectFilter": { + "type": "structure", + "required": ["domainUnit"], + "members": { + "all": { + "shape": "Boolean" + }, + "domainUnit": { + "shape": "DomainUnitId" + }, + "includeChildDomainUnits": { + "shape": "Boolean", + "box": true + } + }, + "deprecated": true, + "deprecatedMessage": "This structure will be removed going forward and will be replaced with projectGrantFilter structure.", + "internalonly": true + }, + "ProjectGrantFilter": { + "type": "structure", + "members": { + "domainUnitFilter": { + "shape": "DomainUnitFilterForProject" + } + }, + "union": true + }, + "ProjectId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "ProjectIds": { + "type": "list", + "member": { + "shape": "ProjectId" + } + }, + "ProjectMember": { + "type": "structure", + "required": ["memberDetails", "designation", "type"], + "members": { + "memberDetails": { + "shape": "MemberDetails" + }, + "designation": { + "shape": "UserDesignation" + }, + "designationId": { + "shape": "DesignationId", + "internalonly": true + }, + "type": { + "shape": "ProjectMemberType", + "internalonly": true + } + } + }, + "ProjectMemberType": { + "type": "string", + "enum": ["USER", "GROUP"] + }, + "ProjectMembers": { + "type": "list", + "member": { + "shape": "ProjectMember" + } + }, + "ProjectMembershipEnforcementDetail": { + "type": "structure", + "required": ["designationIdentifier"], + "members": { + "designationIdentifier": { + "shape": "String" + }, + "minMembers": { + "shape": "Integer" + }, + "maxMembers": { + "shape": "Integer" + }, + "memberType": { + "shape": "MemberType" + } + }, + "internalonly": true + }, + "ProjectMembershipPolicyDetail": { + "type": "structure", + "members": { + "principal": { + "shape": "UserGroupPolicyPrincipal" + }, + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "ProjectMembershipPolicyDetails": { + "type": "list", + "member": { + "shape": "ProjectMembershipPolicyDetail" + } + }, + "ProjectMembershipRequestOutput": { + "type": "structure", + "required": [ + "domainId", + "projectId", + "requestId", + "requestedDesignation", + "reasonDescription", + "requesterId" + ], + "members": { + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "requestId": { + "shape": "RequestId" + }, + "requestedDesignation": { + "shape": "UserDesignation" + }, + "requestStatus": { + "shape": "RequestStatus" + }, + "reasonDescription": { + "shape": "ReasonDescription" + }, + "requesterId": { + "shape": "String" + }, + "lastUpdatedBy": { + "shape": "String" + }, + "requestedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "ProjectName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "ProjectOwner": { + "type": "structure", + "members": { + "userIdentifier": { + "shape": "String" + }, + "groupIdentifier": { + "shape": "String" + } + }, + "union": true + }, + "ProjectOwners": { + "type": "list", + "member": { + "shape": "ProjectOwner" + }, + "max": 1, + "min": 1 + }, + "ProjectPolicyGrantPrincipal": { + "type": "structure", + "members": { + "projectDesignator": { + "shape": "ProjectDesignator", + "deprecated": true, + "deprecatedMessage": "This field will be removed going forward and will be replaced with projectDesignation field.", + "internalonly": true + }, + "projectDesignation": { + "shape": "ProjectDesignation" + }, + "projectIdentifier": { + "shape": "ProjectId" + }, + "projectFilter": { + "shape": "ProjectFilter", + "deprecated": true, + "deprecatedMessage": "This field will be removed going forward and will be replaced with projectGrantFilter field.", + "internalonly": true + }, + "projectGrantFilter": { + "shape": "ProjectGrantFilter" + } + } + }, + "ProjectProfileId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "ProjectProfileList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "ProjectProfileName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "ProjectProfileSummaries": { + "type": "list", + "member": { + "shape": "ProjectProfileSummary" + } + }, + "ProjectProfileSummary": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectProfileId" + }, + "name": { + "shape": "ProjectProfileName" + }, + "description": { + "shape": "Description" + }, + "status": { + "shape": "Status" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "domainUnitId": { + "shape": "DomainUnitId" + } + } + }, + "ProjectProfileType": { + "type": "string", + "enum": [ + "DATA_ANALYTICS_ML_GEN_AI_MODEL_DEVELOPMENT", + "SQL_ANALYTICS", + "GEN_AI_APP_DEVELOPMENT", + "GEN_AI_MODEL_GOVERNANCE" + ] + }, + "ProjectProfileTypesList": { + "type": "list", + "member": { + "shape": "ProjectProfileType" + }, + "min": 1 + }, + "ProjectResourceTagParameters": { + "type": "list", + "member": { + "shape": "ResourceTagParameter" + }, + "max": 25, + "min": 0 + }, + "ProjectScope": { + "type": "structure", + "required": ["name"], + "members": { + "name": { + "shape": "ProjectScopeName" + }, + "policy": { + "shape": "String" + } + } + }, + "ProjectScopeName": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "ProjectScopesList": { + "type": "list", + "member": { + "shape": "ProjectScope" + } + }, + "ProjectStatus": { + "type": "string", + "enum": ["ACTIVE", "MOVING", "DELETING", "DELETE_FAILED", "UPDATING", "UPDATE_FAILED"] + }, + "ProjectSummaries": { + "type": "list", + "member": { + "shape": "ProjectSummary" + } + }, + "ProjectSummary": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectId" + }, + "name": { + "shape": "ProjectName" + }, + "description": { + "shape": "Description" + }, + "projectStatus": { + "shape": "ProjectStatus", + "documentation": "

Status of the project

" + }, + "failureReasons": { + "shape": "FailureReasons", + "documentation": "

Reasons for failed project deletion

" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "projectProfileId": { + "shape": "ProjectProfileId", + "internalonly": true + }, + "projectCategory": { + "shape": "String", + "internalonly": true + } + } + }, + "ProjectsForRule": { + "type": "structure", + "required": ["selectionMode"], + "members": { + "selectionMode": { + "shape": "RuleScopeSelectionMode" + }, + "specificProjects": { + "shape": "RuleProjectIdentifierList" + } + } + }, + "PropertyMap": { + "type": "map", + "key": { + "shape": "PropertyMapKeyString" + }, + "value": { + "shape": "PropertyMapValueString" + } + }, + "PropertyMapKeyString": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" + }, + "PropertyMapValueString": { + "type": "string", + "max": 2048, + "min": 1, + "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" + }, + "Protocol": { + "type": "string", + "enum": ["ATHENA", "GIT", "GLUE_INTERACTIVE_SESSION", "HTTPS", "JDBC", "LIVY", "ODBC", "PRISM"] + }, + "ProvisionDomainInput": { + "type": "structure", + "required": ["domainIdentifier", "provisioningRoleArn", "enabledRegions"], + "members": { + "domainIdentifier": { + "shape": "DomainId" + }, + "projectName": { + "shape": "ProjectName" + }, + "projectDescription": { + "shape": "Description" + }, + "provisioningRoleArn": { + "shape": "AdminApiRoleArn" + }, + "manageAccessRoleArn": { + "shape": "RoleArn" + }, + "glueManageAccessRoleArn": { + "shape": "RoleArn" + }, + "redshiftManageAccessRoleArn": { + "shape": "RoleArn" + }, + "enabledRegions": { + "shape": "EnabledRegionList" + }, + "regionalParameters": { + "shape": "RegionalParameterMap" + }, + "projectProfileTypes": { + "shape": "ProjectProfileTypesList" + }, + "generativeAIGovernance": { + "shape": "GenAIGovernance" + } + } + }, + "ProvisionDomainOutput": { + "type": "structure", + "members": { + "result": { + "shape": "ProvisioningResult" + }, + "message": { + "shape": "String" + } + } + }, + "ProvisionStatus": { + "type": "string", + "enum": [ + "PROVISIONING", + "PROVISIONING_PROJECT_PROFILES", + "PROVISIONING_MODEL_ASSETS", + "PROVISION_FAILED", + "PROVISION_COMPLETE" + ] + }, + "ProvisionedResources": { + "type": "structure", + "members": { + "glueConnection": { + "shape": "ProvisionedResourcesMapping" + }, + "athenaFederatedLambda": { + "shape": "ProvisionedResourcesMapping" + }, + "lakeFormationResource": { + "shape": "ProvisionedResourcesMapping" + }, + "glueDataCatalog": { + "shape": "ProvisionedResourcesMapping" + }, + "lakeFormationPermissions": { + "shape": "ProvisionedResourcesMapping" + } + } + }, + "ProvisionedResourcesMapping": { + "type": "structure", + "required": ["status"], + "members": { + "status": { + "shape": "ConnectionStatus" + }, + "errorMessage": { + "shape": "String" + }, + "resourceArn": { + "shape": "String" + } + } + }, + "ProvisioningConfiguration": { + "type": "structure", + "members": { + "lakeFormationConfiguration": { + "shape": "LakeFormationConfiguration" + } + }, + "union": true + }, + "ProvisioningConfigurationList": { + "type": "list", + "member": { + "shape": "ProvisioningConfiguration" + } + }, + "ProvisioningMode": { + "type": "string", + "enum": ["GLUE_CONNECTION", "GLUE_CONNECTION_WITH_CATALOG"] + }, + "ProvisioningPolicy": { + "type": "string" + }, + "ProvisioningProperties": { + "type": "structure", + "members": { + "cloudFormation": { + "shape": "CloudFormationProperties" + }, + "eventBridge": { + "shape": "EventBridgeProperties", + "internalonly": true + }, + "manual": { + "shape": "ManualProperties", + "internalonly": true + }, + "custom": { + "shape": "CustomResourceProperties", + "internalonly": true + } + }, + "union": true + }, + "ProvisioningResult": { + "type": "string", + "enum": ["SUCCESS", "PARTIAL_FAILURE", "FAILURE", "PROVISIONING"] + }, + "PutAttributeEntries": { + "type": "list", + "member": { + "shape": "PutAttributeInput" + }, + "internalonly": true, + "max": 5, + "min": 0 + }, + "PutAttributeInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "attributeIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId" + }, + "entityType": { + "shape": "AttributeEntityType" + }, + "entityIdentifier": { + "shape": "EntityId" + }, + "attributeIdentifier": { + "shape": "AttributeIdentifier" + }, + "readMe": { + "shape": "PutAttributeInputReadMeString" + }, + "forms": { + "shape": "FormInputList" + }, + "clientToken": { + "shape": "ClientToken" + } + }, + "internalonly": true + }, + "PutAttributeInputReadMeString": { + "type": "string", + "max": 5000, + "min": 0 + }, + "PutAttributeOutput": { + "type": "structure", + "required": ["attributeIdentifier", "revision"], + "members": { + "attributeIdentifier": { + "shape": "AttributeIdentifier" + }, + "revision": { + "shape": "Revision" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + } + }, + "internalonly": true + }, + "PutDomainSharingPolicyInput": { + "type": "structure", + "required": ["domainArn", "policy"], + "members": { + "domainArn": { + "shape": "DomainArn", + "location": "uri", + "locationName": "domainArn" + }, + "policy": { + "shape": "String" + } + } + }, + "PutDomainSharingPolicyOutput": { + "type": "structure", + "members": { + "domainArn": { + "shape": "DomainArn" + }, + "policy": { + "shape": "String" + } + } + }, + "PutEnvironmentBlueprintConfigurationInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentBlueprintIdentifier", "enabledRegions"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentBlueprintIdentifier": { + "shape": "EnvironmentBlueprintId", + "location": "uri", + "locationName": "environmentBlueprintIdentifier" + }, + "provisioningRoleArn": { + "shape": "RoleArn" + }, + "manageAccessRoleArn": { + "shape": "RoleArn" + }, + "environmentRolePermissionBoundary": { + "shape": "PolicyArn" + }, + "enabledRegions": { + "shape": "EnabledRegionList" + }, + "regionalParameters": { + "shape": "RegionalParameterMap" + }, + "resourceConfigurations": { + "shape": "PutResourceConfigurations" + }, + "allowUserProvidedConfigurations": { + "shape": "Boolean" + }, + "lakeFormationConfiguration": { + "shape": "LakeFormationConfiguration", + "internalonly": true + }, + "globalParameters": { + "shape": "GlobalParameterMap" + }, + "allowS3LocationRegistration": { + "shape": "Boolean" + }, + "provisioningConfigurations": { + "shape": "ProvisioningConfigurationList" + } + } + }, + "PutEnvironmentBlueprintConfigurationOutput": { + "type": "structure", + "required": ["domainId", "environmentBlueprintId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "provisioningRoleArn": { + "shape": "RoleArn" + }, + "environmentRolePermissionBoundary": { + "shape": "PolicyArn" + }, + "manageAccessRoleArn": { + "shape": "RoleArn" + }, + "enabledRegions": { + "shape": "EnabledRegionList" + }, + "regionalParameters": { + "shape": "RegionalParameterMap" + }, + "allowUserProvidedConfigurations": { + "shape": "Boolean" + }, + "allowS3LocationRegistration": { + "shape": "Boolean", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "resourceConfigurations": { + "shape": "ResourceConfigurations" + }, + "lakeFormationConfiguration": { + "shape": "LakeFormationConfiguration", + "internalonly": true + }, + "globalParameters": { + "shape": "GlobalParameterMap", + "internalonly": true + }, + "provisioningConfigurations": { + "shape": "ProvisioningConfigurationList" + } + } + }, + "PutLinkedTypeItem": { + "type": "structure", + "required": ["itemIdentifier", "itemType"], + "members": { + "itemIdentifier": { + "shape": "String" + }, + "itemType": { + "shape": "LinkedTypeItemType" + }, + "name": { + "shape": "String" + }, + "arn": { + "shape": "String" + }, + "configuration": { + "shape": "ConfigurationMap" + }, + "authorizedPrincipals": { + "shape": "LinkedTypeAuthorizedPrincipals" + }, + "connectedEntities": { + "shape": "ConnectedEntities" + } + } + }, + "PutResourceConfiguration": { + "type": "structure", + "required": ["name", "region", "parameters"], + "members": { + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "region": { + "shape": "RegionName" + }, + "parameters": { + "shape": "ResourceConfigurationParameterMap" + } + } + }, + "PutResourceConfigurations": { + "type": "list", + "member": { + "shape": "PutResourceConfiguration" + }, + "max": 10, + "min": 0 + }, + "RAMInternalId": { + "type": "string", + "max": 64, + "min": 2 + }, + "RAMInternalIdMismatchException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "String" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "RAMInvalidParameterException": { + "type": "structure", + "members": { + "message": { + "shape": "String" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "RAMInvalidSequenceNumberException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "String" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "RAMPolicy": { + "type": "string" + }, + "RAMResource": { + "type": "structure", + "members": { + "resourceArn": { + "shape": "RAMResourceARN" + }, + "internalId": { + "shape": "RAMInternalId" + } + } + }, + "RAMResourceARN": { + "type": "string", + "max": 255, + "min": 1 + }, + "RAMResourceList": { + "type": "list", + "member": { + "shape": "RAMResource" + } + }, + "RAMResourceNotFoundException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "String" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "RAMResourceNotSharedException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "String" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "RAMSequenceNumber": { + "type": "integer", + "box": true, + "min": 0 + }, + "RAMSharingAction": { + "type": "string", + "enum": ["SHARE", "UNSHARE"] + }, + "RAMSharingResult": { + "type": "string", + "enum": ["SUCCESS", "FAILED"] + }, + "RAMValidationResult": { + "type": "string", + "enum": ["VALID", "RESOURCE_NOT_FOUND", "RESOURCE_CANNOT_BE_SHARED"] + }, + "RAMVersionedSharedResource": { + "type": "structure", + "required": ["sequenceNumber", "resource"], + "members": { + "sequenceNumber": { + "shape": "RAMSequenceNumber" + }, + "resource": { + "shape": "RAMResourceARN" + }, + "internalId": { + "shape": "RAMInternalId" + } + } + }, + "RAMVersionedSharedResourceList": { + "type": "list", + "member": { + "shape": "RAMVersionedSharedResource" + } + }, + "ReasonDescription": { + "type": "string", + "max": 250, + "min": 1 + }, + "RecommendationConfiguration": { + "type": "structure", + "members": { + "enableBusinessNameGeneration": { + "shape": "Boolean" + } + } + }, + "RedeemAccessTokenRequest": { + "type": "structure", + "required": ["domainId", "accessToken"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "accessToken": { + "shape": "String" + } + } + }, + "RedeemAccessTokenResponse": { + "type": "structure", + "members": { + "credentials": { + "shape": "AwsCredentials" + } + } + }, + "RedshiftClusterStorage": { + "type": "structure", + "required": ["clusterName"], + "members": { + "clusterName": { + "shape": "RedshiftClusterStorageClusterNameString" + } + } + }, + "RedshiftClusterStorageClusterNameString": { + "type": "string", + "max": 63, + "min": 1, + "pattern": "[0-9a-z].[a-z0-9\\-]*" + }, + "RedshiftCredentialConfiguration": { + "type": "structure", + "required": ["secretManagerArn"], + "members": { + "secretManagerArn": { + "shape": "RedshiftCredentialConfigurationSecretManagerArnString" + } + } + }, + "RedshiftCredentialConfigurationSecretManagerArnString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "arn:aws[^:]*:secretsmanager:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:secret:.*" + }, + "RedshiftCredentials": { + "type": "structure", + "members": { + "secretArn": { + "shape": "RedshiftCredentialsSecretArnString" + }, + "usernamePassword": { + "shape": "UsernamePassword" + } + }, + "sensitive": true, + "union": true + }, + "RedshiftCredentialsSecretArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws[^:]*:secretsmanager:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:secret:.*" + }, + "RedshiftLineageSyncConfigurationInput": { + "type": "structure", + "members": { + "enabled": { + "shape": "Boolean" + }, + "schedule": { + "shape": "LineageSyncSchedule" + } + } + }, + "RedshiftLineageSyncConfigurationOutput": { + "type": "structure", + "members": { + "lineageJobId": { + "shape": "String" + }, + "enabled": { + "shape": "Boolean" + }, + "schedule": { + "shape": "LineageSyncSchedule" + } + } + }, + "RedshiftPropertiesInput": { + "type": "structure", + "members": { + "storage": { + "shape": "RedshiftStorageProperties" + }, + "databaseName": { + "shape": "RedshiftPropertiesInputDatabaseNameString" + }, + "host": { + "shape": "RedshiftPropertiesInputHostString" + }, + "port": { + "shape": "RedshiftPropertiesInputPortInteger" + }, + "credentials": { + "shape": "RedshiftCredentials" + }, + "lineageSync": { + "shape": "RedshiftLineageSyncConfigurationInput" + }, + "provisioningMode": { + "shape": "ProvisioningMode", + "internalonly": true + }, + "connectivityProperties": { + "shape": "ConnectivityProperties", + "internalonly": true + } + } + }, + "RedshiftPropertiesInputDatabaseNameString": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[a-z0-9_-]+" + }, + "RedshiftPropertiesInputHostString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "RedshiftPropertiesInputPortInteger": { + "type": "integer", + "box": true, + "max": 65535, + "min": 0 + }, + "RedshiftPropertiesOutput": { + "type": "structure", + "members": { + "storage": { + "shape": "RedshiftStorageProperties" + }, + "credentials": { + "shape": "RedshiftCredentials" + }, + "isProvisionedSecret": { + "shape": "Boolean" + }, + "jdbcIamUrl": { + "shape": "String" + }, + "jdbcUrl": { + "shape": "String" + }, + "redshiftTempDir": { + "shape": "String" + }, + "lineageSync": { + "shape": "RedshiftLineageSyncConfigurationOutput" + }, + "status": { + "shape": "ConnectionStatus" + }, + "databaseName": { + "shape": "String" + }, + "provisioningMode": { + "shape": "ProvisioningMode", + "internalonly": true + }, + "provisionedResources": { + "shape": "ProvisionedResources" + } + } + }, + "RedshiftPropertiesPatch": { + "type": "structure", + "members": { + "storage": { + "shape": "RedshiftStorageProperties" + }, + "databaseName": { + "shape": "RedshiftPropertiesPatchDatabaseNameString" + }, + "host": { + "shape": "RedshiftPropertiesPatchHostString" + }, + "port": { + "shape": "RedshiftPropertiesPatchPortInteger" + }, + "credentials": { + "shape": "RedshiftCredentials" + }, + "lineageSync": { + "shape": "RedshiftLineageSyncConfigurationInput" + }, + "provisioningMode": { + "shape": "ProvisioningMode", + "internalonly": true + }, + "connectivityPropertiesPatch": { + "shape": "ConnectivityPropertiesPatch", + "internalonly": true + } + } + }, + "RedshiftPropertiesPatchDatabaseNameString": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[a-z0-9_-]+" + }, + "RedshiftPropertiesPatchHostString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "RedshiftPropertiesPatchPortInteger": { + "type": "integer", + "box": true, + "max": 65535, + "min": 0 + }, + "RedshiftRunConfigurationInput": { + "type": "structure", + "required": ["relationalFilterConfigurations"], + "members": { + "dataAccessRole": { + "shape": "RedshiftRunConfigurationInputDataAccessRoleString" + }, + "relationalFilterConfigurations": { + "shape": "RelationalFilterConfigurations" + }, + "selfGrantSetting": { + "shape": "SelfGrantSetting" + }, + "redshiftCredentialConfiguration": { + "shape": "RedshiftCredentialConfiguration" + }, + "redshiftStorage": { + "shape": "RedshiftStorage" + } + } + }, + "RedshiftRunConfigurationInputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "RedshiftRunConfigurationOutput": { + "type": "structure", + "required": ["relationalFilterConfigurations", "redshiftStorage"], + "members": { + "accountId": { + "shape": "RedshiftRunConfigurationOutputAccountIdString" + }, + "region": { + "shape": "RedshiftRunConfigurationOutputRegionString" + }, + "dataAccessRole": { + "shape": "RedshiftRunConfigurationOutputDataAccessRoleString" + }, + "relationalFilterConfigurations": { + "shape": "RelationalFilterConfigurations" + }, + "selfGrantSetting": { + "shape": "SelfGrantSetting" + }, + "redshiftCredentialConfiguration": { + "shape": "RedshiftCredentialConfiguration" + }, + "redshiftStorage": { + "shape": "RedshiftStorage" + } + } + }, + "RedshiftRunConfigurationOutputAccountIdString": { + "type": "string", + "max": 12, + "min": 12, + "pattern": "\\d{12}" + }, + "RedshiftRunConfigurationOutputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "RedshiftRunConfigurationOutputRegionString": { + "type": "string", + "max": 16, + "min": 4, + "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" + }, + "RedshiftSelfGrantStatusOutput": { + "type": "structure", + "required": ["selfGrantStatusDetails"], + "members": { + "selfGrantStatusDetails": { + "shape": "SelfGrantStatusDetails" + } + } + }, + "RedshiftServerlessStorage": { + "type": "structure", + "required": ["workgroupName"], + "members": { + "workgroupName": { + "shape": "RedshiftServerlessStorageWorkgroupNameString" + } + } + }, + "RedshiftServerlessStorageWorkgroupNameString": { + "type": "string", + "max": 64, + "min": 3, + "pattern": "[a-z0-9-]+" + }, + "RedshiftStorage": { + "type": "structure", + "members": { + "redshiftClusterSource": { + "shape": "RedshiftClusterStorage" + }, + "redshiftServerlessSource": { + "shape": "RedshiftServerlessStorage" + } + }, + "union": true + }, + "RedshiftStorageProperties": { + "type": "structure", + "members": { + "clusterName": { + "shape": "RedshiftStoragePropertiesClusterNameString" + }, + "workgroupName": { + "shape": "RedshiftStoragePropertiesWorkgroupNameString" + } + }, + "union": true + }, + "RedshiftStoragePropertiesClusterNameString": { + "type": "string", + "max": 63, + "min": 0, + "pattern": "[a-z0-9-]+" + }, + "RedshiftStoragePropertiesWorkgroupNameString": { + "type": "string", + "max": 64, + "min": 3, + "pattern": "[a-z0-9-]+" + }, + "RefreshTokenRequest": { + "type": "structure", + "required": ["domainId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "authCode": { + "shape": "String" + }, + "jwtToken": { + "shape": "String", + "location": "header", + "locationName": "jwt-token" + }, + "csrfToken": { + "shape": "String", + "location": "header", + "locationName": "x-csrf-token" + } + } + }, + "RefreshTokenResponse": { + "type": "structure", + "members": { + "cookieStrings": { + "shape": "SetCookies", + "location": "header", + "locationName": "Set-Cookie" + }, + "CacheControl": { + "shape": "String", + "location": "header", + "locationName": "Cache-Control" + }, + "jwtToken": { + "shape": "String" + }, + "csrfToken": { + "shape": "String" + }, + "userProfile": { + "shape": "UserProfile" + }, + "iamCreds": { + "shape": "IamCredential" + }, + "identityEnhancedIamCreds": { + "shape": "IamCredential" + }, + "accessToken": { + "shape": "String" + } + } + }, + "Region": { + "type": "structure", + "members": { + "regionName": { + "shape": "RegionName" + }, + "regionNamePath": { + "shape": "ParameterStorePath" + } + }, + "union": true + }, + "RegionName": { + "type": "string", + "max": 16, + "min": 4, + "pattern": "[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]" + }, + "RegionalParameter": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "RegionalParameterMap": { + "type": "map", + "key": { + "shape": "RegionName" + }, + "value": { + "shape": "RegionalParameter" + } + }, + "RejectChoice": { + "type": "structure", + "required": ["predictionTarget"], + "members": { + "predictionTarget": { + "shape": "String" + }, + "predictionChoices": { + "shape": "PredictionChoices" + } + } + }, + "RejectChoices": { + "type": "list", + "member": { + "shape": "RejectChoice" + } + }, + "RejectPredictionsInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AssetIdentifier", + "location": "uri", + "locationName": "identifier" + }, + "revision": { + "shape": "Revision", + "location": "querystring", + "locationName": "revision" + }, + "rejectRule": { + "shape": "RejectRule" + }, + "rejectChoices": { + "shape": "RejectChoices" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "RejectPredictionsOutput": { + "type": "structure", + "required": ["domainId", "assetId", "assetRevision"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "assetId": { + "shape": "AssetId" + }, + "assetRevision": { + "shape": "Revision" + } + } + }, + "RejectRule": { + "type": "structure", + "members": { + "rule": { + "shape": "RejectRuleBehavior" + }, + "threshold": { + "shape": "Float" + } + } + }, + "RejectRuleBehavior": { + "type": "string", + "enum": ["ALL", "NONE"] + }, + "RejectSubscriptionRequestInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionRequestId", + "location": "uri", + "locationName": "identifier" + }, + "decisionComment": { + "shape": "DecisionComment" + } + } + }, + "RejectSubscriptionRequestOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "requestReason", + "subscribedPrincipals", + "subscribedListings" + ], + "members": { + "id": { + "shape": "SubscriptionRequestId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionRequestStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "requestReason": { + "shape": "RequestReason" + }, + "subscribedPrincipals": { + "shape": "RejectSubscriptionRequestOutputSubscribedPrincipalsList" + }, + "subscribedListings": { + "shape": "RejectSubscriptionRequestOutputSubscribedListingsList" + }, + "reviewerId": { + "shape": "String" + }, + "decisionComment": { + "shape": "DecisionComment" + }, + "existingSubscriptionId": { + "shape": "SubscriptionId" + }, + "metadataForms": { + "shape": "MetadataForms" + } + } + }, + "RejectSubscriptionRequestOutputSubscribedListingsList": { + "type": "list", + "member": { + "shape": "SubscribedListing" + }, + "max": 1, + "min": 1 + }, + "RejectSubscriptionRequestOutputSubscribedPrincipalsList": { + "type": "list", + "member": { + "shape": "SubscribedPrincipal" + }, + "max": 1, + "min": 1 + }, + "RelationalFilterConfiguration": { + "type": "structure", + "required": ["databaseName"], + "members": { + "databaseName": { + "shape": "RelationalFilterConfigurationDatabaseNameString" + }, + "schemaName": { + "shape": "RelationalFilterConfigurationSchemaNameString" + }, + "filterExpressions": { + "shape": "FilterExpressions" + } + } + }, + "RelationalFilterConfigurationDatabaseNameString": { + "type": "string", + "max": 128, + "min": 1 + }, + "RelationalFilterConfigurationSchemaNameString": { + "type": "string", + "max": 128, + "min": 1 + }, + "RelationalFilterConfigurations": { + "type": "list", + "member": { + "shape": "RelationalFilterConfiguration" + } + }, + "RemoveEntityOwnerInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "owner"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "DataZoneEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "String", + "location": "uri", + "locationName": "entityIdentifier" + }, + "owner": { + "shape": "OwnerProperties" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "RemoveEntityOwnerOutput": { + "type": "structure", + "members": {} + }, + "RemovePolicyGrantInput": { + "type": "structure", + "required": ["domainIdentifier", "entityType", "entityIdentifier", "policyType", "principal"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "entityType": { + "shape": "TargetEntityType", + "location": "uri", + "locationName": "entityType" + }, + "entityIdentifier": { + "shape": "String", + "location": "uri", + "locationName": "entityIdentifier" + }, + "policyType": { + "shape": "ManagedPolicyType" + }, + "principal": { + "shape": "PolicyGrantPrincipal" + }, + "grantIdentifier": { + "shape": "GrantIdentifier" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "RemovePolicyGrantOutput": { + "type": "structure", + "members": {} + }, + "RenderingConfig": { + "type": "structure", + "members": { + "collapse": { + "shape": "Boolean" + } + }, + "internalonly": true + }, + "RepositoryType": { + "type": "string", + "enum": ["CODE_COMMIT", "CODE_STAR"] + }, + "RequestId": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[a-zA-Z0-9-_]+" + }, + "RequestReason": { + "type": "string", + "max": 4096, + "min": 0, + "sensitive": true + }, + "RequestStatus": { + "type": "string", + "enum": ["ACCEPTED", "REJECTED", "CANCELED", "PENDING"] + }, + "RequiredMetadataFormList": { + "type": "list", + "member": { + "shape": "MetadataFormReference" + }, + "max": 5, + "min": 1 + }, + "Rerank": { + "type": "structure", + "members": { + "rerankers": { + "shape": "Rerankers" + }, + "maxRerank": { + "shape": "Integer" + } + } + }, + "Reranker": { + "type": "structure", + "members": { + "ngram": { + "shape": "NgramReranker" + }, + "fieldValueFactor": { + "shape": "FieldValueFactorReranker" + } + }, + "union": true + }, + "Rerankers": { + "type": "list", + "member": { + "shape": "Reranker" + } + }, + "ResolutionStrategy": { + "type": "string", + "enum": ["MANUAL"] + }, + "Resource": { + "type": "structure", + "required": ["value", "type"], + "members": { + "provider": { + "shape": "String" + }, + "name": { + "shape": "String" + }, + "value": { + "shape": "String" + }, + "type": { + "shape": "String" + } + } + }, + "ResourceConfiguration": { + "type": "structure", + "required": ["identifier", "name", "region", "parameters"], + "members": { + "identifier": { + "shape": "String" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "lineageJobId": { + "shape": "String", + "internalonly": true + }, + "region": { + "shape": "RegionName" + }, + "parameters": { + "shape": "ResourceConfigurationParameterMap" + } + } + }, + "ResourceConfigurationId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{0,36}" + }, + "ResourceConfigurationParameterMap": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "ResourceConfigurations": { + "type": "list", + "member": { + "shape": "ResourceConfiguration" + }, + "max": 10, + "min": 0 + }, + "ResourceList": { + "type": "list", + "member": { + "shape": "Resource" + } + }, + "ResourceNotFoundException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 404, + "senderFault": true + }, + "exception": true + }, + "ResourcePath": { + "type": "string", + "internalonly": true, + "max": 1024, + "min": 1 + }, + "ResourcePaths": { + "type": "list", + "member": { + "shape": "ResourcePath" + }, + "max": 100, + "min": 1 + }, + "ResourcePolicyNotFoundException": { + "type": "structure", + "members": { + "message": { + "shape": "String" + } + }, + "error": { + "httpStatusCode": 500 + }, + "exception": true, + "fault": true + }, + "ResourceStatus": { + "type": "string", + "enum": ["SHARED", "DELEGATED", "REMOVED"] + }, + "ResourceTag": { + "type": "structure", + "required": ["key", "value", "source"], + "members": { + "key": { + "shape": "TagKey" + }, + "value": { + "shape": "TagValue" + }, + "source": { + "shape": "ResourceTagSource" + } + } + }, + "ResourceTagParameter": { + "type": "structure", + "required": ["key", "value", "isValueEditable"], + "members": { + "key": { + "shape": "TagKey" + }, + "value": { + "shape": "TagValue" + }, + "isValueEditable": { + "shape": "Boolean" + } + } + }, + "ResourceTagSource": { + "type": "string", + "enum": ["PROJECT", "PROJECT_PROFILE"] + }, + "ResourceTags": { + "type": "list", + "member": { + "shape": "ResourceTag" + }, + "max": 25, + "min": 0 + }, + "ResourceType": { + "type": "string", + "max": 256, + "min": 1 + }, + "Revision": { + "type": "string", + "max": 64, + "min": 1 + }, + "RevisionInput": { + "type": "string", + "max": 64, + "min": 1, + "pattern": "[a-zA-Z0-9_-]+" + }, + "RevokeSubscriptionInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionId", + "location": "uri", + "locationName": "identifier" + }, + "retainPermissions": { + "shape": "Boolean" + } + } + }, + "RevokeSubscriptionOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "subscribedPrincipal", + "subscribedListing" + ], + "members": { + "id": { + "shape": "SubscriptionId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "subscribedPrincipal": { + "shape": "SubscribedPrincipal" + }, + "subscribedListing": { + "shape": "SubscribedListing" + }, + "subscriptionRequestId": { + "shape": "SubscriptionRequestId" + }, + "retainPermissions": { + "shape": "Boolean" + }, + "pushedSubscription": { + "shape": "Boolean" + }, + "expirationTimestamp": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "RoleArn": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" + }, + "RoleTag": { + "type": "string", + "max": 36, + "min": 1, + "pattern": "[a-zA-Z0-9_-]+" + }, + "RowFilter": { + "type": "structure", + "members": { + "expression": { + "shape": "RowFilterExpression" + }, + "and": { + "shape": "RowFilterList" + }, + "or": { + "shape": "RowFilterList" + } + }, + "union": true + }, + "RowFilterConfiguration": { + "type": "structure", + "required": ["rowFilter"], + "members": { + "rowFilter": { + "shape": "RowFilter" + }, + "sensitive": { + "shape": "Boolean" + } + } + }, + "RowFilterExpression": { + "type": "structure", + "members": { + "equalTo": { + "shape": "EqualToExpression" + }, + "notEqualTo": { + "shape": "NotEqualToExpression" + }, + "greaterThan": { + "shape": "GreaterThanExpression" + }, + "lessThan": { + "shape": "LessThanExpression" + }, + "greaterThanOrEqualTo": { + "shape": "GreaterThanOrEqualToExpression" + }, + "lessThanOrEqualTo": { + "shape": "LessThanOrEqualToExpression" + }, + "isNull": { + "shape": "IsNullExpression" + }, + "isNotNull": { + "shape": "IsNotNullExpression" + }, + "in": { + "shape": "InExpression" + }, + "notIn": { + "shape": "NotInExpression" + }, + "like": { + "shape": "LikeExpression" + }, + "notLike": { + "shape": "NotLikeExpression" + } + }, + "union": true + }, + "RowFilterList": { + "type": "list", + "member": { + "shape": "RowFilter" + } + }, + "RuleAction": { + "type": "string", + "enum": [ + "CREATE_LISTING_CHANGE_SET", + "CREATE_PROJECT", + "CREATE_SUBSCRIPTION_REQUEST", + "PROJECT_MEMBERSHIP_UPDATES" + ] + }, + "RuleAssetTypeList": { + "type": "list", + "member": { + "shape": "AssetTypeIdentifier" + }, + "min": 1 + }, + "RuleDetail": { + "type": "structure", + "members": { + "metadataFormEnforcementDetail": { + "shape": "MetadataFormEnforcementDetail" + }, + "projectMembershipEnforcementDetail": { + "shape": "ProjectMembershipEnforcementDetail", + "internalonly": true + }, + "glossaryTermEnforcementDetail": { + "shape": "GlossaryTermEnforcementDetail", + "internalonly": true + } + }, + "union": true + }, + "RuleId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "RuleName": { + "type": "string", + "max": 256, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "RuleProjectIdentifierList": { + "type": "list", + "member": { + "shape": "ProjectId" + }, + "min": 1 + }, + "RuleScope": { + "type": "structure", + "members": { + "assetType": { + "shape": "AssetTypesForRule" + }, + "dataProduct": { + "shape": "Boolean" + }, + "project": { + "shape": "ProjectsForRule" + } + } + }, + "RuleScopeSelectionMode": { + "type": "string", + "enum": ["ALL", "SPECIFIC"] + }, + "RuleSearchSummaries": { + "type": "list", + "member": { + "shape": "RuleSearchSummary" + } + }, + "RuleSearchSummary": { + "type": "structure", + "members": { + "identifier": { + "shape": "RuleId" + }, + "detail": { + "shape": "RuleDetail" + } + } + }, + "RuleSummaries": { + "type": "list", + "member": { + "shape": "RuleSummary" + } + }, + "RuleSummary": { + "type": "structure", + "members": { + "identifier": { + "shape": "RuleId" + }, + "revision": { + "shape": "Revision" + }, + "ruleType": { + "shape": "RuleType" + }, + "name": { + "shape": "RuleName" + }, + "targetType": { + "shape": "RuleTargetType" + }, + "target": { + "shape": "RuleTarget" + }, + "action": { + "shape": "RuleAction" + }, + "scope": { + "shape": "RuleScope" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "lastUpdatedBy": { + "shape": "UpdatedBy" + } + } + }, + "RuleTarget": { + "type": "structure", + "members": { + "domainUnitTarget": { + "shape": "DomainUnitTarget" + } + }, + "union": true + }, + "RuleTargetType": { + "type": "string", + "enum": ["DOMAIN_UNIT"] + }, + "RuleType": { + "type": "string", + "enum": ["METADATA_FORM_ENFORCEMENT", "MEMBERSHIP_ENFORCEMENT", "GLOSSARY_TERM_ENFORCEMENT"] + }, + "RunIdentifier": { + "type": "string", + "internalonly": true, + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "RunStatisticsForAssets": { + "type": "structure", + "members": { + "added": { + "shape": "Integer" + }, + "updated": { + "shape": "Integer" + }, + "unchanged": { + "shape": "Integer" + }, + "skipped": { + "shape": "Integer" + }, + "failed": { + "shape": "Integer" + } + } + }, + "S3AccessGrantLocationId": { + "type": "string", + "max": 64, + "min": 0, + "pattern": ".*[a-zA-Z0-9\\-]+.*" + }, + "S3AccessGrantLocationRegistrationResult": { + "type": "structure", + "required": ["status"], + "members": { + "status": { + "shape": "S3AccessGrantLocationRegistrationStatus" + }, + "errorMessage": { + "shape": "String" + } + } + }, + "S3AccessGrantLocationRegistrationStatus": { + "type": "string", + "enum": ["SUCCESS", "FAILED", "SKIPPED", "NOT_APPLICABLE"] + }, + "S3FolderPropertiesInput": { + "type": "structure", + "required": ["s3Uri"], + "members": { + "s3Uri": { + "shape": "S3Uri" + } + } + }, + "S3FolderPropertiesOutput": { + "type": "structure", + "required": ["s3Uri"], + "members": { + "s3Uri": { + "shape": "S3Uri" + } + } + }, + "S3FolderPropertiesPatch": { + "type": "structure", + "required": ["s3Uri"], + "members": { + "s3Uri": { + "shape": "S3Uri" + } + } + }, + "S3Location": { + "type": "string", + "max": 1024, + "min": 1, + "pattern": "s3://.+" + }, + "S3LocationList": { + "type": "list", + "member": { + "shape": "S3Location" + }, + "max": 20, + "min": 0 + }, + "S3Permission": { + "type": "string", + "enum": ["READ", "WRITE"] + }, + "S3Permissions": { + "type": "list", + "member": { + "shape": "S3Permission" + }, + "documentation": "

S3 permissions as a simple enum list.

" + }, + "S3PropertiesInput": { + "type": "structure", + "required": ["s3Uri"], + "members": { + "s3Uri": { + "shape": "S3Uri" + }, + "s3AccessGrantLocationId": { + "shape": "S3AccessGrantLocationId", + "internalonly": true + }, + "shouldRegisterS3AccessGrantLocation": { + "shape": "Boolean", + "internalonly": true + } + } + }, + "S3PropertiesOutput": { + "type": "structure", + "required": ["s3Uri"], + "members": { + "s3Uri": { + "shape": "S3Uri" + }, + "s3AccessGrantLocationId": { + "shape": "S3AccessGrantLocationId", + "internalonly": true + }, + "shouldRegisterS3AccessGrantLocation": { + "shape": "Boolean", + "internalonly": true + }, + "status": { + "shape": "ConnectionStatus", + "internalonly": true + }, + "s3AccessGrantLocationRegistrationResult": { + "shape": "S3AccessGrantLocationRegistrationResult", + "internalonly": true + }, + "errorMessage": { + "shape": "String", + "internalonly": true + } + } + }, + "S3PropertiesPatch": { + "type": "structure", + "required": ["s3Uri"], + "members": { + "s3Uri": { + "shape": "S3Uri" + }, + "s3AccessGrantLocationId": { + "shape": "S3AccessGrantLocationId", + "internalonly": true + }, + "shouldRegisterS3AccessGrantLocation": { + "shape": "Boolean", + "internalonly": true + } + } + }, + "S3Uri": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "s3://.*" + }, + "SAPPropertiesInput": { + "type": "structure", + "members": { + "connectorEndpoint": { + "shape": "String" + }, + "invitationCode": { + "shape": "String" + } + }, + "internalonly": true + }, + "SAPPropertiesOutput": { + "type": "structure", + "members": { + "connectorEndpoint": { + "shape": "String" + }, + "invitationCode": { + "shape": "String" + }, + "clientId": { + "shape": "String" + }, + "clientConfigurationEndpoint": { + "shape": "String" + }, + "softwareInstanceIdentifier": { + "shape": "String" + }, + "providerId": { + "shape": "String" + } + }, + "internalonly": true + }, + "SAPResource": { + "type": "structure", + "members": { + "status": { + "shape": "ResourceStatus" + }, + "createdAt": { + "shape": "CreatedAtTimestamp" + }, + "updatedAt": { + "shape": "UpdatedAtTimestamp" + }, + "deltaShareId": { + "shape": "String" + }, + "deltaShareName": { + "shape": "String" + }, + "providerId": { + "shape": "String" + } + }, + "internalonly": true + }, + "SageMakerAssetType": { + "type": "string", + "max": 64, + "min": 1 + }, + "SageMakerParameters": { + "type": "structure", + "members": {} + }, + "SageMakerResourceArn": { + "type": "string", + "pattern": "arn:aws[^:]*:sagemaker:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:[\\w+=,.@-]{1,128}/[\\w+=,.@-]{1,256}" + }, + "SageMakerRunConfigurationInput": { + "type": "structure", + "required": ["trackingAssets"], + "members": { + "dataAccessRole": { + "shape": "SageMakerRunConfigurationInputDataAccessRoleString", + "internalonly": true + }, + "trackingAssets": { + "shape": "TrackingAssets" + } + } + }, + "SageMakerRunConfigurationInputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "SageMakerRunConfigurationOutput": { + "type": "structure", + "required": ["trackingAssets"], + "members": { + "dataAccessRole": { + "shape": "SageMakerRunConfigurationOutputDataAccessRoleString", + "internalonly": true + }, + "accountId": { + "shape": "SageMakerRunConfigurationOutputAccountIdString" + }, + "region": { + "shape": "SageMakerRunConfigurationOutputRegionString" + }, + "trackingAssets": { + "shape": "TrackingAssets" + } + } + }, + "SageMakerRunConfigurationOutputAccountIdString": { + "type": "string", + "max": 12, + "min": 12, + "pattern": "\\d{12}" + }, + "SageMakerRunConfigurationOutputDataAccessRoleString": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" + }, + "SageMakerRunConfigurationOutputRegionString": { + "type": "string", + "max": 16, + "min": 4, + "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" + }, + "ScheduleConfiguration": { + "type": "structure", + "members": { + "timezone": { + "shape": "Timezone" + }, + "schedule": { + "shape": "CronString" + } + }, + "sensitive": true + }, + "Scopes": { + "type": "list", + "member": { + "shape": "String" + } + }, + "ScoreModifier": { + "type": "string", + "enum": ["SIGMOID", "LOG", "LN", "SQUARE", "SQRT", "RECIPROCAL"] + }, + "SearchDomainPoliciesInput": { + "type": "structure", + "required": ["domainId"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "searchText": { + "shape": "String", + "location": "querystring", + "locationName": "searchText" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + }, + "filters": { + "shape": "PolicyFilterClause" + } + } + }, + "SearchDomainPoliciesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "SearchPoliciesResultItems" + }, + "count": { + "shape": "Integer" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "SearchFieldEnvironment": { + "type": "string", + "enum": ["NAME"] + }, + "SearchGroupProfilesInput": { + "type": "structure", + "required": ["domainIdentifier", "groupType"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "groupType": { + "shape": "GroupSearchType" + }, + "searchText": { + "shape": "GroupSearchText" + }, + "maxResults": { + "shape": "MaxResults" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "SearchGroupProfilesOutput": { + "type": "structure", + "members": { + "items": { + "shape": "GroupProfileSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "SearchInItem": { + "type": "structure", + "required": ["attribute"], + "members": { + "attribute": { + "shape": "Attribute" + } + } + }, + "SearchInList": { + "type": "list", + "member": { + "shape": "SearchInItem" + }, + "max": 10, + "min": 1 + }, + "SearchInput": { + "type": "structure", + "required": ["domainIdentifier", "searchScope"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + }, + "maxResults": { + "shape": "MaxResults" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "searchScope": { + "shape": "InventorySearchScope" + }, + "searchText": { + "shape": "SearchText" + }, + "searchIn": { + "shape": "SearchInList" + }, + "filters": { + "shape": "FilterClause" + }, + "includeDefaultFacets": { + "shape": "Boolean", + "internalonly": true + }, + "aggregations": { + "shape": "AggregationList", + "internalonly": true + }, + "sort": { + "shape": "SearchSort" + }, + "additionalAttributes": { + "shape": "SearchOutputAdditionalAttributes" + }, + "reranks": { + "shape": "Rerank" + } + } + }, + "SearchInventoryResultItem": { + "type": "structure", + "members": { + "glossaryItem": { + "shape": "GlossaryItem" + }, + "glossaryTermItem": { + "shape": "GlossaryTermItem" + }, + "assetItem": { + "shape": "AssetItem" + }, + "dataProductItem": { + "shape": "DataProductResultItem" + } + }, + "union": true + }, + "SearchInventoryResultItems": { + "type": "list", + "member": { + "shape": "SearchInventoryResultItem" + } + }, + "SearchListingsInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "searchText": { + "shape": "SearchListingsInputSearchTextString" + }, + "searchIn": { + "shape": "SearchInList" + }, + "maxResults": { + "shape": "MaxListResults" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "filters": { + "shape": "FilterClause" + }, + "includeDefaultFacets": { + "shape": "Boolean", + "internalonly": true + }, + "aggregations": { + "shape": "AggregationList", + "internalonly": true + }, + "sort": { + "shape": "SearchSort" + }, + "additionalAttributes": { + "shape": "SearchOutputAdditionalAttributes" + }, + "reranks": { + "shape": "Rerank" + } + } + }, + "SearchListingsInputSearchTextString": { + "type": "string", + "max": 512, + "min": 0 + }, + "SearchListingsOutput": { + "type": "structure", + "members": { + "items": { + "shape": "SearchResultItems" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "totalMatchCount": { + "shape": "Integer" + }, + "aggregates": { + "shape": "AggregationOutputList", + "internalonly": true + }, + "aggregations": { + "shape": "AggregationOutputList", + "internalonly": true + }, + "treatment": { + "shape": "TreatmentCodes", + "internalonly": true + } + } + }, + "SearchOutput": { + "type": "structure", + "members": { + "items": { + "shape": "SearchInventoryResultItems" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "totalMatchCount": { + "shape": "Integer" + }, + "aggregations": { + "shape": "AggregationOutputList", + "internalonly": true + } + } + }, + "SearchOutputAdditionalAttribute": { + "type": "string", + "enum": ["FORMS", "TIME_SERIES_DATA_POINT_FORMS", "TEXT_MATCH_RATIONALE"] + }, + "SearchOutputAdditionalAttributes": { + "type": "list", + "member": { + "shape": "SearchOutputAdditionalAttribute" + } + }, + "SearchPoliciesResultItems": { + "type": "list", + "member": { + "shape": "DomainPolicyItem" + } + }, + "SearchResultItem": { + "type": "structure", + "members": { + "assetListing": { + "shape": "AssetListingItem" + }, + "dataProductListing": { + "shape": "DataProductListingItem" + } + }, + "union": true + }, + "SearchResultItems": { + "type": "list", + "member": { + "shape": "SearchResultItem" + } + }, + "SearchRulesInput": { + "type": "structure", + "required": ["domainIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "requiredMetadataForm": { + "shape": "FormTypeIdentifier", + "location": "querystring", + "locationName": "requiredMetadataForm" + }, + "maxResults": { + "shape": "MaxResults", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "SearchRulesOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "RuleSearchSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "SearchSort": { + "type": "structure", + "required": ["attribute"], + "members": { + "attribute": { + "shape": "Attribute" + }, + "order": { + "shape": "SortOrder" + } + } + }, + "SearchText": { + "type": "string", + "max": 512, + "min": 1 + }, + "SearchTypesInput": { + "type": "structure", + "required": ["domainIdentifier", "searchScope", "managed"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "maxResults": { + "shape": "MaxResults" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "searchScope": { + "shape": "TypesSearchScope" + }, + "searchText": { + "shape": "SearchText" + }, + "searchIn": { + "shape": "SearchInList" + }, + "filters": { + "shape": "FilterClause" + }, + "includeDefaultFacets": { + "shape": "Boolean", + "internalonly": true + }, + "aggregations": { + "shape": "AggregationList", + "internalonly": true + }, + "sort": { + "shape": "SearchSort" + }, + "managed": { + "shape": "Boolean" + }, + "modelFormat": { + "shape": "ModelFormat", + "internalonly": true + } + } + }, + "SearchTypesOutput": { + "type": "structure", + "members": { + "items": { + "shape": "SearchTypesResultItems" + }, + "nextToken": { + "shape": "PaginationToken" + }, + "totalMatchCount": { + "shape": "Integer" + }, + "aggregations": { + "shape": "AggregationOutputList", + "internalonly": true + } + } + }, + "SearchTypesResultItem": { + "type": "structure", + "members": { + "assetTypeItem": { + "shape": "AssetTypeItem" + }, + "formTypeItem": { + "shape": "FormTypeData" + }, + "lineageNodeTypeItem": { + "shape": "LineageNodeTypeItem" + } + }, + "union": true + }, + "SearchTypesResultItems": { + "type": "list", + "member": { + "shape": "SearchTypesResultItem" + } + }, + "SearchUserProfilesInput": { + "type": "structure", + "required": ["domainIdentifier", "userType"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "userType": { + "shape": "UserSearchType" + }, + "searchText": { + "shape": "UserSearchText" + }, + "maxResults": { + "shape": "MaxResults" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "SearchUserProfilesOutput": { + "type": "structure", + "members": { + "items": { + "shape": "UserProfileSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "SecretAccessKey": { + "type": "string", + "sensitive": true + }, + "SecurityGroupIdList": { + "type": "list", + "member": { + "shape": "SecurityGroupIdListMemberString" + }, + "max": 50, + "min": 0 + }, + "SecurityGroupIdListMemberString": { + "type": "string", + "max": 255, + "min": 1 + }, + "SelfGrantSetting": { + "type": "string", + "enum": ["ENABLED", "DISABLED"] + }, + "SelfGrantStatus": { + "type": "string", + "enum": [ + "GRANT_PENDING", + "REVOKE_PENDING", + "GRANT_IN_PROGRESS", + "REVOKE_IN_PROGRESS", + "GRANTED", + "GRANT_FAILED", + "REVOKE_FAILED" + ] + }, + "SelfGrantStatusDetail": { + "type": "structure", + "required": ["databaseName", "status"], + "members": { + "databaseName": { + "shape": "SelfGrantStatusDetailDatabaseNameString" + }, + "schemaName": { + "shape": "SelfGrantStatusDetailSchemaNameString" + }, + "status": { + "shape": "SelfGrantStatus" + }, + "failureCause": { + "shape": "String" + } + } + }, + "SelfGrantStatusDetailDatabaseNameString": { + "type": "string", + "max": 128, + "min": 1 + }, + "SelfGrantStatusDetailSchemaNameString": { + "type": "string", + "max": 128, + "min": 1 + }, + "SelfGrantStatusDetails": { + "type": "list", + "member": { + "shape": "SelfGrantStatusDetail" + } + }, + "SelfGrantStatusOutput": { + "type": "structure", + "members": { + "glueSelfGrantStatus": { + "shape": "GlueSelfGrantStatusOutput" + }, + "redshiftSelfGrantStatus": { + "shape": "RedshiftSelfGrantStatusOutput" + } + }, + "union": true + }, + "ServiceLinkConfigurationInput": { + "type": "structure", + "members": { + "snowflake": { + "shape": "SnowflakeServiceLinkConfigurationInput" + }, + "databricks": { + "shape": "DatabricksServiceLinkConfigurationInput" + } + }, + "internalonly": true, + "union": true + }, + "ServiceLinkConfigurationOutput": { + "type": "structure", + "members": { + "snowflake": { + "shape": "SnowflakeServiceLinkConfigurationOutput" + }, + "databricks": { + "shape": "DatabricksServiceLinkConfigurationOutput" + } + }, + "internalonly": true, + "union": true + }, + "ServiceLinkDelegation": { + "type": "structure", + "required": ["projectId", "resources"], + "members": { + "projectId": { + "shape": "ProjectId" + }, + "resources": { + "shape": "ResourcePaths" + } + }, + "internalonly": true + }, + "ServiceLinkDelegations": { + "type": "list", + "member": { + "shape": "ServiceLinkDelegation" + }, + "max": 100, + "min": 1 + }, + "ServiceLinkError": { + "type": "structure", + "members": { + "message": { + "shape": "String" + } + }, + "internalonly": true + }, + "ServiceLinkId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "ServiceLinkIdentityMapping": { + "type": "structure", + "required": ["usernameAttribute"], + "members": { + "usernameAttribute": { + "shape": "String" + } + }, + "internalonly": true + }, + "ServiceLinkName": { + "type": "string", + "internalonly": true, + "max": 64, + "min": 1, + "pattern": "[\\w -]+", + "sensitive": true + }, + "ServiceLinkStatus": { + "type": "string", + "enum": ["CREATING", "CREATE_FAILED", "UPDATING", "UPDATE_FAILED", "READY"], + "internalonly": true + }, + "ServiceLinkSummaries": { + "type": "list", + "member": { + "shape": "ServiceLinkSummary" + }, + "internalonly": true + }, + "ServiceLinkSummary": { + "type": "structure", + "required": [ + "id", + "domainId", + "owningProjectId", + "domainUnitId", + "createdAt", + "updatedAt", + "status", + "type", + "name" + ], + "members": { + "id": { + "shape": "ServiceLinkId" + }, + "domainId": { + "shape": "DomainId" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "status": { + "shape": "ServiceLinkStatus" + }, + "type": { + "shape": "ServiceLinkType" + }, + "name": { + "shape": "ServiceLinkName" + } + }, + "internalonly": true + }, + "ServiceLinkType": { + "type": "string", + "enum": ["SNOWFLAKE", "DATABRICKS"], + "internalonly": true + }, + "ServiceQuotaExceededException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 402, + "senderFault": true + }, + "exception": true + }, + "ServiceRole": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" + }, + "SessionToken": { + "type": "string", + "sensitive": true + }, + "SetCookies": { + "type": "list", + "member": { + "shape": "Cookie" + } + }, + "SharedResource": { + "type": "structure", + "members": { + "sapResources": { + "shape": "SAPResource" + } + }, + "internalonly": true, + "union": true + }, + "SharedResources": { + "type": "list", + "member": { + "shape": "SharedResource" + }, + "internalonly": true + }, + "ShortDescription": { + "type": "string", + "max": 1024, + "min": 0, + "sensitive": true + }, + "SingleSignOn": { + "type": "structure", + "members": { + "type": { + "shape": "AuthType" + }, + "userAssignment": { + "shape": "UserAssignment" + }, + "idcInstanceArn": { + "shape": "SingleSignOnIdcInstanceArnString" + }, + "ssoUrl": { + "shape": "String", + "internalonly": true + }, + "idcApplicationArn": { + "shape": "String", + "internalonly": true + } + } + }, + "SingleSignOnIdcInstanceArnString": { + "type": "string", + "pattern": ".*arn:(aws|aws-us-gov|aws-cn|aws-iso|aws-iso-b):sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}.*" + }, + "Smithy": { + "type": "string", + "max": 100000, + "min": 1 + }, + "SnowflakePropertiesInput": { + "type": "structure", + "required": ["snowflakeRole", "identityMapping"], + "members": { + "connectivityProperties": { + "shape": "ConnectivityProperties" + }, + "snowflakeRole": { + "shape": "SnowflakeRole" + }, + "identityMapping": { + "shape": "IdentityMapping" + }, + "policySync": { + "shape": "PolicySyncInput" + }, + "lineageSync": { + "shape": "LineageSyncInput" + } + } + }, + "SnowflakePropertiesOutput": { + "type": "structure", + "required": ["snowflakeRole", "identityMapping", "policySync", "lineageSync", "status"], + "members": { + "snowflakeRole": { + "shape": "SnowflakeRole" + }, + "identityMapping": { + "shape": "IdentityMapping" + }, + "policySync": { + "shape": "PolicySyncOutput" + }, + "lineageSync": { + "shape": "LineageSyncOutput" + }, + "status": { + "shape": "ConnectionStatus" + }, + "errorMessage": { + "shape": "String" + }, + "provisionedResources": { + "shape": "ProvisionedResources" + } + } + }, + "SnowflakePropertiesPatch": { + "type": "structure", + "members": { + "connectivityPropertiesPatch": { + "shape": "ConnectivityPropertiesPatch" + }, + "snowflakeRole": { + "shape": "SnowflakeRole" + }, + "policySync": { + "shape": "PolicySyncInput" + }, + "lineageSync": { + "shape": "LineageSyncInput" + } + } + }, + "SnowflakeRole": { + "type": "string", + "pattern": ".*[a-zA-Z0-9_$]{1,255}" + }, + "SnowflakeRunConfigurationInput": { + "type": "structure", + "required": ["relationalFilterConfigurations"], + "members": { + "relationalFilterConfigurations": { + "shape": "RelationalFilterConfigurations" + } + } + }, + "SnowflakeRunConfigurationOutput": { + "type": "structure", + "required": ["relationalFilterConfigurations"], + "members": { + "relationalFilterConfigurations": { + "shape": "RelationalFilterConfigurations" + } + } + }, + "SnowflakeServiceLinkConfigurationInput": { + "type": "structure", + "required": ["accountId", "roleName", "warehouseName", "credentials"], + "members": { + "accountId": { + "shape": "String" + }, + "roleName": { + "shape": "String" + }, + "warehouseName": { + "shape": "String" + }, + "credentials": { + "shape": "UsernamePasswordCredentials" + } + }, + "internalonly": true + }, + "SnowflakeServiceLinkConfigurationOutput": { + "type": "structure", + "required": ["accountId", "roleName", "warehouseName"], + "members": { + "accountId": { + "shape": "String" + }, + "roleName": { + "shape": "String" + }, + "warehouseName": { + "shape": "String" + } + }, + "internalonly": true + }, + "SortFieldAccountPool": { + "type": "string", + "enum": ["NAME"] + }, + "SortFieldConnection": { + "type": "string", + "enum": ["NAME"] + }, + "SortFieldProject": { + "type": "string", + "enum": ["NAME"] + }, + "SortFieldProjectMembershipRequest": { + "type": "string", + "enum": ["REQUESTER_ID", "REQUESTED_AT", "LAST_UPDATED_AT"] + }, + "SortKey": { + "type": "string", + "enum": ["CREATED_AT", "UPDATED_AT"] + }, + "SortOrder": { + "type": "string", + "enum": ["ASCENDING", "DESCENDING"] + }, + "SparkEmrPropertiesInput": { + "type": "structure", + "members": { + "computeArn": { + "shape": "SparkEmrPropertiesInputComputeArnString" + }, + "instanceProfileArn": { + "shape": "ServiceRole" + }, + "javaVirtualEnv": { + "shape": "SparkEmrPropertiesInputJavaVirtualEnvString" + }, + "logUri": { + "shape": "SparkEmrPropertiesInputLogUriString" + }, + "pythonVirtualEnv": { + "shape": "SparkEmrPropertiesInputPythonVirtualEnvString" + }, + "runtimeRole": { + "shape": "ServiceRole" + }, + "trustedCertificatesS3Uri": { + "shape": "SparkEmrPropertiesInputTrustedCertificatesS3UriString" + }, + "managedEndpointArn": { + "shape": "SparkEmrPropertiesInputManagedEndpointArnString" + } + } + }, + "SparkEmrPropertiesInputComputeArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:(elasticmapreduce|emr-serverless|emr-containers):.*" + }, + "SparkEmrPropertiesInputJavaVirtualEnvString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "SparkEmrPropertiesInputLogUriString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "s3://.+" + }, + "SparkEmrPropertiesInputManagedEndpointArnString": { + "type": "string", + "max": 2048, + "min": 0 + }, + "SparkEmrPropertiesInputPythonVirtualEnvString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "SparkEmrPropertiesInputTrustedCertificatesS3UriString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "s3://.+" + }, + "SparkEmrPropertiesOutput": { + "type": "structure", + "members": { + "computeArn": { + "shape": "String" + }, + "credentials": { + "shape": "UsernamePassword" + }, + "credentialsExpiration": { + "shape": "SyntheticTimestamp_date_time" + }, + "governanceType": { + "shape": "GovernanceType" + }, + "instanceProfileArn": { + "shape": "String" + }, + "javaVirtualEnv": { + "shape": "String" + }, + "livyEndpoint": { + "shape": "String" + }, + "logUri": { + "shape": "String" + }, + "pythonVirtualEnv": { + "shape": "String" + }, + "runtimeRole": { + "shape": "String" + }, + "trustedCertificatesS3Uri": { + "shape": "String" + }, + "certificateData": { + "shape": "String", + "internalonly": true + }, + "managedEndpointArn": { + "shape": "SparkEmrPropertiesOutputManagedEndpointArnString" + }, + "managedEndpointCredentials": { + "shape": "ManagedEndpointCredentials" + } + } + }, + "SparkEmrPropertiesOutputManagedEndpointArnString": { + "type": "string", + "max": 2048, + "min": 0 + }, + "SparkEmrPropertiesPatch": { + "type": "structure", + "members": { + "computeArn": { + "shape": "SparkEmrPropertiesPatchComputeArnString" + }, + "instanceProfileArn": { + "shape": "ServiceRole" + }, + "javaVirtualEnv": { + "shape": "SparkEmrPropertiesPatchJavaVirtualEnvString" + }, + "logUri": { + "shape": "SparkEmrPropertiesPatchLogUriString" + }, + "pythonVirtualEnv": { + "shape": "SparkEmrPropertiesPatchPythonVirtualEnvString" + }, + "runtimeRole": { + "shape": "ServiceRole" + }, + "trustedCertificatesS3Uri": { + "shape": "SparkEmrPropertiesPatchTrustedCertificatesS3UriString" + }, + "managedEndpointArn": { + "shape": "SparkEmrPropertiesPatchManagedEndpointArnString" + } + } + }, + "SparkEmrPropertiesPatchComputeArnString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:(elasticmapreduce|emr-serverless|emr-containers):.*" + }, + "SparkEmrPropertiesPatchJavaVirtualEnvString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "SparkEmrPropertiesPatchLogUriString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "s3://.+" + }, + "SparkEmrPropertiesPatchManagedEndpointArnString": { + "type": "string", + "max": 2048, + "min": 0 + }, + "SparkEmrPropertiesPatchPythonVirtualEnvString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "SparkEmrPropertiesPatchTrustedCertificatesS3UriString": { + "type": "string", + "max": 2048, + "min": 0, + "pattern": "s3://.+" + }, + "SparkGlueArgs": { + "type": "structure", + "members": { + "connection": { + "shape": "ConnectionId" + } + } + }, + "SparkGluePropertiesInput": { + "type": "structure", + "members": { + "additionalArgs": { + "shape": "SparkGlueArgs" + }, + "glueConnectionName": { + "shape": "GlueConnectionName" + }, + "glueVersion": { + "shape": "SparkGluePropertiesInputGlueVersionString" + }, + "idleTimeout": { + "shape": "SparkGluePropertiesInputIdleTimeoutInteger" + }, + "javaVirtualEnv": { + "shape": "SparkGluePropertiesInputJavaVirtualEnvString" + }, + "numberOfWorkers": { + "shape": "SparkGluePropertiesInputNumberOfWorkersInteger" + }, + "pythonVirtualEnv": { + "shape": "SparkGluePropertiesInputPythonVirtualEnvString" + }, + "workerType": { + "shape": "SparkGluePropertiesInputWorkerTypeString" + } + } + }, + "SparkGluePropertiesInputGlueVersionString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "\\w+\\.\\w+" + }, + "SparkGluePropertiesInputIdleTimeoutInteger": { + "type": "integer", + "box": true, + "max": 3000, + "min": 1 + }, + "SparkGluePropertiesInputJavaVirtualEnvString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "SparkGluePropertiesInputNumberOfWorkersInteger": { + "type": "integer", + "box": true, + "max": 1000, + "min": 1 + }, + "SparkGluePropertiesInputPythonVirtualEnvString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\S]*" + }, + "SparkGluePropertiesInputWorkerTypeString": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[G|Z].*" + }, + "SparkGluePropertiesOutput": { + "type": "structure", + "members": { + "additionalArgs": { + "shape": "SparkGlueArgs" + }, + "glueConnectionName": { + "shape": "String" + }, + "glueVersion": { + "shape": "String" + }, + "idleTimeout": { + "shape": "Integer" + }, + "javaVirtualEnv": { + "shape": "String" + }, + "numberOfWorkers": { + "shape": "Integer" + }, + "pythonVirtualEnv": { + "shape": "String" + }, + "workerType": { + "shape": "String" + } + } + }, + "SsoLoginRequest": { + "type": "structure", + "required": ["domainId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "additionalState": { + "shape": "String" + }, + "state": { + "shape": "String" + }, + "code": { + "shape": "String" + }, + "redirectToLocalhost": { + "shape": "Boolean" + } + } + }, + "SsoLoginResponse": { + "type": "structure", + "members": { + "cookieStrings": { + "shape": "SetCookies", + "location": "header", + "locationName": "Set-Cookie" + }, + "redirectUrl": { + "shape": "String" + }, + "additionalState": { + "shape": "String" + }, + "jwtToken": { + "shape": "String" + }, + "csrfToken": { + "shape": "String" + }, + "credentials": { + "shape": "AwsCredentials" + }, + "userProfile": { + "shape": "UserProfile" + } + } + }, + "SsoLogoutRequest": { + "type": "structure", + "required": ["domainId"], + "members": { + "jwtToken": { + "shape": "String", + "location": "header", + "locationName": "jwt-token" + }, + "csrfToken": { + "shape": "String", + "location": "header", + "locationName": "x-csrf-token" + }, + "domainId": { + "shape": "DomainId" + } + } + }, + "SsoLogoutResponse": { + "type": "structure", + "members": { + "cookieStrings": { + "shape": "SetCookies", + "location": "header", + "locationName": "Set-Cookie" + }, + "CacheControl": { + "shape": "String", + "location": "header", + "locationName": "Cache-Control" + } + } + }, + "SsoUserProfileDetails": { + "type": "structure", + "members": { + "username": { + "shape": "UserProfileName" + }, + "firstName": { + "shape": "FirstName" + }, + "lastName": { + "shape": "LastName" + }, + "email": { + "shape": "String", + "internalonly": true + }, + "userId": { + "shape": "String", + "internalonly": true + } + } + }, + "StartAccountBootstrapActionInput": { + "type": "structure", + "required": ["domainIdentifier", "provisioningRoleArn", "bootstrapConfiguration", "action"], + "members": { + "domainIdentifier": { + "shape": "DomainId" + }, + "provisioningRoleArn": { + "shape": "RoleArn" + }, + "bootstrapConfiguration": { + "shape": "BootstrapConfigurationList" + }, + "action": { + "shape": "Action" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "StartAccountBootstrapActionOutput": { + "type": "structure", + "members": {} + }, + "StartDataSourceRunInput": { + "type": "structure", + "required": ["domainIdentifier", "dataSourceIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "dataSourceIdentifier": { + "shape": "DataSourceId", + "location": "uri", + "locationName": "dataSourceIdentifier" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "StartDataSourceRunOutput": { + "type": "structure", + "required": ["domainId", "dataSourceId", "id", "projectId", "status", "type", "createdAt", "updatedAt"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "dataSourceId": { + "shape": "DataSourceId" + }, + "id": { + "shape": "DataSourceRunId" + }, + "projectId": { + "shape": "ProjectId" + }, + "status": { + "shape": "DataSourceRunStatus" + }, + "type": { + "shape": "DataSourceRunType" + }, + "dataSourceConfigurationSnapshot": { + "shape": "String" + }, + "runStatisticsForAssets": { + "shape": "RunStatisticsForAssets" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + }, + "startedAt": { + "shape": "DateTime" + }, + "stoppedAt": { + "shape": "DateTime" + } + } + }, + "StartMetadataGenerationRunInput": { + "type": "structure", + "required": ["domainIdentifier", "target", "owningProjectIdentifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "type": { + "shape": "MetadataGenerationRunType" + }, + "types": { + "shape": "MetadataGenerationRunTypes", + "internalonly": true + }, + "target": { + "shape": "MetadataGenerationRunTarget" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + }, + "owningProjectIdentifier": { + "shape": "ProjectId" + } + } + }, + "StartMetadataGenerationRunOutput": { + "type": "structure", + "required": ["domainId", "id"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "MetadataGenerationRunIdentifier" + }, + "status": { + "shape": "MetadataGenerationRunStatus" + }, + "type": { + "shape": "MetadataGenerationRunType" + }, + "types": { + "shape": "MetadataGenerationRunTypes", + "internalonly": true + }, + "createdAt": { + "shape": "CreatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "owningProjectId": { + "shape": "ProjectId" + } + } + }, + "Status": { + "type": "string", + "enum": ["ENABLED", "DISABLED"] + }, + "String": { + "type": "string" + }, + "StringList": { + "type": "list", + "member": { + "shape": "String" + } + }, + "SubnetId": { + "type": "string", + "max": 32, + "min": 0, + "pattern": "subnet-[a-z0-9]+" + }, + "SubnetIdList": { + "type": "list", + "member": { + "shape": "SubnetId" + }, + "max": 50, + "min": 1 + }, + "SubscribedAsset": { + "type": "structure", + "required": ["assetId", "assetRevision", "status"], + "members": { + "assetId": { + "shape": "AssetId" + }, + "assetRevision": { + "shape": "Revision" + }, + "status": { + "shape": "SubscriptionGrantStatus" + }, + "targetName": { + "shape": "String" + }, + "failureCause": { + "shape": "FailureCause" + }, + "grantedTimestamp": { + "shape": "Timestamp" + }, + "failureTimestamp": { + "shape": "Timestamp" + }, + "assetScope": { + "shape": "AssetScope" + }, + "outputProperties": { + "shape": "SubscriptionGrantOutputProperties", + "internalonly": true + }, + "permissions": { + "shape": "Permissions" + } + } + }, + "SubscribedAssetListing": { + "type": "structure", + "members": { + "entityId": { + "shape": "AssetId" + }, + "entityRevision": { + "shape": "Revision" + }, + "entityType": { + "shape": "TypeName" + }, + "forms": { + "shape": "Forms" + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + }, + "assetScope": { + "shape": "AssetScope" + }, + "columnNames": { + "shape": "ColumnNames", + "internalonly": true + }, + "rowFilterExpression": { + "shape": "String", + "internalonly": true + }, + "permissions": { + "shape": "Permissions" + } + } + }, + "SubscribedAssets": { + "type": "list", + "member": { + "shape": "SubscribedAsset" + } + }, + "SubscribedGroup": { + "type": "structure", + "members": { + "id": { + "shape": "GroupProfileId" + }, + "name": { + "shape": "GroupProfileName" + } + } + }, + "SubscribedGroupInput": { + "type": "structure", + "members": { + "identifier": { + "shape": "GroupProfileId" + } + } + }, + "SubscribedListing": { + "type": "structure", + "required": ["id", "name", "description", "item", "ownerProjectId"], + "members": { + "id": { + "shape": "ListingId" + }, + "revision": { + "shape": "Revision" + }, + "name": { + "shape": "ListingName" + }, + "description": { + "shape": "Description" + }, + "item": { + "shape": "SubscribedListingItem" + }, + "ownerProjectId": { + "shape": "ProjectId" + }, + "ownerProjectName": { + "shape": "String" + } + } + }, + "SubscribedListingInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "ListingId" + }, + "subscriptionSettings": { + "shape": "SubscriptionSettings" + } + } + }, + "SubscribedListingInputs": { + "type": "list", + "member": { + "shape": "SubscribedListingInput" + }, + "max": 1, + "min": 1 + }, + "SubscribedListingItem": { + "type": "structure", + "members": { + "assetListing": { + "shape": "SubscribedAssetListing" + }, + "productListing": { + "shape": "SubscribedProductListing" + } + }, + "union": true + }, + "SubscribedPrincipal": { + "type": "structure", + "members": { + "project": { + "shape": "SubscribedProject" + }, + "user": { + "shape": "SubscribedUser" + }, + "group": { + "shape": "SubscribedGroup" + } + }, + "union": true + }, + "SubscribedPrincipalInput": { + "type": "structure", + "members": { + "project": { + "shape": "SubscribedProjectInput" + }, + "user": { + "shape": "SubscribedUserInput" + }, + "group": { + "shape": "SubscribedGroupInput" + } + }, + "union": true + }, + "SubscribedPrincipalInputs": { + "type": "list", + "member": { + "shape": "SubscribedPrincipalInput" + }, + "max": 1, + "min": 1 + }, + "SubscribedProductListing": { + "type": "structure", + "members": { + "entityId": { + "shape": "AssetId" + }, + "entityRevision": { + "shape": "Revision" + }, + "glossaryTerms": { + "shape": "DetailedGlossaryTerms" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "assetListings": { + "shape": "AssetInDataProductListingItems" + } + } + }, + "SubscribedProject": { + "type": "structure", + "members": { + "id": { + "shape": "ProjectId" + }, + "name": { + "shape": "ProjectName" + } + } + }, + "SubscribedProjectInput": { + "type": "structure", + "members": { + "identifier": { + "shape": "ProjectId" + } + } + }, + "SubscribedUser": { + "type": "structure", + "members": { + "id": { + "shape": "UserProfileId" + }, + "details": { + "shape": "UserProfileDetails" + } + } + }, + "SubscribedUserInput": { + "type": "structure", + "members": { + "identifier": { + "shape": "UserProfileId" + } + } + }, + "SubscriptionEligibilityStatus": { + "type": "string", + "enum": ["SUBSCRIBE_AND_GRANT", "SUBSCRIBE_ONLY", "NONE"] + }, + "SubscriptionGrantId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "SubscriptionGrantOutputProperties": { + "type": "map", + "key": { + "shape": "String" + }, + "value": { + "shape": "String" + } + }, + "SubscriptionGrantOverallStatus": { + "type": "string", + "enum": [ + "PENDING", + "IN_PROGRESS", + "GRANT_FAILED", + "REVOKE_FAILED", + "GRANT_AND_REVOKE_FAILED", + "COMPLETED", + "INACCESSIBLE" + ] + }, + "SubscriptionGrantStatus": { + "type": "string", + "enum": [ + "GRANT_PENDING", + "REVOKE_PENDING", + "GRANT_IN_PROGRESS", + "REVOKE_IN_PROGRESS", + "GRANTED", + "REVOKED", + "GRANT_FAILED", + "REVOKE_FAILED" + ] + }, + "SubscriptionGrantSummary": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "createdAt", + "updatedAt", + "subscriptionTargetId", + "grantedEntity", + "status" + ], + "members": { + "id": { + "shape": "SubscriptionGrantId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "environmentId": { + "shape": "EnvironmentId", + "internalonly": true + }, + "subscriptionTargetId": { + "shape": "SubscriptionTargetId" + }, + "grantedEntity": { + "shape": "GrantedEntity" + }, + "status": { + "shape": "SubscriptionGrantOverallStatus" + }, + "assets": { + "shape": "SubscribedAssets" + }, + "subscriptionId": { + "shape": "SubscriptionId", + "deprecated": true, + "deprecatedMessage": "Multiple subscriptions can exist for a single grant" + } + } + }, + "SubscriptionGrants": { + "type": "list", + "member": { + "shape": "SubscriptionGrantSummary" + } + }, + "SubscriptionId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "SubscriptionRequestId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "SubscriptionRequestStatus": { + "type": "string", + "enum": ["PENDING", "ACCEPTED", "REJECTED"] + }, + "SubscriptionRequestSummary": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "requestReason", + "subscribedPrincipals", + "subscribedListings" + ], + "members": { + "id": { + "shape": "SubscriptionRequestId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionRequestStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "requestReason": { + "shape": "RequestReason" + }, + "subscribedPrincipals": { + "shape": "SubscriptionRequestSummarySubscribedPrincipalsList" + }, + "subscribedListings": { + "shape": "SubscriptionRequestSummarySubscribedListingsList" + }, + "reviewerId": { + "shape": "String" + }, + "decisionComment": { + "shape": "DecisionComment" + }, + "existingSubscriptionId": { + "shape": "SubscriptionId" + }, + "metadataFormsSummary": { + "shape": "MetadataFormsSummary" + } + } + }, + "SubscriptionRequestSummarySubscribedListingsList": { + "type": "list", + "member": { + "shape": "SubscribedListing" + }, + "max": 1, + "min": 1 + }, + "SubscriptionRequestSummarySubscribedPrincipalsList": { + "type": "list", + "member": { + "shape": "SubscribedPrincipal" + }, + "max": 1, + "min": 1 + }, + "SubscriptionRequests": { + "type": "list", + "member": { + "shape": "SubscriptionRequestSummary" + } + }, + "SubscriptionSettings": { + "type": "structure", + "members": { + "filters": { + "shape": "AcceptedAssetScopes" + }, + "permissions": { + "shape": "AssetPermissions" + } + } + }, + "SubscriptionStatus": { + "type": "string", + "enum": ["APPROVED", "REVOKED", "CANCELLED"] + }, + "SubscriptionSummary": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "subscribedPrincipal", + "subscribedListing" + ], + "members": { + "id": { + "shape": "SubscriptionId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "subscribedPrincipal": { + "shape": "SubscribedPrincipal" + }, + "subscribedListing": { + "shape": "SubscribedListing" + }, + "subscriptionRequestId": { + "shape": "SubscriptionRequestId" + }, + "retainPermissions": { + "shape": "Boolean" + }, + "pushedSubscription": { + "shape": "Boolean" + }, + "expirationTimestamp": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "SubscriptionTargetForm": { + "type": "structure", + "required": ["formName", "content"], + "members": { + "formName": { + "shape": "FormName" + }, + "content": { + "shape": "String" + } + } + }, + "SubscriptionTargetForms": { + "type": "list", + "member": { + "shape": "SubscriptionTargetForm" + } + }, + "SubscriptionTargetId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "SubscriptionTargetName": { + "type": "string", + "max": 256, + "min": 1, + "sensitive": true + }, + "SubscriptionTargetSummary": { + "type": "structure", + "required": [ + "id", + "authorizedPrincipals", + "domainId", + "projectId", + "environmentId", + "name", + "type", + "createdBy", + "createdAt", + "applicableAssetTypes", + "subscriptionTargetConfig", + "provider" + ], + "members": { + "id": { + "shape": "SubscriptionTargetId" + }, + "authorizedPrincipals": { + "shape": "AuthorizedPrincipalIdentifiers" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "SubscriptionTargetName" + }, + "type": { + "shape": "String" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "manageAccessRole": { + "shape": "IamRoleArn" + }, + "applicableAssetTypes": { + "shape": "ApplicableAssetTypes" + }, + "subscriptionTargetConfig": { + "shape": "SubscriptionTargetForms" + }, + "provider": { + "shape": "String" + }, + "timeoutMinutes": { + "shape": "SubscriptionTargetSummaryTimeoutMinutesInteger" + } + } + }, + "SubscriptionTargetSummaryTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "min": 1 + }, + "SubscriptionTargets": { + "type": "list", + "member": { + "shape": "SubscriptionTargetSummary" + } + }, + "Subscriptions": { + "type": "list", + "member": { + "shape": "SubscriptionSummary" + } + }, + "SupportedDomainVersions": { + "type": "list", + "member": { + "shape": "DomainVersion" + } + }, + "SupportedDomainVersionsList": { + "type": "list", + "member": { + "shape": "DataZoneDomainVersion" + } + }, + "SyntheticTimestamp_date_time": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "TagKey": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "[\\w \\.:/=+@-]+" + }, + "TagKeyList": { + "type": "list", + "member": { + "shape": "TagKey" + } + }, + "TagResourceRequest": { + "type": "structure", + "required": ["resourceArn", "tags"], + "members": { + "resourceArn": { + "shape": "String", + "location": "uri", + "locationName": "resourceArn" + }, + "tags": { + "shape": "Tags" + } + } + }, + "TagResourceResponse": { + "type": "structure", + "members": {} + }, + "TagValue": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\w \\.:/=+@-]*" + }, + "Tags": { + "type": "map", + "key": { + "shape": "TagKey" + }, + "value": { + "shape": "TagValue" + } + }, + "TargetEntityType": { + "type": "string", + "enum": [ + "DomainUnit", + "EnvironmentBlueprintConfiguration", + "EnvironmentProfile", + "DOMAIN_UNIT", + "ENVIRONMENT_BLUEPRINT_CONFIGURATION", + "ENVIRONMENT_PROFILE", + "ASSET_TYPE", + "GLOSSARY" + ] + }, + "TaskId": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "TaskStatus": { + "type": "string", + "enum": ["ACTIVE", "INACTIVE"] + }, + "TermRelations": { + "type": "structure", + "members": { + "isA": { + "shape": "TermRelationsIsAList" + }, + "classifies": { + "shape": "TermRelationsClassifiesList" + } + } + }, + "TermRelationsClassifiesList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 10, + "min": 1 + }, + "TermRelationsIsAList": { + "type": "list", + "member": { + "shape": "GlossaryTermId" + }, + "max": 10, + "min": 1 + }, + "TextMatchItem": { + "type": "structure", + "members": { + "attribute": { + "shape": "Attribute" + }, + "text": { + "shape": "String" + }, + "matchOffsets": { + "shape": "MatchOffsets" + } + } + }, + "TextMatches": { + "type": "list", + "member": { + "shape": "TextMatchItem" + } + }, + "ThrottlingException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 429, + "senderFault": true + }, + "exception": true, + "retryable": { + "throttling": false + } + }, + "TimeSeriesDataPointFormInput": { + "type": "structure", + "required": ["formName", "typeIdentifier", "timestamp", "content"], + "members": { + "formName": { + "shape": "TimeSeriesFormName" + }, + "typeIdentifier": { + "shape": "FormTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "timestamp": { + "shape": "Timestamp" + }, + "content": { + "shape": "TimeSeriesDataPointFormInputContentString" + } + }, + "sensitive": true + }, + "TimeSeriesDataPointFormInputContentString": { + "type": "string", + "max": 500000, + "min": 0 + }, + "TimeSeriesDataPointFormInputList": { + "type": "list", + "member": { + "shape": "TimeSeriesDataPointFormInput" + }, + "sensitive": true + }, + "TimeSeriesDataPointFormOutput": { + "type": "structure", + "required": ["formName", "typeIdentifier", "timestamp"], + "members": { + "formName": { + "shape": "TimeSeriesFormName" + }, + "typeIdentifier": { + "shape": "FormTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "timestamp": { + "shape": "Timestamp" + }, + "content": { + "shape": "TimeSeriesDataPointFormOutputContentString" + }, + "id": { + "shape": "DataPointIdentifier" + } + } + }, + "TimeSeriesDataPointFormOutputContentString": { + "type": "string", + "max": 500000, + "min": 0 + }, + "TimeSeriesDataPointFormOutputList": { + "type": "list", + "member": { + "shape": "TimeSeriesDataPointFormOutput" + } + }, + "TimeSeriesDataPointIdentifier": { + "type": "string", + "pattern": "[a-zA-Z0-9_-]{1,36}" + }, + "TimeSeriesDataPointSummaryFormOutput": { + "type": "structure", + "required": ["formName", "typeIdentifier", "timestamp"], + "members": { + "formName": { + "shape": "TimeSeriesFormName" + }, + "typeIdentifier": { + "shape": "FormTypeIdentifier" + }, + "typeRevision": { + "shape": "Revision" + }, + "timestamp": { + "shape": "Timestamp" + }, + "contentSummary": { + "shape": "TimeSeriesDataPointSummaryFormOutputContentSummaryString" + }, + "id": { + "shape": "DataPointIdentifier" + } + } + }, + "TimeSeriesDataPointSummaryFormOutputContentSummaryString": { + "type": "string", + "max": 20000, + "min": 0 + }, + "TimeSeriesDataPointSummaryFormOutputList": { + "type": "list", + "member": { + "shape": "TimeSeriesDataPointSummaryFormOutput" + } + }, + "TimeSeriesEntityType": { + "type": "string", + "enum": ["ASSET", "LISTING", "PROJECT"] + }, + "TimeSeriesFormName": { + "type": "string", + "max": 128, + "min": 1 + }, + "Timestamp": { + "type": "timestamp" + }, + "Timezone": { + "type": "string", + "enum": [ + "UTC", + "AFRICA_JOHANNESBURG", + "AMERICA_MONTREAL", + "AMERICA_SAO_PAULO", + "ASIA_BAHRAIN", + "ASIA_BANGKOK", + "ASIA_CALCUTTA", + "ASIA_DUBAI", + "ASIA_HONG_KONG", + "ASIA_JAKARTA", + "ASIA_KUALA_LUMPUR", + "ASIA_SEOUL", + "ASIA_SHANGHAI", + "ASIA_SINGAPORE", + "ASIA_TAIPEI", + "ASIA_TOKYO", + "AUSTRALIA_MELBOURNE", + "AUSTRALIA_SYDNEY", + "CANADA_CENTRAL", + "CET", + "CST6CDT", + "ETC_GMT", + "ETC_GMT0", + "ETC_GMT_ADD_0", + "ETC_GMT_ADD_1", + "ETC_GMT_ADD_10", + "ETC_GMT_ADD_11", + "ETC_GMT_ADD_12", + "ETC_GMT_ADD_2", + "ETC_GMT_ADD_3", + "ETC_GMT_ADD_4", + "ETC_GMT_ADD_5", + "ETC_GMT_ADD_6", + "ETC_GMT_ADD_7", + "ETC_GMT_ADD_8", + "ETC_GMT_ADD_9", + "ETC_GMT_NEG_0", + "ETC_GMT_NEG_1", + "ETC_GMT_NEG_10", + "ETC_GMT_NEG_11", + "ETC_GMT_NEG_12", + "ETC_GMT_NEG_13", + "ETC_GMT_NEG_14", + "ETC_GMT_NEG_2", + "ETC_GMT_NEG_3", + "ETC_GMT_NEG_4", + "ETC_GMT_NEG_5", + "ETC_GMT_NEG_6", + "ETC_GMT_NEG_7", + "ETC_GMT_NEG_8", + "ETC_GMT_NEG_9", + "EUROPE_DUBLIN", + "EUROPE_LONDON", + "EUROPE_PARIS", + "EUROPE_STOCKHOLM", + "EUROPE_ZURICH", + "ISRAEL", + "MEXICO_GENERAL", + "MST7MDT", + "PACIFIC_AUCKLAND", + "US_CENTRAL", + "US_EASTERN", + "US_MOUNTAIN", + "US_PACIFIC" + ] + }, + "Title": { + "type": "string", + "max": 1000, + "min": 0, + "sensitive": true + }, + "TokenUrlParametersMap": { + "type": "map", + "key": { + "shape": "TokenUrlParametersMapKeyString" + }, + "value": { + "shape": "TokenUrlParametersMapValueString" + } + }, + "TokenUrlParametersMapKeyString": { + "type": "string", + "max": 128, + "min": 1 + }, + "TokenUrlParametersMapValueString": { + "type": "string", + "max": 512, + "min": 1 + }, + "Topic": { + "type": "structure", + "required": ["subject", "resource", "role"], + "members": { + "subject": { + "shape": "String" + }, + "resource": { + "shape": "NotificationResource" + }, + "role": { + "shape": "NotificationRole" + } + } + }, + "TrackingAssetArns": { + "type": "list", + "member": { + "shape": "SageMakerResourceArn" + }, + "max": 500, + "min": 0 + }, + "TrackingAssets": { + "type": "map", + "key": { + "shape": "SageMakerAssetType" + }, + "value": { + "shape": "TrackingAssetArns" + }, + "max": 1, + "min": 1 + }, + "TreatmentCodes": { + "type": "list", + "member": { + "shape": "String" + } + }, + "TypeName": { + "type": "string", + "max": 256, + "min": 1, + "pattern": "[^\\.]*.*" + }, + "TypesSearchScope": { + "type": "string", + "enum": ["ASSET_TYPE", "FORM_TYPE", "LINEAGE_NODE_TYPE"] + }, + "UnauthorizedException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 401, + "senderFault": true + }, + "exception": true + }, + "Unit": { + "type": "structure", + "members": {} + }, + "UntagResourceRequest": { + "type": "structure", + "required": ["resourceArn", "tagKeys"], + "members": { + "resourceArn": { + "shape": "String", + "location": "uri", + "locationName": "resourceArn" + }, + "tagKeys": { + "shape": "TagKeyList", + "location": "querystring", + "locationName": "tagKeys" + } + } + }, + "UntagResourceResponse": { + "type": "structure", + "members": {} + }, + "UpdateAccountPoolInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "AccountPoolId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "AccountPoolName" + }, + "description": { + "shape": "Description" + }, + "resolutionStrategy": { + "shape": "ResolutionStrategy" + }, + "accountSource": { + "shape": "AccountSource" + } + } + }, + "UpdateAccountPoolOutput": { + "type": "structure", + "required": ["accountSource", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "AccountPoolName" + }, + "id": { + "shape": "AccountPoolId" + }, + "description": { + "shape": "Description" + }, + "resolutionStrategy": { + "shape": "ResolutionStrategy" + }, + "accountSource": { + "shape": "AccountSource" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainUnitId": { + "shape": "DomainUnitId" + } + } + }, + "UpdateAssetFilterInput": { + "type": "structure", + "required": ["domainIdentifier", "assetIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "assetIdentifier": { + "shape": "AssetId", + "location": "uri", + "locationName": "assetIdentifier" + }, + "identifier": { + "shape": "FilterId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "Description" + }, + "configuration": { + "shape": "AssetFilterConfiguration" + } + } + }, + "UpdateAssetFilterOutput": { + "type": "structure", + "required": ["id", "domainId", "assetId", "name", "configuration"], + "members": { + "id": { + "shape": "FilterId" + }, + "domainId": { + "shape": "DomainId" + }, + "assetId": { + "shape": "AssetId" + }, + "name": { + "shape": "FilterName" + }, + "description": { + "shape": "Description" + }, + "status": { + "shape": "FilterStatus" + }, + "configuration": { + "shape": "AssetFilterConfiguration" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "errorMessage": { + "shape": "String" + }, + "effectiveColumnNames": { + "shape": "ColumnNameList" + }, + "effectiveRowFilter": { + "shape": "String" + } + } + }, + "UpdateConnectionInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "configurations": { + "shape": "Configurations", + "internalonly": true + }, + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ConnectionId", + "location": "uri", + "locationName": "identifier" + }, + "description": { + "shape": "UpdateConnectionInputDescriptionString" + }, + "awsLocation": { + "shape": "AwsLocation" + }, + "credentialId": { + "shape": "CredentialId", + "internalonly": true + }, + "props": { + "shape": "ConnectionPropertiesPatch" + } + } + }, + "UpdateConnectionInputDescriptionString": { + "type": "string", + "max": 128, + "min": 0, + "pattern": "[\\S\\s]*", + "sensitive": true + }, + "UpdateConnectionOutput": { + "type": "structure", + "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], + "members": { + "configurations": { + "shape": "Configurations", + "internalonly": true + }, + "connectionId": { + "shape": "ConnectionId" + }, + "description": { + "shape": "Description" + }, + "domainId": { + "shape": "DomainId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "ConnectionName" + }, + "physicalEndpoints": { + "shape": "PhysicalEndpoints" + }, + "projectId": { + "shape": "ProjectId" + }, + "props": { + "shape": "ConnectionPropertiesOutput" + }, + "type": { + "shape": "ConnectionType" + }, + "credentialId": { + "shape": "CredentialId", + "internalonly": true + }, + "scope": { + "shape": "ConnectionScope", + "internalonly": true + } + } + }, + "UpdateDataSourceInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataSourceId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "enableSetting": { + "shape": "EnableSetting" + }, + "publishOnImport": { + "shape": "Boolean" + }, + "assetFormsInput": { + "shape": "FormInputList" + }, + "schedule": { + "shape": "ScheduleConfiguration" + }, + "configuration": { + "shape": "DataSourceConfigurationInput" + }, + "recommendation": { + "shape": "RecommendationConfiguration" + }, + "retainPermissionsOnRevokeFailure": { + "shape": "Boolean" + } + } + }, + "UpdateDataSourceOutput": { + "type": "structure", + "required": ["id", "name", "domainId", "projectId"], + "members": { + "id": { + "shape": "DataSourceId" + }, + "status": { + "shape": "DataSourceStatus" + }, + "type": { + "shape": "String" + }, + "name": { + "shape": "Name" + }, + "description": { + "shape": "Description" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "connectionId": { + "shape": "String" + }, + "configuration": { + "shape": "DataSourceConfigurationOutput" + }, + "recommendation": { + "shape": "RecommendationConfiguration" + }, + "enableSetting": { + "shape": "EnableSetting" + }, + "publishOnImport": { + "shape": "Boolean" + }, + "assetFormsOutput": { + "shape": "FormOutputList" + }, + "schedule": { + "shape": "ScheduleConfiguration" + }, + "lastRunStatus": { + "shape": "DataSourceRunStatus" + }, + "lastRunAt": { + "shape": "DateTime" + }, + "lastRunErrorMessage": { + "shape": "DataSourceErrorMessage" + }, + "errorMessage": { + "shape": "DataSourceErrorMessage" + }, + "createdAt": { + "shape": "DateTime" + }, + "updatedAt": { + "shape": "DateTime" + }, + "selfGrantStatus": { + "shape": "SelfGrantStatusOutput" + }, + "retainPermissionsOnRevokeFailure": { + "shape": "Boolean" + } + } + }, + "UpdateDataSourceRunActivitiesInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier", "completionStatus", "assets"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DataSourceRunId", + "location": "uri", + "locationName": "identifier" + }, + "completionStatus": { + "shape": "DataSourceRunCompletionStatus" + }, + "assets": { + "shape": "DataAssetIngestionDetails" + } + } + }, + "UpdateDataSourceRunActivitiesOutput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "DataSourceRunId" + } + } + }, + "UpdateDomainInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "identifier" + }, + "description": { + "shape": "String" + }, + "singleSignOn": { + "shape": "SingleSignOn" + }, + "domainExecutionRole": { + "shape": "RoleArn" + }, + "serviceRole": { + "shape": "AdminApiRoleArn" + }, + "domainServiceRole": { + "shape": "AdminApiRoleArn", + "deprecated": true, + "deprecatedMessage": "This shape is no longer used. Use ServiceRole.", + "internalonly": true + }, + "name": { + "shape": "String" + }, + "domainVersion": { + "shape": "DomainVersion", + "internalonly": true + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true, + "location": "querystring", + "locationName": "clientToken" + }, + "scopes": { + "shape": "Scopes", + "internalonly": true + }, + "deactivatePortalVersion": { + "shape": "DeactivatePortalVersion", + "internalonly": true + } + } + }, + "UpdateDomainOutput": { + "type": "structure", + "required": ["id"], + "members": { + "id": { + "shape": "DomainId" + }, + "rootDomainUnitId": { + "shape": "DomainUnitId" + }, + "description": { + "shape": "String" + }, + "singleSignOn": { + "shape": "SingleSignOn" + }, + "domainExecutionRole": { + "shape": "RoleArn" + }, + "serviceRole": { + "shape": "AdminApiRoleArn" + }, + "domainServiceRole": { + "shape": "AdminApiRoleArn", + "internalonly": true + }, + "name": { + "shape": "String" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "preferences": { + "shape": "Preferences", + "internalonly": true + } + } + }, + "UpdateDomainPolicyInput": { + "type": "structure", + "required": ["domainId", "policyId"], + "members": { + "domainId": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainId" + }, + "policyId": { + "shape": "PolicyId", + "location": "uri", + "locationName": "policyId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "policyContent": { + "shape": "PolicyContent" + }, + "clientToken": { + "shape": "String", + "idempotencyToken": true + } + } + }, + "UpdateDomainPolicyOutput": { + "type": "structure", + "required": ["domainId", "policyId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "policyId": { + "shape": "PolicyId" + } + } + }, + "UpdateDomainUnitInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DomainUnitId", + "location": "uri", + "locationName": "identifier" + }, + "description": { + "shape": "DomainUnitDescription" + }, + "name": { + "shape": "DomainUnitName" + } + } + }, + "UpdateDomainUnitOutput": { + "type": "structure", + "required": ["id", "domainId", "name", "owners", "ancestorDomainUnitIds"], + "members": { + "id": { + "shape": "DomainUnitId" + }, + "domainUnitId": { + "shape": "DomainUnitId", + "internalonly": true + }, + "domainId": { + "shape": "DomainId" + }, + "name": { + "shape": "DomainUnitName" + }, + "owners": { + "shape": "DomainUnitOwners" + }, + "ancestorDomainUnitIds": { + "shape": "DomainUnitIds" + }, + "description": { + "shape": "DomainUnitDescription" + }, + "parentDomainUnitId": { + "shape": "DomainUnitId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "lastUpdatedBy": { + "shape": "UpdatedBy" + } + } + }, + "UpdateDomainUnitPolicyInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier", "description"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "DomainUnitPolicyId", + "location": "uri", + "locationName": "identifier" + }, + "description": { + "shape": "String" + } + } + }, + "UpdateDomainUnitPolicyOutput": { + "type": "structure", + "required": ["domainId", "id", "description", "policyTarget", "details"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "DomainUnitPolicyId" + }, + "description": { + "shape": "String" + }, + "policyTarget": { + "shape": "PolicyTarget" + }, + "details": { + "shape": "Details" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "lastUpdatedBy": { + "shape": "UpdatedBy" + } + } + }, + "UpdateEnvironmentActionInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "identifier": { + "shape": "String", + "location": "uri", + "locationName": "identifier" + }, + "parameters": { + "shape": "ActionParameters" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + } + } + }, + "UpdateEnvironmentActionOutput": { + "type": "structure", + "required": ["domainId", "environmentId", "id", "name", "parameters"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "id": { + "shape": "EnvironmentActionId" + }, + "name": { + "shape": "String" + }, + "parameters": { + "shape": "ActionParameters" + }, + "description": { + "shape": "String" + } + } + }, + "UpdateEnvironmentBlueprintInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentBlueprintId", + "location": "uri", + "locationName": "identifier" + }, + "description": { + "shape": "String" + }, + "provider": { + "shape": "String", + "internalonly": true + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "provisioningPolicy": { + "shape": "ProvisioningPolicy", + "internalonly": true + }, + "deploymentProperties": { + "shape": "DeploymentProperties", + "internalonly": true + }, + "deploymentParameters": { + "shape": "CustomParameterList", + "internalonly": true + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms", + "internalonly": true + } + } + }, + "UpdateEnvironmentBlueprintOutput": { + "type": "structure", + "required": ["id", "name", "provider", "provisioningProperties"], + "members": { + "id": { + "shape": "EnvironmentBlueprintId" + }, + "name": { + "shape": "EnvironmentBlueprintName" + }, + "description": { + "shape": "Description" + }, + "changeLog": { + "shape": "String", + "internalonly": true + }, + "provider": { + "shape": "String" + }, + "provisioningPolicy": { + "shape": "ProvisioningPolicy", + "internalonly": true + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "deploymentProperties": { + "shape": "DeploymentProperties" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "blueprintCategory": { + "shape": "String", + "internalonly": true + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + } + } + }, + "UpdateEnvironmentConfigurationInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "environmentDeploymentResult"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "environmentDeploymentResult": { + "shape": "EnvironmentDeploymentResult" + }, + "failureReason": { + "shape": "EnvironmentError" + }, + "provisionedResources": { + "shape": "ResourceList" + }, + "environmentActions": { + "shape": "EnvironmentActionList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + } + } + }, + "UpdateEnvironmentConfigurationOutput": { + "type": "structure", + "required": ["id"], + "members": { + "id": { + "shape": "EnvironmentId" + } + } + }, + "UpdateEnvironmentDeploymentStatusInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "deploymentStatus"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "deploymentIdentifier": { + "shape": "DeploymentId" + }, + "deploymentStatus": { + "shape": "DeploymentStatus" + }, + "statusMessage": { + "shape": "String" + }, + "failureReasons": { + "shape": "EnvironmentError" + } + } + }, + "UpdateEnvironmentDeploymentStatusOutput": { + "type": "structure", + "members": {} + }, + "UpdateEnvironmentInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "blueprintVersion": { + "shape": "String" + }, + "userParameters": { + "shape": "EnvironmentParametersList" + } + } + }, + "UpdateEnvironmentOutput": { + "type": "structure", + "required": ["projectId", "domainId", "createdBy", "name", "provider"], + "members": { + "projectId": { + "shape": "ProjectId" + }, + "id": { + "shape": "EnvironmentId" + }, + "domainId": { + "shape": "DomainId" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentName" + }, + "description": { + "shape": "Description" + }, + "environmentProfileId": { + "shape": "EnvironmentProfileId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "provider": { + "shape": "String" + }, + "provisionedResources": { + "shape": "ResourceList" + }, + "permittedResources": { + "shape": "ResourceList", + "internalonly": true + }, + "status": { + "shape": "EnvironmentStatus" + }, + "environmentActions": { + "shape": "EnvironmentActionList" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "lastDeployment": { + "shape": "Deployment" + }, + "provisioningProperties": { + "shape": "ProvisioningProperties" + }, + "deploymentProperties": { + "shape": "DeploymentProperties" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "environmentConfigurationId": { + "shape": "EnvironmentConfigurationId", + "internalonly": true + } + } + }, + "UpdateEnvironmentProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "EnvironmentProfileId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "EnvironmentProfileName" + }, + "description": { + "shape": "String" + }, + "userParameters": { + "shape": "EnvironmentParametersList" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "blueprintVersion": { + "shape": "String", + "internalonly": true + }, + "resourceConfigurationId": { + "shape": "ResourceConfigurationId" + } + } + }, + "UpdateEnvironmentProfileOutput": { + "type": "structure", + "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], + "members": { + "id": { + "shape": "EnvironmentProfileId" + }, + "domainId": { + "shape": "DomainId" + }, + "awsAccountId": { + "shape": "AwsAccountId" + }, + "awsAccountRegion": { + "shape": "AwsRegion" + }, + "createdBy": { + "shape": "String" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "updatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "name": { + "shape": "EnvironmentProfileName" + }, + "description": { + "shape": "Description" + }, + "environmentBlueprintId": { + "shape": "EnvironmentBlueprintId" + }, + "projectId": { + "shape": "ProjectId" + }, + "userParameters": { + "shape": "CustomParameterList" + }, + "resourceConfigurationId": { + "shape": "ResourceConfigurationId" + } + } + }, + "UpdateEnvironmentRoleInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "environmentRoleArn": { + "shape": "RoleArn", + "location": "uri", + "locationName": "environmentRoleArn" + }, + "roleTag": { + "shape": "RoleTag" + } + } + }, + "UpdateEnvironmentRoleOutput": { + "type": "structure", + "required": ["domainId", "environmentId", "arn", "provider", "roleTag"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "arn": { + "shape": "RoleArn" + }, + "provider": { + "shape": "String" + }, + "type": { + "shape": "EnvironmentRoleType" + }, + "roleTag": { + "shape": "RoleTag" + } + } + }, + "UpdateGlossaryInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "GlossaryId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "GlossaryName" + }, + "description": { + "shape": "GlossaryDescription" + }, + "status": { + "shape": "GlossaryStatus" + }, + "clientToken": { + "shape": "ClientToken", + "idempotencyToken": true + } + } + }, + "UpdateGlossaryOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "owningProjectId"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GlossaryId" + }, + "name": { + "shape": "GlossaryName" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "description": { + "shape": "GlossaryDescription" + }, + "status": { + "shape": "GlossaryStatus" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + } + } + }, + "UpdateGlossaryTermInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "glossaryIdentifier": { + "shape": "GlossaryTermId" + }, + "identifier": { + "shape": "GlossaryTermId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "GlossaryTermName" + }, + "shortDescription": { + "shape": "ShortDescription" + }, + "longDescription": { + "shape": "LongDescription" + }, + "termRelations": { + "shape": "TermRelations" + }, + "status": { + "shape": "GlossaryTermStatus" + } + } + }, + "UpdateGlossaryTermOutput": { + "type": "structure", + "required": ["id", "domainId", "glossaryId", "name", "status"], + "members": { + "id": { + "shape": "GlossaryTermId" + }, + "domainId": { + "shape": "DomainId" + }, + "glossaryId": { + "shape": "GlossaryId" + }, + "name": { + "shape": "GlossaryTermName" + }, + "status": { + "shape": "GlossaryTermStatus" + }, + "shortDescription": { + "shape": "ShortDescription" + }, + "longDescription": { + "shape": "LongDescription" + }, + "termRelations": { + "shape": "TermRelations" + }, + "usageRestrictions": { + "shape": "GlossaryUsageRestrictions" + } + } + }, + "UpdateGroupProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "groupIdentifier", "status"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "groupIdentifier": { + "shape": "GroupIdentifier", + "location": "uri", + "locationName": "groupIdentifier" + }, + "status": { + "shape": "GroupProfileStatus" + } + } + }, + "UpdateGroupProfileOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GroupProfileId" + }, + "status": { + "shape": "GroupProfileStatus" + }, + "groupName": { + "shape": "GroupProfileName" + } + } + }, + "UpdatePartnerIntegrationInput": { + "type": "structure", + "required": ["identifier", "props"], + "members": { + "identifier": { + "shape": "PartnerIntegrationId", + "location": "uri", + "locationName": "identifier" + }, + "description": { + "shape": "Description" + }, + "props": { + "shape": "PartnerIntegrationPropertiesPatch" + } + }, + "internalonly": true + }, + "UpdatePartnerIntegrationOutput": { + "type": "structure", + "required": ["id", "status", "partnerId", "name"], + "members": { + "id": { + "shape": "PartnerIntegrationId" + }, + "createdAt": { + "shape": "CreatedAtTimestamp" + }, + "updatedAt": { + "shape": "UpdatedAtTimestamp" + }, + "status": { + "shape": "PartnerIntegrationStatus" + }, + "partnerId": { + "shape": "PartnerId" + }, + "name": { + "shape": "Name" + }, + "props": { + "shape": "PartnerIntegrationPropertiesOutput" + } + }, + "internalonly": true + }, + "UpdateProjectInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "ProjectName" + }, + "description": { + "shape": "Description" + }, + "tags": { + "shape": "Tags", + "internalonly": true + }, + "resourceTags": { + "shape": "UpdateProjectInputResourceTagsMap" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "environmentDeploymentDetails": { + "shape": "EnvironmentDeploymentDetails", + "internalonly": true + }, + "userParameters": { + "shape": "EnvironmentConfigurationUserParametersList" + }, + "projectProfileVersion": { + "shape": "String" + } + } + }, + "UpdateProjectInputResourceTagsMap": { + "type": "map", + "key": { + "shape": "TagKey" + }, + "value": { + "shape": "TagValue" + }, + "max": 25, + "min": 0 + }, + "UpdateProjectMembershipInput": { + "type": "structure", + "required": ["domainIdentifier", "projectIdentifier", "currentMembershipAssignment"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "projectIdentifier": { + "shape": "ProjectId", + "location": "uri", + "locationName": "projectIdentifier" + }, + "currentMembershipAssignment": { + "shape": "ProjectMember" + }, + "newMember": { + "shape": "Member" + } + } + }, + "UpdateProjectMembershipOutput": { + "type": "structure", + "members": {} + }, + "UpdateProjectOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectId" + }, + "name": { + "shape": "ProjectName" + }, + "description": { + "shape": "Description" + }, + "projectStatus": { + "shape": "ProjectStatus", + "documentation": "

Status of the project

" + }, + "failureReasons": { + "shape": "FailureReasons", + "documentation": "

Reasons for failed project deletion

" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "tags": { + "shape": "Tags", + "internalonly": true + }, + "resourceTags": { + "shape": "ResourceTags" + }, + "glossaryTerms": { + "shape": "GlossaryTerms" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "projectProfileId": { + "shape": "ProjectProfileId", + "internalonly": true + }, + "userParameters": { + "shape": "EnvironmentConfigurationUserParametersList", + "internalonly": true + }, + "environmentDeploymentDetails": { + "shape": "EnvironmentDeploymentDetails", + "internalonly": true + }, + "projectCategory": { + "shape": "String", + "internalonly": true + } + } + }, + "UpdateProjectProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ProjectProfileId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "ProjectProfileName" + }, + "description": { + "shape": "Description" + }, + "changeLog": { + "shape": "String", + "internalonly": true + }, + "status": { + "shape": "Status" + }, + "projectResourceTags": { + "shape": "ProjectResourceTagParameters" + }, + "allowCustomProjectResourceTags": { + "shape": "Boolean" + }, + "projectScopes": { + "shape": "ProjectScopesList", + "internalonly": true + }, + "environmentConfigurations": { + "shape": "EnvironmentConfigurationsList" + }, + "domainUnitIdentifier": { + "shape": "DomainUnitId" + }, + "designationConfigurations": { + "shape": "DesignationConfigurations", + "internalonly": true + } + } + }, + "UpdateProjectProfileOutput": { + "type": "structure", + "required": ["domainId", "id", "name", "createdBy"], + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "ProjectProfileId" + }, + "name": { + "shape": "ProjectProfileName" + }, + "description": { + "shape": "Description" + }, + "changeLog": { + "shape": "String", + "internalonly": true + }, + "status": { + "shape": "Status" + }, + "projectResourceTags": { + "shape": "ProjectResourceTagParameters" + }, + "allowCustomProjectResourceTags": { + "shape": "Boolean" + }, + "projectScopes": { + "shape": "ProjectScopesList", + "internalonly": true + }, + "environmentConfigurations": { + "shape": "EnvironmentConfigurationsList" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "createdAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "lastUpdatedAt": { + "shape": "SyntheticTimestamp_date_time" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "designationConfigurations": { + "shape": "DesignationConfigurations", + "internalonly": true + } + } + }, + "UpdateResourceSharingStateRequest": { + "type": "structure", + "required": ["action", "ownerAccountId", "resource", "consumerAccountId", "sequenceNumber"], + "members": { + "action": { + "shape": "RAMSharingAction" + }, + "ownerAccountId": { + "shape": "AwsAccountId" + }, + "resource": { + "shape": "RAMResourceARN" + }, + "consumerAccountId": { + "shape": "AwsAccountId" + }, + "sequenceNumber": { + "shape": "RAMSequenceNumber" + }, + "internalId": { + "shape": "RAMInternalId" + } + } + }, + "UpdateResourceSharingStateResponse": { + "type": "structure", + "members": { + "sharingResult": { + "shape": "RAMSharingResult" + } + } + }, + "UpdateRootDomainUnitOwnerInput": { + "type": "structure", + "required": ["domainIdentifier", "currentOwner", "newOwner"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "currentOwner": { + "shape": "UserIdentifier" + }, + "newOwner": { + "shape": "String" + } + } + }, + "UpdateRootDomainUnitOwnerOutput": { + "type": "structure", + "members": {} + }, + "UpdateRuleInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "RuleId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "RuleName" + }, + "description": { + "shape": "Description" + }, + "scope": { + "shape": "RuleScope" + }, + "detail": { + "shape": "RuleDetail" + }, + "includeChildDomainUnits": { + "shape": "Boolean" + } + } + }, + "UpdateRuleOutput": { + "type": "structure", + "required": [ + "identifier", + "revision", + "name", + "ruleType", + "target", + "action", + "scope", + "detail", + "createdAt", + "updatedAt", + "createdBy", + "lastUpdatedBy" + ], + "members": { + "identifier": { + "shape": "RuleId" + }, + "revision": { + "shape": "Revision" + }, + "name": { + "shape": "RuleName" + }, + "ruleType": { + "shape": "RuleType" + }, + "target": { + "shape": "RuleTarget" + }, + "action": { + "shape": "RuleAction" + }, + "scope": { + "shape": "RuleScope" + }, + "detail": { + "shape": "RuleDetail" + }, + "description": { + "shape": "Description" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "lastUpdatedBy": { + "shape": "UpdatedBy" + } + } + }, + "UpdateServiceLinkInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "ServiceLinkId", + "location": "uri", + "locationName": "identifier" + }, + "identityMapping": { + "shape": "ServiceLinkIdentityMapping" + }, + "delegations": { + "shape": "ServiceLinkDelegations" + }, + "configurationInput": { + "shape": "ServiceLinkConfigurationInput" + } + }, + "internalonly": true + }, + "UpdateServiceLinkOutput": { + "type": "structure", + "required": [ + "id", + "domainId", + "owningProjectId", + "domainUnitId", + "createdAt", + "updatedAt", + "status", + "type", + "name" + ], + "members": { + "id": { + "shape": "ServiceLinkId" + }, + "domainId": { + "shape": "DomainId" + }, + "owningProjectId": { + "shape": "ProjectId" + }, + "domainUnitId": { + "shape": "DomainUnitId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "status": { + "shape": "ServiceLinkStatus" + }, + "type": { + "shape": "ServiceLinkType" + }, + "name": { + "shape": "ServiceLinkName" + } + }, + "internalonly": true + }, + "UpdateSubscriptionGrantStatusInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier", "assetIdentifier", "status"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionGrantId", + "location": "uri", + "locationName": "identifier" + }, + "assetIdentifier": { + "shape": "AssetId", + "location": "uri", + "locationName": "assetIdentifier" + }, + "status": { + "shape": "SubscriptionGrantStatus" + }, + "failureCause": { + "shape": "FailureCause" + }, + "targetName": { + "shape": "String" + } + } + }, + "UpdateSubscriptionGrantStatusOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "createdAt", + "updatedAt", + "subscriptionTargetId", + "grantedEntity", + "status" + ], + "members": { + "id": { + "shape": "SubscriptionGrantId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "environmentId": { + "shape": "EnvironmentId", + "internalonly": true + }, + "subscriptionTargetId": { + "shape": "SubscriptionTargetId" + }, + "grantedEntity": { + "shape": "GrantedEntity" + }, + "status": { + "shape": "SubscriptionGrantOverallStatus" + }, + "assets": { + "shape": "SubscribedAssets" + }, + "subscriptionId": { + "shape": "SubscriptionId", + "deprecated": true, + "deprecatedMessage": "Multiple subscriptions can exist for a single grant" + } + } + }, + "UpdateSubscriptionRequestInput": { + "type": "structure", + "required": ["domainIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "identifier": { + "shape": "SubscriptionRequestId", + "location": "uri", + "locationName": "identifier" + }, + "requestReason": { + "shape": "RequestReason" + } + } + }, + "UpdateSubscriptionRequestOutput": { + "type": "structure", + "required": [ + "id", + "createdBy", + "domainId", + "status", + "createdAt", + "updatedAt", + "requestReason", + "subscribedPrincipals", + "subscribedListings" + ], + "members": { + "id": { + "shape": "SubscriptionRequestId" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "domainId": { + "shape": "DomainId" + }, + "status": { + "shape": "SubscriptionRequestStatus" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "requestReason": { + "shape": "RequestReason" + }, + "subscribedPrincipals": { + "shape": "UpdateSubscriptionRequestOutputSubscribedPrincipalsList" + }, + "subscribedListings": { + "shape": "UpdateSubscriptionRequestOutputSubscribedListingsList" + }, + "reviewerId": { + "shape": "String" + }, + "decisionComment": { + "shape": "DecisionComment" + }, + "existingSubscriptionId": { + "shape": "SubscriptionId" + }, + "metadataForms": { + "shape": "MetadataForms" + } + } + }, + "UpdateSubscriptionRequestOutputSubscribedListingsList": { + "type": "list", + "member": { + "shape": "SubscribedListing" + }, + "max": 1, + "min": 1 + }, + "UpdateSubscriptionRequestOutputSubscribedPrincipalsList": { + "type": "list", + "member": { + "shape": "SubscribedPrincipal" + }, + "max": 1, + "min": 1 + }, + "UpdateSubscriptionTargetInput": { + "type": "structure", + "required": ["domainIdentifier", "environmentIdentifier", "identifier"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "environmentIdentifier": { + "shape": "EnvironmentId", + "location": "uri", + "locationName": "environmentIdentifier" + }, + "identifier": { + "shape": "SubscriptionTargetId", + "location": "uri", + "locationName": "identifier" + }, + "name": { + "shape": "SubscriptionTargetName" + }, + "authorizedPrincipals": { + "shape": "AuthorizedPrincipalIdentifiers" + }, + "applicableAssetTypes": { + "shape": "ApplicableAssetTypes" + }, + "subscriptionTargetConfig": { + "shape": "SubscriptionTargetForms" + }, + "manageAccessRole": { + "shape": "IamRoleArn" + }, + "provider": { + "shape": "String" + }, + "timeoutMinutes": { + "shape": "UpdateSubscriptionTargetInputTimeoutMinutesInteger" + } + } + }, + "UpdateSubscriptionTargetInputTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "min": 1 + }, + "UpdateSubscriptionTargetOutput": { + "type": "structure", + "required": [ + "id", + "authorizedPrincipals", + "domainId", + "projectId", + "environmentId", + "name", + "type", + "createdBy", + "createdAt", + "applicableAssetTypes", + "subscriptionTargetConfig", + "provider" + ], + "members": { + "id": { + "shape": "SubscriptionTargetId" + }, + "authorizedPrincipals": { + "shape": "AuthorizedPrincipalIdentifiers" + }, + "domainId": { + "shape": "DomainId" + }, + "projectId": { + "shape": "ProjectId" + }, + "environmentId": { + "shape": "EnvironmentId" + }, + "name": { + "shape": "SubscriptionTargetName" + }, + "type": { + "shape": "String" + }, + "createdBy": { + "shape": "CreatedBy" + }, + "updatedBy": { + "shape": "UpdatedBy" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "updatedAt": { + "shape": "UpdatedAt" + }, + "manageAccessRole": { + "shape": "IamRoleArn" + }, + "applicableAssetTypes": { + "shape": "ApplicableAssetTypes" + }, + "subscriptionTargetConfig": { + "shape": "SubscriptionTargetForms" + }, + "provider": { + "shape": "String" + }, + "timeoutMinutes": { + "shape": "UpdateSubscriptionTargetOutputTimeoutMinutesInteger" + } + } + }, + "UpdateSubscriptionTargetOutputTimeoutMinutesInteger": { + "type": "integer", + "box": true, + "min": 1 + }, + "UpdateUserProfileInput": { + "type": "structure", + "required": ["domainIdentifier", "userIdentifier", "status"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "userIdentifier": { + "shape": "UserIdentifier", + "location": "uri", + "locationName": "userIdentifier" + }, + "type": { + "shape": "UserProfileType" + }, + "status": { + "shape": "UserProfileStatus" + } + } + }, + "UpdateUserProfileOutput": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "UserProfileId" + }, + "type": { + "shape": "UserProfileType" + }, + "status": { + "shape": "UserProfileStatus" + }, + "details": { + "shape": "UserProfileDetails" + } + } + }, + "UpdatedAt": { + "type": "timestamp" + }, + "UpdatedAtTimestamp": { + "type": "timestamp", + "timestampFormat": "iso8601" + }, + "UpdatedBy": { + "type": "string" + }, + "UseAssetTypePolicyGrantDetail": { + "type": "structure", + "members": { + "domainUnitId": { + "shape": "DomainUnitId" + } + } + }, + "UserAssignment": { + "type": "string", + "enum": ["AUTOMATIC", "MANUAL"] + }, + "UserDesignation": { + "type": "string", + "enum": [ + "PROJECT_OWNER", + "PROJECT_CONTRIBUTOR", + "PROJECT_CATALOG_VIEWER", + "PROJECT_CATALOG_CONSUMER", + "PROJECT_CATALOG_STEWARD", + "PROJECT_ADMIN", + "PROJECT_MANAGER" + ] + }, + "UserDetails": { + "type": "structure", + "required": ["userId"], + "members": { + "userId": { + "shape": "String" + } + } + }, + "UserGroupPolicyPrincipal": { + "type": "structure", + "members": { + "user": { + "shape": "UserPolicyPrincipal" + }, + "group": { + "shape": "GroupPolicyPrincipal" + } + }, + "union": true + }, + "UserIdentifier": { + "type": "string", + "pattern": ".*(^([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$|^[a-zA-Z_0-9+=,.@-]+$|^arn:aws[^:]*:iam::\\d{12}:.+$).*" + }, + "UserPolicyGrantPrincipal": { + "type": "structure", + "members": { + "userIdentifier": { + "shape": "UserIdentifier" + }, + "allUsersGrantFilter": { + "shape": "AllUsersGrantFilter" + } + }, + "union": true + }, + "UserPolicyPrincipal": { + "type": "structure", + "members": { + "userIdentifier": { + "shape": "UserIdentifier" + } + } + }, + "UserProfile": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "UserProfileId" + }, + "type": { + "shape": "UserProfileType" + }, + "status": { + "shape": "UserProfileStatus" + }, + "details": { + "shape": "UserProfileDetails" + } + } + }, + "UserProfileDetails": { + "type": "structure", + "members": { + "iam": { + "shape": "IamUserProfileDetails" + }, + "sso": { + "shape": "SsoUserProfileDetails" + } + }, + "union": true + }, + "UserProfileId": { + "type": "string", + "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + }, + "UserProfileName": { + "type": "string", + "max": 1024, + "min": 1, + "pattern": "[a-zA-Z_0-9+=,.@-]+", + "sensitive": true + }, + "UserProfileStatus": { + "type": "string", + "enum": ["ASSIGNED", "NOT_ASSIGNED", "ACTIVATED", "DEACTIVATED", "ARCHIVED"] + }, + "UserProfileSummaries": { + "type": "list", + "member": { + "shape": "UserProfileSummary" + } + }, + "UserProfileSummary": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "UserProfileId" + }, + "type": { + "shape": "UserProfileType" + }, + "status": { + "shape": "UserProfileStatus" + }, + "details": { + "shape": "UserProfileDetails" + } + } + }, + "UserProfileType": { + "type": "string", + "enum": ["IAM", "SSO", "SAML"] + }, + "UserSearchText": { + "type": "string", + "max": 1024, + "min": 0, + "sensitive": true + }, + "UserSearchType": { + "type": "string", + "enum": ["SSO_USER", "DATAZONE_USER", "DATAZONE_SSO_USER", "DATAZONE_IAM_USER"] + }, + "UserType": { + "type": "string", + "enum": ["IAM_USER", "IAM_ROLE", "SSO_USER"] + }, + "Username": { + "type": "string", + "max": 127, + "min": 1, + "pattern": "[\\S]*" + }, + "UsernamePassword": { + "type": "structure", + "required": ["password", "username"], + "members": { + "password": { + "shape": "Password" + }, + "username": { + "shape": "Username" + } + }, + "sensitive": true + }, + "UsernamePasswordCredentials": { + "type": "structure", + "required": ["username", "password"], + "members": { + "username": { + "shape": "String" + }, + "password": { + "shape": "String" + } + }, + "internalonly": true, + "sensitive": true + }, + "ValidatePassRoleRequest": { + "type": "structure", + "required": ["roleArn", "domainId"], + "members": { + "roleArn": { + "shape": "String" + }, + "domainId": { + "shape": "DomainId" + } + } + }, + "ValidatePassRoleResponse": { + "type": "structure", + "members": { + "validationSuccessful": { + "shape": "Boolean" + } + } + }, + "ValidateResourceSharingRequest": { + "type": "structure", + "required": ["ownerAccountId", "resource"], + "members": { + "ownerAccountId": { + "shape": "AwsAccountId" + }, + "resource": { + "shape": "RAMResourceARN" + }, + "internalId": { + "shape": "RAMInternalId" + } + } + }, + "ValidateResourceSharingResponse": { + "type": "structure", + "required": ["validationResult"], + "members": { + "validationResult": { + "shape": "RAMValidationResult" + }, + "validationMessage": { + "shape": "String" + }, + "internalId": { + "shape": "RAMInternalId" + } + } + }, + "ValidationException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "WarehouseMetadataListingTarget": { + "type": "string", + "enum": ["CLUSTER", "WORKGROUP"] + }, + "WorkflowsMwaaPropertiesInput": { + "type": "structure", + "members": { + "mwaaEnvironmentName": { + "shape": "String" + } + } + }, + "WorkflowsMwaaPropertiesOutput": { + "type": "structure", + "members": { + "mwaaEnvironmentName": { + "shape": "String" + } + } + }, + "WorkflowsServerlessPropertiesInput": { + "type": "structure", + "members": {} + }, + "WorkflowsServerlessPropertiesOutput": { + "type": "structure", + "members": {} + } + } +} diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts new file mode 100644 index 00000000000..59051dad115 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts @@ -0,0 +1,345 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import * as sinon from 'sinon' +import { + DataZoneDomainPreferencesClient, + DataZoneDomain, +} from '../../../../sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient' + +describe('DataZoneDomainPreferencesClient', () => { + let client: DataZoneDomainPreferencesClient + let mockAuthProvider: any + const testRegion = 'us-east-1' + + beforeEach(() => { + // Create mock auth provider + mockAuthProvider = { + isConnected: sinon.stub().returns(true), + onDidChangeActiveConnection: sinon.stub().returns({ + dispose: sinon.stub(), + }), + } as any + + // Clear instances and create new client + DataZoneDomainPreferencesClient.dispose() + client = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) + }) + + afterEach(() => { + sinon.restore() + DataZoneDomainPreferencesClient.dispose() + }) + + describe('getInstance', () => { + it('should return singleton instance for same region', () => { + const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) + const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) + + assert.strictEqual(instance1, instance2) + }) + + it('should create different instances for different regions', () => { + const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-east-1') + const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-west-2') + + assert.notStrictEqual(instance1, instance2) + }) + + it('should create new instance after dispose', () => { + const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) + DataZoneDomainPreferencesClient.dispose() + const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) + + assert.notStrictEqual(instance1, instance2) + }) + }) + + describe('dispose', () => { + it('should clear all instances', () => { + const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-east-1') + const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-west-2') + + DataZoneDomainPreferencesClient.dispose() + + // Should create new instance after dispose + const newInstance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-east-1') + const newInstance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-west-2') + + assert.notStrictEqual(instance1, newInstance1) + assert.notStrictEqual(instance2, newInstance2) + }) + }) + + describe('getRegion', () => { + it('should return configured region', () => { + const result = client.getRegion() + assert.strictEqual(result, testRegion) + }) + }) + + describe('listDomains', () => { + it('should list domains with pagination', async () => { + const mockResponse = { + items: [ + { + id: 'dzd_domain1', + name: 'Test Domain 1', + description: 'First test domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1', + managedAccountId: '123456789012', + status: 'AVAILABLE', + portalUrl: 'https://domain1.datazone.aws', + createdAt: '2023-01-01T00:00:00Z', + lastUpdatedAt: '2023-01-02T00:00:00Z', + domainVersion: '1.0', + preferences: { DOMAIN_MODE: 'STANDARD' }, + }, + ], + nextToken: 'next-token', + } + + const mockDataZoneClient = { + listDomains: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) + + const result = await client.listDomains({ + maxResults: 10, + status: 'AVAILABLE', + }) + + assert.strictEqual(result.domains.length, 1) + assert.strictEqual(result.domains[0].id, 'dzd_domain1') + assert.strictEqual(result.domains[0].name, 'Test Domain 1') + assert.strictEqual(result.domains[0].arn, 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1') + assert.strictEqual(result.domains[0].managedAccountId, '123456789012') + assert.strictEqual(result.domains[0].status, 'AVAILABLE') + assert.strictEqual(result.nextToken, 'next-token') + assert.ok(result.domains[0].createdAt instanceof Date) + assert.ok(result.domains[0].lastUpdatedAt instanceof Date) + }) + + it('should handle empty results', async () => { + const mockResponse = { + items: [], + nextToken: undefined, + } + + const mockDataZoneClient = { + listDomains: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) + + const result = await client.listDomains() + + assert.strictEqual(result.domains.length, 0) + assert.strictEqual(result.nextToken, undefined) + }) + + it('should handle API errors', async () => { + const error = new Error('API Error') + sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').rejects(error) + + await assert.rejects(() => client.listDomains(), error) + }) + }) + + describe('fetchAllDomains', () => { + it('should fetch all domains by handling pagination', async () => { + const listDomainsStub = sinon.stub() + + // First call returns first page with nextToken + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_domain1', + name: 'Domain 1', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1', + managedAccountId: '123456789012', + status: 'AVAILABLE', + } as DataZoneDomain, + ], + nextToken: 'next-page-token', + }) + + // Second call returns second page with no nextToken + listDomainsStub.onSecondCall().resolves({ + domains: [ + { + id: 'dzd_domain2', + name: 'Domain 2', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain2', + managedAccountId: '123456789012', + status: 'AVAILABLE', + } as DataZoneDomain, + ], + nextToken: undefined, + }) + + // Replace the listDomains method with our stub + client.listDomains = listDomainsStub + + const result = await client.fetchAllDomains({ status: 'AVAILABLE' }) + + assert.strictEqual(result.length, 2) + assert.strictEqual(result[0].id, 'dzd_domain1') + assert.strictEqual(result[1].id, 'dzd_domain2') + + // Verify listDomains was called correctly + assert.strictEqual(listDomainsStub.callCount, 2) + assert.deepStrictEqual(listDomainsStub.firstCall.args[0], { + status: 'AVAILABLE', + maxResults: 25, + nextToken: undefined, + }) + assert.deepStrictEqual(listDomainsStub.secondCall.args[0], { + status: 'AVAILABLE', + maxResults: 25, + nextToken: 'next-page-token', + }) + }) + + it('should return empty array when no domains found', async () => { + const listDomainsStub = sinon.stub().resolves({ + domains: [], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.fetchAllDomains() + + assert.strictEqual(result.length, 0) + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should handle errors gracefully', async () => { + const listDomainsStub = sinon.stub().rejects(new Error('API error')) + + client.listDomains = listDomainsStub + + await assert.rejects(() => client.fetchAllDomains(), /API error/) + }) + }) + + describe('getDomain', () => { + it('should find EXPRESS domain', async () => { + const listDomainsStub = sinon.stub() + + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_standard', + name: 'Standard Domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_standard', + managedAccountId: '123456789012', + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'STANDARD' }, + }, + { + id: 'dzd_express', + name: 'Express Domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_express', + managedAccountId: '123456789012', + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'EXPRESS' }, + }, + ] as DataZoneDomain[], + nextToken: 'next-token', + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.ok(result) + assert.strictEqual(result.id, 'dzd_express') + assert.strictEqual(result.name, 'Express Domain') + assert.strictEqual(result.preferences.DOMAIN_MODE, 'EXPRESS') + + // Should only call once since EXPRESS domain found on first page + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should return undefined when no EXPRESS domain found', async () => { + const listDomainsStub = sinon.stub() + + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_standard', + name: 'Standard Domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_standard', + managedAccountId: '123456789012', + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'STANDARD' }, + }, + ] as DataZoneDomain[], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.strictEqual(result, undefined) + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should return undefined when no domains found', async () => { + const listDomainsStub = sinon.stub().resolves({ + domains: [], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.strictEqual(result, undefined) + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should handle domains without preferences', async () => { + const listDomainsStub = sinon.stub() + + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_no_prefs', + name: 'Domain Without Preferences', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_no_prefs', + managedAccountId: '123456789012', + status: 'AVAILABLE', + // No preferences field + }, + ] as DataZoneDomain[], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.strictEqual(result, undefined) + }) + + it('should handle API errors', async () => { + const listDomainsStub = sinon.stub().rejects(new Error('API error')) + + client.listDomains = listDomainsStub + + await assert.rejects(() => client.getExpressDomain(), /Failed to get domain info: API error/) + }) + }) +}) From 80b4b3d9d590285fdeffc6856960d5ab8945437f Mon Sep 17 00:00:00 2001 From: Bhargav Date: Tue, 7 Oct 2025 16:46:18 -0700 Subject: [PATCH 03/53] feat(smus): Support IAM auth connections for SMUS (#2240) **Description** Added connection tracking and management for SMUS IAM auth flow. This for now picks the first domain from ListDomains but needs to be later adjusted to pick the express domain. **Testing Done** Unit tests and also tested existing and new flows manually. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../auth/authenticationOrchestrator.ts | 131 ++++- .../src/sagemakerunifiedstudio/auth/model.ts | 85 ++- .../providers/smusAuthenticationProvider.ts | 554 ++++++++++++++++-- .../sageMakerUnifiedStudioAuthInfoNode.ts | 5 +- .../nodes/sageMakerUnifiedStudioRootNode.ts | 75 ++- .../shared/client/credentialsAdapter.ts | 3 +- .../shared/client/datazoneClient.ts | 20 +- .../client/datazoneDomainPreferencesClient.ts | 61 +- .../shared/smusUtils.ts | 10 + .../shared/telemetry.ts | 2 +- packages/core/src/shared/vscode/setContext.ts | 1 + .../sagemakerunifiedstudio/auth/model.test.ts | 348 +++++------ .../auth/smusAuthenticationProvider.test.ts | 459 ++++++++++++++- .../auth/ui/iamProfileSelection.test.ts | 164 +----- ...sageMakerUnifiedStudioAuthInfoNode.test.ts | 15 +- .../sageMakerUnifiedStudioRootNode.test.ts | 8 +- 16 files changed, 1437 insertions(+), 504 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index 099b8f0e60b..175abe491c8 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -8,12 +8,21 @@ import { getLogger } from '../../shared/logger/logger' import { ToolkitError } from '../../shared/errors' import { SmusErrorCodes } from '../shared/smusUtils' import { SmusAuthenticationProvider } from './providers/smusAuthenticationProvider' + import { SmusSsoAuthenticationUI } from './ui/ssoAuthentication' import { SmusIamProfileSelector } from './ui/iamProfileSelection' import { SmusAuthenticationPreferencesManager } from './preferences/authenticationPreferences' +import { DataZoneDomainPreferencesClient } from '../shared/client/datazoneDomainPreferencesClient' +import { recordAuthTelemetry } from '../shared/telemetry' export type SmusAuthenticationMethod = 'sso' | 'iam' +export type SmusAuthenticationResult = + | { status: 'SUCCESS' } + | { status: 'BACK' } + | { status: 'EDITING' } + | { status: 'INVALID_PROFILE'; error: string } + /** * Orchestrates SMUS authentication flows */ @@ -27,9 +36,8 @@ export class SmusAuthenticationOrchestrator { authProvider: SmusAuthenticationProvider, span: any, context: vscode.ExtensionContext - ): Promise<'SUCCESS' | 'BACK'> { + ): Promise { const logger = this.logger - logger.debug('SMUS Auth: Starting IAM authentication flow') try { // Show IAM profile selection dialog @@ -39,55 +47,73 @@ export class SmusAuthenticationOrchestrator { if ('isBack' in profileSelection) { // User chose to go back to authentication method selection logger.debug('SMUS Auth: User chose to go back to authentication method selection') - return 'BACK' + return { status: 'BACK' } } if ('isEditing' in profileSelection) { // User chose to edit credentials or is in editing mode logger.debug('SMUS Auth: User is editing credentials') - throw new ToolkitError('User is editing credentials. Please complete setup and try again.', { - code: SmusErrorCodes.UserCancelled, - cancelled: true, - }) + return { status: 'EDITING' } } - // At this point, we have a valid profile selection + // At this point, we have a profile selected logger.debug( `SMUS Auth: Selected profile: ${profileSelection.profileName}, region: ${profileSelection.region}` ) // Validate the selected profile - const validation = await SmusIamProfileSelector.validateProfile(profileSelection.profileName) + const validation = await authProvider.validateIamProfile(profileSelection.profileName) if (!validation.isValid) { - throw new ToolkitError(`Profile validation failed: ${validation.error}`, { - code: 'InvalidProfile', - }) + logger.debug(`SMUS Auth: Profile validation failed: ${validation.error}`) + return { status: 'INVALID_PROFILE', error: validation.error || 'Profile validation failed' } } - // Show status message - vscode.window.setStatusBarMessage('IAM profile selected successfully', 3000) + // Discover Express domain using IAM credential. If Express Domain is not present, we should throw an appropriate error + // and exit + logger.debug('SMUS Auth: Discovering Express domain using IAM credentials') + + const domainUrl = await this.findSmusExpressDomain( + authProvider, + profileSelection.profileName, + profileSelection.region + ) + if (!domainUrl) { + throw new ToolkitError('No SMUS Express domains found in the specified region', { + code: SmusErrorCodes.ExpressDomainNotFound, + cancelled: true, + }) + } - // Show friendly message about selected profile and feature status - void vscode.window.showInformationMessage( - `Profile '${profileSelection.profileName}' (${profileSelection.region}) has been selected. ` + - 'IAM authentication with SageMaker Unified Studio is not yet fully implemented. ' + - 'Please use SSO authentication for now.', - 'OK' + // Connect using IAM profile with Express domain flag + const connection = await authProvider.connectWithIamProfile( + profileSelection.profileName, + profileSelection.region, + domainUrl, + true // isExpressDomain - we found an Express domain ) + if (!connection) { + throw new ToolkitError('Failed to establish IAM connection', { + code: SmusErrorCodes.FailedAuthConnecton, + }) + } + logger.info( - `SMUS Auth: Profile selected - ${profileSelection.profileName} in ${profileSelection.region}. Feature not yet implemented.` + `SMUS Auth: Successfully connected with IAM profile ${profileSelection.profileName} in region ${profileSelection.region} to Express domain` ) // Ask to remember authentication method preference await this.askToRememberAuthMethod(context, 'iam') // Return success to complete the authentication flow gracefully - return 'SUCCESS' + return { status: 'SUCCESS' } } catch (error) { // Handle user cancellation (including editing mode) - if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { - logger.debug('IAM authentication cancelled by user') + if ( + error instanceof ToolkitError && + (error.code === SmusErrorCodes.UserCancelled || error.code === SmusErrorCodes.ExpressDomainNotFound) + ) { + logger.debug('IAM authentication cancelled by user or failed due to customer error') throw error // Re-throw to be handled by the main loop } else { // Log the error for actual failures @@ -104,7 +130,7 @@ export class SmusAuthenticationOrchestrator { authProvider: SmusAuthenticationProvider, span: any, context: vscode.ExtensionContext - ): Promise<'SUCCESS' | 'BACK'> { + ): Promise { const logger = this.logger logger.debug('SMUS Auth: Starting SSO authentication flow') @@ -116,7 +142,7 @@ export class SmusAuthenticationOrchestrator { if (domainUrl === 'BACK') { // User wants to go back to authentication method selection logger.debug('User chose to go back from domain URL input') - return 'BACK' + return { status: 'BACK' } } if (!domainUrl) { @@ -140,7 +166,7 @@ export class SmusAuthenticationOrchestrator { // Extract domain account ID, domain ID, and region for logging const domainId = connection.domainId - const region = connection.ssoRegion + const region = authProvider.getDomainRegion() // Use the auth provider method that handles both connection types logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) await this.recordAuthTelemetry(span, authProvider, domainId, region) @@ -155,7 +181,7 @@ export class SmusAuthenticationOrchestrator { logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) } - return 'SUCCESS' + return { status: 'SUCCESS' } } catch (connectionErr) { // Clear the status bar message vscode.window.setStatusBarMessage('Connection to SageMaker Unified Studio Failed') @@ -198,6 +224,53 @@ export class SmusAuthenticationOrchestrator { } } + /** + * Finds SMUS Express domain using IAM credentials + * @param authProvider The SMUS authentication provider + * @param profileName The AWS credential profile name + * @param region The AWS region + * @returns Promise resolving to domain URL or undefined if no Express domain found + */ + private static async findSmusExpressDomain( + authProvider: SmusAuthenticationProvider, + profileName: string, + region: string + ): Promise { + const logger = this.logger + + try { + logger.debug(`SMUS Auth: Finding Express domain in region ${region} using profile ${profileName}`) + + // Get DataZoneDomainPreferencesClient instance + const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance( + await authProvider.getCredentialsProviderForIamProfile(profileName), + region + ) + + // Find the Express domain using the client + const expressDomain = await domainPreferencesClient.getExpressDomain() + + if (!expressDomain) { + logger.warn(`SMUS Auth: No Express domain found in region ${region}`) + return undefined + } + + logger.debug(`SMUS Auth: Found Express domain: ${expressDomain.name} (${expressDomain.id})`) + + // Construct domain URL from the Express domain + const domainUrl = expressDomain.portalUrl || `https://${expressDomain.id}.sagemaker.${region}.on.aws/` + logger.info(`SMUS Auth: Discovered Express domain URL: ${domainUrl}`) + + return domainUrl + } catch (error) { + logger.error(`SMUS Auth: Failed to find Express domain: %s`, error) + throw new ToolkitError(`Failed to find SMUS Express domain: ${(error as Error).message}`, { + code: SmusErrorCodes.ApiTimeout, + cause: error instanceof Error ? error : undefined, + }) + } + } + /** * Records authentication telemetry */ @@ -207,8 +280,6 @@ export class SmusAuthenticationOrchestrator { domainId: string, region: string ): Promise { - // Import the telemetry function from the shared module - const { recordAuthTelemetry } = await import('../shared/telemetry.js') await recordAuthTelemetry(span, authProvider, domainId, region) } } diff --git a/packages/core/src/sagemakerunifiedstudio/auth/model.ts b/packages/core/src/sagemakerunifiedstudio/auth/model.ts index 6e60fa20e96..3dcef1c708e 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/model.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/model.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SsoProfile, SsoConnection } from '../../auth/connection' +import { SsoProfile, SsoConnection, Connection, IamConnection } from '../../auth/connection' /** * Scope for SageMaker Unified Studio authentication @@ -13,19 +13,34 @@ export const scopeSmus = 'datazone:domain:access' /** * SageMaker Unified Studio profile extending the base SSO profile */ -export interface SmusProfile extends SsoProfile { +export interface SmusSsoProfile extends SsoProfile { readonly domainUrl: string readonly domainId: string } /** - * SageMaker Unified Studio connection extending the base SSO connection + * SageMaker Unified Studio SSO connection extending the base SSO connection */ -export interface SmusConnection extends SmusProfile, SsoConnection { +export interface SmusSsoConnection extends SmusSsoProfile, SsoConnection { readonly id: string readonly label: string } +/** + * SageMaker Unified Studio IAM connection for credential profile authentication + */ +export interface SmusIamConnection extends IamConnection { + readonly profileName: string + readonly region: string + readonly domainUrl: string + readonly domainId: string +} + +/** + * Union type for all SMUS connection types (SSO and IAM) + */ +export type SmusConnection = SmusSsoConnection | SmusIamConnection + /** * Creates a SageMaker Unified Studio profile * @param domainUrl The SageMaker Unified Studio domain URL @@ -40,7 +55,7 @@ export function createSmusProfile( startUrl: string, region: string, scopes = [scopeSmus] -): SmusProfile & { readonly scopes: string[] } { +): SmusSsoProfile & { readonly scopes: string[] } { return { scopes, type: 'sso', @@ -52,17 +67,69 @@ export function createSmusProfile( } /** - * Checks if a connection is a valid SageMaker Unified Studio connection + * Type guard to check if a connection is a SMUS IAM connection * @param conn Connection to check - * @returns True if the connection is a valid SMUS connection + * @returns True if the connection is a SMUS IAM connection + */ +export function isSmusIamConnection(conn?: Connection): conn is SmusIamConnection { + return !!( + conn && + conn.type === 'iam' && + 'profileName' in conn && + 'region' in conn && + 'domainId' in conn && + typeof conn.profileName === 'string' && + typeof conn.region === 'string' && + typeof conn.domainId === 'string' + ) +} + +/** + * Type guard to check if a connection is a SMUS SSO connection + * @param conn Connection to check + * @returns True if the connection is a SMUS SSO connection */ -export function isValidSmusConnection(conn?: any): conn is SmusConnection { +export function isSmusSsoConnection(conn?: Connection): conn is SmusSsoConnection { if (!conn || conn.type !== 'sso') { return false } // Check if the connection has the required SMUS scope - const hasScope = Array.isArray(conn.scopes) && conn.scopes.includes(scopeSmus) + const hasScope = Array.isArray((conn as any).scopes) && (conn as any).scopes.includes(scopeSmus) // Check if the connection has the required SMUS properties const hasSmusProps = 'domainUrl' in conn && 'domainId' in conn return !!hasScope && !!hasSmusProps } + +/** + * Checks if a connection is a valid SageMaker Unified Studio connection (either SSO or IAM) + * @param conn Connection to check + * @param smusMetadata Optional SMUS metadata for IAM connections + * @returns True if the connection is a valid SMUS connection + */ +export function isValidSmusConnection(conn?: any, smusMetadata?: any): conn is SmusConnection | IamConnection { + // Accept SMUS SSO connections + if (isSmusSsoConnection(conn)) { + return true + } + + // For IAM connections, check if they have SMUS metadata either in the connection or separately + if (conn && conn.type === 'iam') { + // Check if connection already has SMUS properties + if (isSmusIamConnection(conn)) { + return true + } + + // Check if we have separate SMUS metadata for this IAM connection + if ( + smusMetadata && + typeof smusMetadata.profileName === 'string' && + typeof smusMetadata.region === 'string' && + typeof smusMetadata.domainUrl === 'string' && + typeof smusMetadata.domainId === 'string' + ) { + return true + } + } + + return false +} diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index 6c0f204cbd3..e36c897083d 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -4,6 +4,7 @@ */ import * as vscode from 'vscode' +import { AwsCredentialIdentity } from '@aws-sdk/types' import { Auth } from '../../../auth/auth' import { getSecondaryAuth } from '../../../auth/secondaryAuth' import { ToolkitError } from '../../../shared/errors' @@ -15,16 +16,28 @@ import { ToolkitPromptSettings } from '../../../shared/settings' import { setContext, getContext } from '../../../shared/vscode/setContext' import { getLogger } from '../../../shared/logger/logger' import { SmusUtils, SmusErrorCodes, extractAccountIdFromResourceMetadata } from '../../shared/smusUtils' -import { createSmusProfile, isValidSmusConnection, SmusConnection } from '../model' +import { + createSmusProfile, + isValidSmusConnection, + SmusConnection, + SmusIamConnection, + isSmusSsoConnection, +} from '../model' + import { DomainExecRoleCredentialsProvider } from './domainExecRoleCredentialsProvider' import { ProjectRoleCredentialsProvider } from './projectRoleCredentialsProvider' import { ConnectionCredentialsProvider } from './connectionCredentialsProvider' import { ConnectionClientStore } from '../../shared/client/connectionClientStore' import { getResourceMetadata } from '../../shared/utils/resourceMetadataUtils' +import { CredentialsProviderManager } from '../../../auth/providers/credentialsProviderManager' +import { SharedCredentialsProvider } from '../../../auth/providers/sharedCredentialsProvider' +import { CredentialsId, CredentialsProvider } from '../../../auth/providers/credentials' +import globals from '../../../shared/extensionGlobals' import { fromIni } from '@aws-sdk/credential-providers' import { randomUUID } from '../../../shared/crypto' import { DefaultStsClient } from '../../../shared/clients/stsClient' import { DataZoneClient } from '../../shared/client/datazoneClient' +import { DataZoneDomainPreferencesClient } from '../../shared/client/datazoneDomainPreferencesClient' /** * Sets the context variable for SageMaker Unified Studio connection state @@ -41,6 +54,14 @@ export function setSmusConnectedContext(isConnected: boolean): Promise { export function setSmusSpaceEnvironmentContext(inSmusSpace: boolean): Promise { return setContext('aws.smus.inSmusSpaceEnvironment', inSmusSpace) } + +/** + * Sets the context variable for SMUS Express mode state + * @param isExpressMode Whether the current domain is in Express mode + */ +export function setSmusExpressModeContext(isExpressMode: boolean): Promise { + return setContext('aws.smus.isExpressMode', isExpressMode) +} const authClassName = 'SmusAuthenticationProvider' /** @@ -49,7 +70,7 @@ const authClassName = 'SmusAuthenticationProvider' */ export class SmusAuthenticationProvider { private readonly logger = getLogger() - public readonly onDidChangeActiveConnection = this.secondaryAuth.onDidChangeActiveConnection + public readonly onDidChangeActiveConnection: vscode.Event private readonly onDidChangeEmitter = new vscode.EventEmitter() public readonly onDidChange = this.onDidChangeEmitter.event private credentialsProviderCache = new Map() @@ -58,16 +79,48 @@ export class SmusAuthenticationProvider { private cachedDomainAccountId: string | undefined private cachedProjectAccountIds = new Map() - public constructor( - public readonly auth = Auth.instance, - public readonly secondaryAuth = getSecondaryAuth( + public readonly secondaryAuth: ReturnType + + public constructor(public readonly auth = Auth.instance) { + // Create secondaryAuth after the class is constructed so we can reference instance methods + this.secondaryAuth = getSecondaryAuth( auth, 'smus', 'SageMaker Unified Studio', - isValidSmusConnection + (conn): conn is SmusConnection => { + // Use auth's state directly since secondaryAuth isn't available yet during initialization + const state = auth.getStateMemento() + const smusConnections = state.get('smus.connections') as any + const savedConnectionId = state.get('smus.savedConnectionId') as string + + // Only accept IAM connections that are currently saved for SMUS + if (conn && conn.type === 'iam') { + // Must be the exact connection that SMUS has saved AND have metadata + return ( + conn.id === savedConnectionId && + smusConnections && + smusConnections[conn.id] && + isValidSmusConnection(conn, smusConnections[conn.id]) + ) + } + + // SSO connections: Check if they have SMUS scope (always SMUS-specific) + if (conn && conn.type === 'sso') { + return isValidSmusConnection(conn) // Checks for SMUS scope + } + + // Reject everything else + return false + } ) - ) { - this.onDidChangeActiveConnection(async () => { + + // Initialize the event property + this.onDidChangeActiveConnection = this.secondaryAuth.onDidChangeActiveConnection as vscode.Event< + SmusConnection | undefined + > + + // Set up event listeners + this.secondaryAuth.onDidChangeActiveConnection(async () => { // Stop SSH credential refresh for all projects when connection changes this.stopAllSshCredentialRefresh() @@ -87,12 +140,39 @@ export class SmusAuthenticationProvider { ConnectionClientStore.getInstance().clearAll() await setSmusConnectedContext(this.isConnected()) await setSmusSpaceEnvironmentContext(SmusUtils.isInSmusSpaceEnvironment()) + + // Set Express mode context based on connection metadata + const activeConn = this.activeConnection + if (activeConn && 'type' in activeConn && activeConn.type === 'iam') { + const smusConnections = (this.secondaryAuth.state.get('smus.connections') as any) || {} + const connectionMetadata = smusConnections[activeConn.id] + const isExpressDomain = connectionMetadata?.isExpressDomain || false + await setSmusExpressModeContext(isExpressDomain) + } else { + // Clear Express mode context for non-IAM connections or no connection + await setSmusExpressModeContext(false) + } + this.onDidChangeEmitter.fire() }) // Set initial context in case event does not trigger void setSmusConnectedContext(this.isConnectionValid()) void setSmusSpaceEnvironmentContext(SmusUtils.isInSmusSpaceEnvironment()) + + // Set initial Express mode context + void (async () => { + const activeConn = this.activeConnection + if (activeConn && 'type' in activeConn && activeConn.type === 'iam') { + const state = this.auth.getStateMemento() + const smusConnections = (state.get('smus.connections') as any) || {} + const connectionMetadata = smusConnections[activeConn.id] + const isExpressDomain = connectionMetadata?.isExpressDomain || false + await setSmusExpressModeContext(isExpressDomain) + } else { + await setSmusExpressModeContext(false) + } + })() } /** @@ -109,24 +189,53 @@ export class SmusAuthenticationProvider { /** * Gets the active connection */ - public get activeConnection() { + public get activeConnection(): SmusConnection | undefined { if (getContext('aws.smus.inSmusSpaceEnvironment')) { const resourceMetadata = getResourceMetadata()! if (resourceMetadata.AdditionalMetadata!.DataZoneDomainRegion) { + // Return a mock connection object for SMUS space environment + // This is typed as SmusConnection to satisfy type checking return { domainId: resourceMetadata.AdditionalMetadata!.DataZoneDomainId!, ssoRegion: resourceMetadata.AdditionalMetadata!.DataZoneDomainRegion!, - // The following fields won't be needed in SMUS space environment - // Craft the domain url with known information - // Use randome id as placeholder domainUrl: `https://${resourceMetadata.AdditionalMetadata!.DataZoneDomainId!}.sagemaker.${resourceMetadata.AdditionalMetadata!.DataZoneDomainRegion!}.on.aws/`, id: randomUUID(), - } + } as any as SmusConnection } else { throw new ToolkitError('Domain region not found in metadata file.') } } - return this.secondaryAuth.activeConnection + const baseConnection = this.secondaryAuth.activeConnection + + // If we have a connection, wrap it with SMUS metadata if available + if (baseConnection) { + const smusConnections = this.secondaryAuth.state.get('smus.connections') as any + const connectionMetadata = smusConnections?.[baseConnection.id] + + if (connectionMetadata) { + // For IAM connections, add the profile-specific metadata + if (baseConnection.type === 'iam') { + return { + ...baseConnection, + profileName: connectionMetadata.profileName, + region: connectionMetadata.region, + domainUrl: connectionMetadata.domainUrl, + domainId: connectionMetadata.domainId, + } as SmusIamConnection + } + // For SSO connections, the metadata is already in the connection object + // but we can ensure consistency by adding any missing properties + else if (baseConnection.type === 'sso') { + return { + ...baseConnection, + domainUrl: connectionMetadata.domainUrl || (baseConnection as any).domainUrl, + domainId: connectionMetadata.domainId || (baseConnection as any).domainId, + } as SmusConnection + } + } + } + + return baseConnection as SmusConnection | undefined } /** @@ -168,6 +277,61 @@ export class SmusAuthenticationProvider { await this.secondaryAuth.restoreConnection() } + /** + * Signs out from SMUS with different behavior based on connection type: + * - SSO connections: Deletes the connection (old behavior) + * - IAM connections: Forgets the connection without affecting the underlying IAM profile + */ + @withTelemetryContext({ name: 'signOut', class: authClassName }) + public async signOut() { + const logger = getLogger() + + const activeConnection = this.activeConnection + if (!activeConnection) { + logger.debug('SMUS: No active connection to sign out from') + return + } + + const connectionId = activeConnection.id + logger.info(`SMUS: Signing out from connection ${connectionId}`) + + try { + // Clear SMUS-specific metadata from connections registry + const smusConnections = (this.secondaryAuth.state.get('smus.connections') as any) || {} + if (smusConnections[connectionId]) { + delete smusConnections[connectionId] + await this.secondaryAuth.state.update('smus.connections', smusConnections) + } + + // Handle sign-out based on connection type + // Check if this is a real connection (has 'type' property) vs mock connection in SMUS space + if ('type' in activeConnection && isSmusSsoConnection(activeConnection)) { + // For SSO connections, delete the connection (old behavior) + await this.secondaryAuth.deleteConnection() + logger.info(`SMUS: Deleted SSO connection ${connectionId}`) + } else if ('type' in activeConnection) { + // For IAM connections, forget the connection without affecting the underlying IAM profile + await this.secondaryAuth.forgetConnection() + logger.info(`SMUS: Forgot IAM connection ${connectionId} (preserved for other services)`) + + // Clear Express mode context for IAM connections + await setSmusExpressModeContext(false) + logger.debug('SMUS: Cleared Express mode context') + } else { + // Mock connection in SMUS space environment - no action needed + logger.info(`SMUS: Sign out completed for mock connection ${connectionId}`) + } + + logger.info(`SMUS: Successfully signed out from connection ${connectionId}`) + } catch (error) { + logger.error(`SMUS: Failed to sign out from connection ${connectionId}:`, error) + throw new ToolkitError('Failed to sign out from SageMaker Unified Studio', { + code: 'SignOutFailed', + cause: error instanceof Error ? error : undefined, + }) + } + } + /** * Authenticates with SageMaker Unified Studio using a domain URL * @param domainUrl The SageMaker Unified Studio domain URL @@ -202,38 +366,56 @@ export class SmusAuthenticationProvider { if (connectionState === 'valid') { logger.info('SMUS: Using existing valid connection') - // Use the existing connection - const result = await this.secondaryAuth.useNewConnection(existingConn) - - // Auto-invoke project selection after successful sign-in (but not in SMUS space environment) - if (!SmusUtils.isInSmusSpaceEnvironment()) { - void vscode.commands.executeCommand('aws.smus.switchProject') + // Only SSO connections can be used with connectToSmus + if (isSmusSsoConnection(existingConn)) { + // Use the existing SSO connection + const result = await this.secondaryAuth.useNewConnection(existingConn) + + // Auto-invoke project selection after successful sign-in (but not in SMUS space environment) + if (!SmusUtils.isInSmusSpaceEnvironment()) { + void vscode.commands.executeCommand('aws.smus.switchProject') + } + + return result as SmusConnection + } else { + // For IAM connections, we can't use connectToSmus - this method is only for SSO connections + throw new ToolkitError( + 'Cannot connect to SMUS with SSO method using an existing IAM connection. Please use connectWithIamProfile instead.', + { + code: 'InvalidConnectionType', + } + ) } - - return result } - // If connection is invalid or expired, reauthenticate + // If connection is invalid or expired, handle based on connection type if (connectionState === 'invalid') { - logger.info('SMUS: Existing connection is invalid, reauthenticating') - const reauthenticatedConn = await this.reauthenticate(existingConn) - - // Create the SMUS connection wrapper - const smusConn: SmusConnection = { - ...reauthenticatedConn, - domainUrl, - domainId, + // Only SSO connections can be reauthenticated + if (isSmusSsoConnection(existingConn)) { + logger.info('SMUS: Existing SSO connection is invalid, reauthenticating') + const reauthenticatedConn = await this.reauthenticate(existingConn) + + // Create the SMUS connection wrapper + const smusConn: SmusConnection = { + ...reauthenticatedConn, + domainUrl, + domainId, + } + + const result = await this.secondaryAuth.useNewConnection(smusConn) + logger.debug(`SMUS: Reauthenticated connection successfully, id=${result.id}`) + + // Auto-invoke project selection after successful reauthentication (but not in SMUS space environment) + if (!SmusUtils.isInSmusSpaceEnvironment()) { + void vscode.commands.executeCommand('aws.smus.switchProject') + } + + return result as SmusConnection + } else { + // For IAM connections, we can't reauthenticate - need to create a new connection + logger.info('SMUS: Existing IAM connection is invalid, will create new SSO connection') + // Fall through to create new SSO connection logic } - - const result = await this.secondaryAuth.useNewConnection(smusConn) - logger.debug(`SMUS: Reauthenticated connection successfully, id=${result.id}`) - - // Auto-invoke project selection after successful reauthentication (but not in SMUS space environment) - if (!SmusUtils.isInSmusSpaceEnvironment()) { - void vscode.commands.executeCommand('aws.smus.switchProject') - } - - return result } } @@ -261,7 +443,7 @@ export class SmusAuthenticationProvider { void vscode.commands.executeCommand('aws.smus.switchProject') } - return result + return result as SmusConnection } catch (e) { throw ToolkitError.chain(e, 'Failed to connect to SageMaker Unified Studio', { code: 'FailedToConnect', @@ -269,6 +451,212 @@ export class SmusAuthenticationProvider { } } + /** + * Authenticates with SageMaker Unified Studio using IAM credential profile + * @param profileName The AWS credential profile name + * @param region The AWS region + * @param domainUrl The SageMaker Unified Studio domain URL + * @param isExpressDomain Whether the domain is an Express domain + * @returns Promise resolving to the IAM connection + */ + @withTelemetryContext({ name: 'connectWithIamProfile', class: authClassName }) + public async connectWithIamProfile( + profileName: string, + region: string, + domainUrl: string, + isExpressDomain: boolean = false + ): Promise { + const logger = getLogger() + + try { + // Extract domain info using SmusUtils + const { domainId } = SmusUtils.extractDomainInfoFromUrl(domainUrl) + + // Validate domain ID + if (!domainId) { + throw new ToolkitError('Invalid domain URL format', { code: 'InvalidDomainUrl' }) + } + + logger.info(`SMUS: Connecting with IAM profile ${profileName} to domain ${domainId} in region ${region}`) + + // Note: Credential validation is already done in the orchestrator via validateIamProfile() + // No need for redundant validation here + + // Check if we already have a basic IAM connection for this profile + const profileId = `profile:${profileName}` + const existingConn = await this.auth.getConnection({ id: profileId }) + + if (existingConn && existingConn.type === 'iam') { + logger.info(`SMUS: Found existing IAM profile connection ${profileId}`) + + // Store SMUS metadata in the connections registry + const smusConnections = (this.secondaryAuth.state.get('smus.connections') as any) || {} + smusConnections[existingConn.id] = { + profileName, + region, + domainUrl, + domainId, + isExpressDomain, + } + await this.secondaryAuth.state.update('smus.connections', smusConnections) + + // Use the basic IAM connection with secondaryAuth + await this.secondaryAuth.useNewConnection(existingConn) + + // Ensure the connection state is validated + await this.auth.refreshConnectionState(existingConn) + logger.debug( + `SMUS: Using existing IAM connection as SMUS connection successfully, id=${existingConn.id}` + ) + + // Auto-invoke project selection after successful sign-in (but not in SMUS space environment) + if (!SmusUtils.isInSmusSpaceEnvironment()) { + void vscode.commands.executeCommand('aws.smus.switchProject') + } + + // Return a SMUS IAM connection wrapper for the caller + const smusIamConn: SmusIamConnection = { + ...existingConn, + profileName, + region, + domainUrl, + domainId, + } + + return smusIamConn + } + + // If no existing connection, the auth system should have created one during profile validation + // This shouldn't happen if credentials are valid, but let's handle it gracefully + throw new ToolkitError( + `IAM profile connection not found for '${profileName}'. Please check your AWS credentials configuration.`, + { + code: 'ConnectionNotFound', + } + ) + } catch (e) { + throw ToolkitError.chain(e, 'Failed to connect to SageMaker Unified Studio with IAM profile', { + code: 'FailedToConnect', + }) + } + } + + /** + * Validates an IAM credential profile using the existing Toolkit validation infrastructure + * @param profileName Profile name to validate + * @returns Promise resolving to validation result + */ + public async validateIamProfile(profileName: string): Promise<{ isValid: boolean; error?: string }> { + const logger = getLogger() + + try { + logger.debug(`SMUS: Validating IAM profile: ${profileName}`) + + // Create credentials ID for the profile using the existing Toolkit pattern + const credentialsId: CredentialsId = { + credentialSource: SharedCredentialsProvider.getProviderType(), + credentialTypeId: profileName, + } + + // Get the provider using the existing manager + const provider = await CredentialsProviderManager.getInstance().getCredentialsProvider(credentialsId) + if (!provider) { + return { + isValid: false, + error: `Profile '${profileName}' not found or not available`, + } + } + + // Get credentials and validate using the existing Toolkit validation logic + // This includes proper telemetry and error handling + const credentials = await provider.getCredentials() + await globals.loginManager.validateCredentials( + credentials, + provider.getEndpointUrl?.(), + provider.getDefaultRegion() // Use the region from the profile, not hardcoded + ) + + logger.debug(`SMUS: Profile validation successful: ${profileName}`) + return { isValid: true } + } catch (error) { + logger.error(`SMUS: Profile validation failed: ${profileName}`, error) + return { + isValid: false, + error: `Invalid profile '${profileName}' - ${(error as Error).message}`, + } + } + } + + /** + * Gets credentials for an IAM profile using Toolkit providers + * @param profileName AWS profile name + * @returns Promise resolving to credentials + */ + public async getCredentialsForIamProfile(profileName: string): Promise { + const logger = getLogger() + + try { + logger.debug(`SMUS: Getting credentials for IAM profile: ${profileName}`) + + // Create credentials ID for the profile using the existing Toolkit pattern + const credentialsId: CredentialsId = { + credentialSource: SharedCredentialsProvider.getProviderType(), + credentialTypeId: profileName, + } + + // Get the provider using the existing manager + const provider = await CredentialsProviderManager.getInstance().getCredentialsProvider(credentialsId) + if (!provider) { + throw new ToolkitError(`Profile '${profileName}' not found or not available`, { + code: SmusErrorCodes.ProfileNotFound, + }) + } + + // Get credentials using the existing Toolkit provider + const credentials = await provider.getCredentials() + + logger.debug(`SMUS: Successfully retrieved credentials for IAM profile: ${profileName}`) + return credentials + } catch (error) { + logger.error(`SMUS: Failed to get credentials for IAM profile ${profileName}: %s`, error) + throw new ToolkitError( + `Failed to get credentials for profile '${profileName}': ${(error as Error).message}`, + { + code: SmusErrorCodes.CredentialRetrievalFailed, + cause: error instanceof Error ? error : undefined, + } + ) + } + } + + /** + * Gets the underlying credentials provider for an IAM profile + * @param profileName AWS profile name + * @returns Promise resolving to the credentials provider + */ + public async getCredentialsProviderForIamProfile(profileName: string): Promise { + const logger = getLogger() + logger.debug(`SMUS: Getting credentials provider for IAM profile: ${profileName}`) + + // Create credentials ID for the profile using the existing Toolkit pattern + const credentialsId: CredentialsId = { + credentialSource: SharedCredentialsProvider.getProviderType(), + credentialTypeId: profileName, + } + + // Get the provider using the existing manager + const provider = await CredentialsProviderManager.getInstance().getCredentialsProvider(credentialsId) + if (!provider) { + throw new ToolkitError(`Profile '${profileName}' not found or not available`, { + code: SmusErrorCodes.ProfileNotFound, + }) + } + + // Return the underlying provider directly + // This allows callers to use the provider's full interface including caching and refresh + return provider + } + /** * Reauthenticates an existing connection * @param conn Connection to reauthenticate @@ -308,20 +696,26 @@ export class SmusAuthenticationProvider { public async getAccessToken(): Promise { const logger = getLogger() - if (!this.activeConnection) { + const connection = this.activeConnection + if (!connection) { throw new ToolkitError('No active SMUS connection available', { code: SmusErrorCodes.NoActiveConnection }) } + // Only SSO connections have access tokens + if (!isSmusSsoConnection(connection)) { + throw new ToolkitError('Access tokens are only available for SSO connections', { + code: 'InvalidConnectionType', + }) + } + try { - const accessToken = await this.auth.getSsoAccessToken(this.activeConnection) - logger.debug(`SMUS: Successfully retrieved SSO access token for connection ${this.activeConnection.id}`) + // Type assertion is safe here because we've already checked with isSmusSsoConnection + const accessToken = await this.auth.getSsoAccessToken(connection as SsoConnection) + logger.debug(`SMUS: Successfully retrieved SSO access token for connection ${connection.id}`) return accessToken } catch (err) { - logger.error( - `SMUS: Failed to retrieve SSO access token for connection ${this.activeConnection.id}: %s`, - err - ) + logger.error(`SMUS: Failed to retrieve SSO access token for connection ${connection.id}: %s`, err) // Check if this is a reauth error that should be handled by showing SMUS-specific prompt if (err instanceof ToolkitError && err.code === 'InvalidConnection') { @@ -331,7 +725,7 @@ export class SmusAuthenticationProvider { ) } - throw new ToolkitError(`Failed to retrieve SSO access token for connection ${this.activeConnection.id}`, { + throw new ToolkitError(`Failed to retrieve SSO access token for connection ${connection.id}`, { code: SmusErrorCodes.RedeemAccessTokenFailed, cause: err instanceof Error ? err : undefined, }) @@ -386,7 +780,7 @@ export class SmusAuthenticationProvider { throw new ToolkitError('No active SMUS connection available', { code: SmusErrorCodes.NoActiveConnection }) } - const cacheKey = `${this.activeConnection.domainId}:${projectId}:${connectionId}` + const cacheKey = `${this.getDomainId()}:${projectId}:${connectionId}` logger.debug(`SMUS: Getting connection provider for connection ${connectionId}`) // Check if we already have a cached provider for this connection @@ -417,7 +811,15 @@ export class SmusAuthenticationProvider { if (!this.activeConnection) { throw new ToolkitError('No active SMUS connection available', { code: SmusErrorCodes.NoActiveConnection }) } - return this.activeConnection.domainId + + // For SMUS connections (both SSO and IAM) with domainId property + if ('domainId' in this.activeConnection) { + return (this.activeConnection as any).domainId + } + + throw new ToolkitError('Domain ID not available. Please reconnect to SMUS.', { + code: SmusErrorCodes.NoActiveConnection, + }) } /** @@ -428,7 +830,15 @@ export class SmusAuthenticationProvider { if (!this.activeConnection) { throw new ToolkitError('No active SMUS connection available', { code: SmusErrorCodes.NoActiveConnection }) } - return this.activeConnection.domainUrl + + // For SMUS connections (both SSO and IAM) with domainUrl property + if ('domainUrl' in this.activeConnection) { + return (this.activeConnection as any).domainUrl + } + + throw new ToolkitError('Domain URL not available. Please reconnect to SMUS.', { + code: SmusErrorCodes.NoActiveConnection, + }) } /** @@ -585,10 +995,24 @@ export class SmusAuthenticationProvider { } } - if (!this.activeConnection) { + const connection = this.activeConnection + if (!connection) { throw new ToolkitError('No active SMUS connection available', { code: SmusErrorCodes.NoActiveConnection }) } - return this.activeConnection.ssoRegion + + // Handle different connection types + if (isSmusSsoConnection(connection)) { + return connection.ssoRegion + } + + // For SMUS connections (both SSO and IAM) with region property + if ('region' in connection) { + return (connection as any).region + } + + throw new ToolkitError('Domain region not available. Please reconnect to SMUS.', { + code: SmusErrorCodes.NoActiveConnection, + }) } /** @@ -607,12 +1031,20 @@ export class SmusAuthenticationProvider { } } - if (!this.activeConnection) { + const connection = this.activeConnection + if (!connection) { throw new ToolkitError('No active SMUS connection available', { code: SmusErrorCodes.NoActiveConnection }) } + // Domain Execution Role credentials are only available for SSO connections + if (!isSmusSsoConnection(connection)) { + throw new ToolkitError('Domain Execution Role credentials are only available for SSO connections', { + code: 'InvalidConnectionType', + }) + } + // Create a cache key based on the connection details - const cacheKey = `${this.activeConnection.ssoRegion}:${this.activeConnection.domainId}` + const cacheKey = `${connection.ssoRegion}:${connection.domainId}` logger.debug(`SMUS: Getting credentials provider for cache key: ${cacheKey}`) @@ -626,9 +1058,9 @@ export class SmusAuthenticationProvider { // Create a new provider and cache it const provider = new DomainExecRoleCredentialsProvider( - this.activeConnection.domainUrl, - this.activeConnection.domainId, - this.activeConnection.ssoRegion, + connection.domainUrl, + connection.domainId, + connection.ssoRegion, async () => await this.getAccessToken() ) @@ -727,6 +1159,8 @@ export class SmusAuthenticationProvider { // Clear cached project account IDs this.cachedProjectAccountIds.clear() + DataZoneDomainPreferencesClient.dispose() + this.logger.debug('SMUS Auth: Successfully disposed authentication provider') } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts index ff25f64cf74..51cb76c22fb 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts @@ -38,9 +38,8 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { let region = 'Unknown' if (isConnected && this.authProvider.activeConnection) { - const conn = this.authProvider.activeConnection - domainId = conn.domainId || 'Unknown' - region = conn.ssoRegion || 'Unknown' + domainId = this.authProvider.getDomainId() || 'Unknown' + region = this.authProvider.getDomainRegion() || 'Unknown' } // Create display based on connection status diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index 453d1e05ab8..daad15a1e15 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -16,9 +16,9 @@ import { SageMakerUnifiedStudioAuthInfoNode } from './sageMakerUnifiedStudioAuth import { SmusErrorCodes } from '../../shared/smusUtils' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { ToolkitError } from '../../../../src/shared/errors' -import { recordAuthTelemetry } from '../../shared/telemetry' import { SmusAuthenticationMethod } from '../../auth/ui/authenticationMethodSelection' import { SmusAuthenticationOrchestrator } from '../../auth/authenticationOrchestrator' +import { isSmusSsoConnection } from '../../auth/model' const contextValueSmusRoot = 'sageMakerUnifiedStudioRoot' const contextValueSmusLogin = 'sageMakerUnifiedStudioLogin' @@ -179,9 +179,14 @@ export class SageMakerUnifiedStudioRootNode implements TreeNode { const hasExpiredConnection = activeConnection && !isConnectionValid if (hasExpiredConnection) { - this.logger.debug('SMUS Root Node: Connection is expired, showing reauthentication prompt') - // Show reauthentication prompt to user - void this.authProvider.showReauthenticationPrompt(activeConnection as any) + this.logger.debug('SMUS Root Node: Connection is expired') + // Only show reauthentication prompt for SSO connections, not IAM connections + if (isSmusSsoConnection(activeConnection)) { + this.logger.debug('SMUS Root Node: Showing reauthentication prompt for SSO connection') + void this.authProvider.showReauthenticationPrompt(activeConnection) + } else { + this.logger.debug('SMUS Root Node: Skipping reauthentication prompt for non-SSO connection') + } return true } return false @@ -264,7 +269,7 @@ export const smusLoginCommand = Commands.declare('aws.smus.login', (context: vsc context ) - if (ssoResult === 'BACK') { + if (ssoResult.status === 'BACK') { // User wants to go back to authentication method selection selectedMethod = undefined // Reset to show method selection again continue // Restart the loop @@ -279,21 +284,59 @@ export const smusLoginCommand = Commands.declare('aws.smus.login', (context: vsc context ) - if (iamResult === 'BACK') { + if (iamResult.status === 'BACK') { // User wants to go back to authentication method selection selectedMethod = undefined // Reset to show method selection again continue // Restart the loop } + if (iamResult.status === 'EDITING') { + // User is editing credentials, show helpful message with option to return to profile selection + const action = await vscode.window.showInformationMessage( + 'Complete your AWS credential setup and try again, or return to profile selection.', + 'Select Profile', + 'Done' + ) + + if (action === 'Select Profile') { + // User wants to return to profile selection, continue the loop + continue + } else { + // User chose "Done" or dismissed, exit the authentication flow + throw new ToolkitError('User cancelled credential setup', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + } + } + + if (iamResult.status === 'INVALID_PROFILE') { + // Profile validation failed, show error with option to select another profile + const action = await vscode.window.showErrorMessage( + `${iamResult.error}`, + 'Select Another Profile', + 'Cancel' + ) + + if (action === 'Select Another Profile') { + // User wants to select a different profile, continue the loop + continue + } else { + // User chose "Cancel" or dismissed, exit the authentication flow + throw new ToolkitError('User cancelled profile selection', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + } + } + authCompleted = true } } } catch (err) { const isUserCancelled = err instanceof ToolkitError && err.code === SmusErrorCodes.UserCancelled if (!isUserCancelled) { - void vscode.window.showErrorMessage( - `SageMaker Unified Studio: Failed to initiate login: ${(err as Error).message}` - ) + void vscode.window.showErrorMessage(`Failed to initiate login: ${(err as Error).message}`) logger.error('Failed to initiate login: %s', (err as Error).message) } throw err @@ -323,16 +366,11 @@ export const smusSignOutCommand = Commands.declare( // Get connection details for logging const activeConnection = authProvider.activeConnection - const domainId = activeConnection?.domainId - const region = activeConnection?.ssoRegion + const domainId = authProvider.getDomainId?.() || 'Unknown' - // Show status message - vscode.window.setStatusBarMessage('Signing out from SageMaker Unified Studio...', 5000) - await recordAuthTelemetry(span, authProvider, domainId, region) - - // Delete the connection (this will also invalidate tokens and clear cache) + // Sign out from SMUS (behavior depends on connection type) if (activeConnection) { - await authProvider.secondaryAuth.deleteConnection() + await authProvider.signOut() logger.info(`Signed out from SageMaker Unified Studio: ${domainId}`) // Clear connection-specific preferences on sign out (but keep auth method preference) @@ -345,9 +383,6 @@ export const smusSignOutCommand = Commands.declare( // Show success message void vscode.window.showInformationMessage('Successfully signed out from SageMaker Unified Studio.') - // Clear the status bar message - vscode.window.setStatusBarMessage('Signed out from SageMaker Unified Studio', 3000) - // Refresh the tree view to show the sign-in state try { await vscode.commands.executeCommand('aws.smus.rootView.refresh') diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/credentialsAdapter.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/credentialsAdapter.ts index 88d08c93b86..e1534f65d18 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/credentialsAdapter.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/credentialsAdapter.ts @@ -6,12 +6,13 @@ import * as AWS from 'aws-sdk' import { ConnectionCredentialsProvider } from '../../auth/providers/connectionCredentialsProvider' import { getLogger } from '../../../shared/logger/logger' +import { CredentialsProvider } from '../../../auth/providers/credentials' /** * Adapts a ConnectionCredentialsProvider (SDK v3) to work with SDK v2's CredentialProviderChain */ export function adaptConnectionCredentialsProvider( - connectionCredentialsProvider: ConnectionCredentialsProvider + connectionCredentialsProvider: ConnectionCredentialsProvider | CredentialsProvider ): AWS.CredentialProviderChain { const provider = () => { // Create SDK v2 Credentials that will resolve the provider when needed diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts index ffa0e7bfbf3..4373400ca0c 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts @@ -21,6 +21,18 @@ import { getLogger } from '../../../shared/logger/logger' import type { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { DefaultStsClient } from '../../../shared/clients/stsClient' +/** + * Represents a DataZone domain + */ +export interface DataZoneDomain { + id: string + name: string + description?: string + status?: string + createdAt?: Date + updatedAt?: Date +} + /** * Represents a DataZone project */ @@ -163,8 +175,8 @@ export class DataZoneClient { throw new Error('SMUS authentication provider is not connected') } - const activeConnection = authProvider.activeConnection! - const instanceKey = `${activeConnection.domainId}:${activeConnection.ssoRegion}` + const region = authProvider.getDomainRegion() + const instanceKey = `${authProvider.getDomainId()}:${region}` logger.debug(`DataZoneClient: Getting instance for domain: ${instanceKey}`) @@ -177,7 +189,7 @@ export class DataZoneClient { // Create new instance logger.debug('DataZoneClient: Creating new instance') - const instance = new DataZoneClient(authProvider, activeConnection.domainId, activeConnection.ssoRegion) + const instance = new DataZoneClient(authProvider, authProvider.getDomainId(), region) DataZoneClient.instances.set(instanceKey, instance) // Set up cleanup when connection changes @@ -188,7 +200,7 @@ export class DataZoneClient { disposable.dispose() }) - logger.info(`DataZoneClient: Created instance for domain ${activeConnection.domainId}`) + logger.info(`DataZoneClient: Created instance for domain ${authProvider.getDomainId()}`) return instance } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts index edbae250ea2..607b6f4c085 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts @@ -6,11 +6,11 @@ import { getLogger } from '../../../shared/logger/logger' import apiConfig = require('./datazonedomainpreferences.json') import globals from '../../../shared/extensionGlobals' -import { Service, AWSError } from 'aws-sdk' +import { Service } from 'aws-sdk' import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' import * as DataZoneDomainPreferences from './datazonedomainpreferences' -import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' -import * as AWS from 'aws-sdk' +import { adaptConnectionCredentialsProvider } from './credentialsAdapter' +import { CredentialsProvider } from '../../../auth/providers/credentials' export type ListDomainsOutput = DataZoneDomainPreferences.Types.ListDomainsOutput export type GetDomainOutput = DataZoneDomainPreferences.Types.GetDomainOutput @@ -38,7 +38,7 @@ export class DataZoneDomainPreferencesClient { private readonly logger = getLogger() private constructor( - private readonly authProvider: SmusAuthenticationProvider, + private readonly credentialProvider: CredentialsProvider, private readonly region: string ) {} @@ -47,7 +47,7 @@ export class DataZoneDomainPreferencesClient { * @returns DataZoneDomainPreferencesClient instance */ public static getInstance( - authProvider: SmusAuthenticationProvider, + credentialProvider: CredentialsProvider, region: string ): DataZoneDomainPreferencesClient { const logger = getLogger() @@ -63,19 +63,9 @@ export class DataZoneDomainPreferencesClient { // Create new instance logger.debug('DataZoneDomainPreferencesClient: Creating new instance') - const instance = new DataZoneDomainPreferencesClient(authProvider, region) + const instance = new DataZoneDomainPreferencesClient(credentialProvider, region) DataZoneDomainPreferencesClient.instances.set(instanceKey, instance) - // Set up cleanup when connection changes - const disposable = authProvider.onDidChangeActiveConnection(() => { - logger.debug( - `DataZoneDomainPreferencesClient: Connection changed, cleaning up instance for: ${instanceKey}` - ) - DataZoneDomainPreferencesClient.instances.delete(instanceKey) - instance.datazoneDomainPreferencesClient = undefined - disposable.dispose() - }) - logger.debug(`DataZoneDomainPreferencesClient: Created instance with instanceKey ${instanceKey}`) return instance @@ -112,50 +102,13 @@ export class DataZoneDomainPreferencesClient { try { this.logger.info('DataZoneDomainPreferencesClient: Creating authenticated DataZone client') - // dummmy call to silence the 'authProvider' is declared but its value is never read - this.authProvider.isConnected() - - // Stubbed credentials - replace with actual credential provider - const provider = () => { - const credentials = new AWS.Credentials({ - accessKeyId: '', - secretAccessKey: '', - sessionToken: '', - }) - - credentials.get = (callback) => { - try { - credentials.accessKeyId = 'xyz' - credentials.secretAccessKey = 'xyz' - credentials.sessionToken = 'xyz' - credentials.expireTime = new Date('2025-10-01T04:48:46+00:00') - - callback(undefined) - } catch (err) { - callback(err as AWSError) - } - } - - // Override needsRefresh to delegate to the connection credentials provider - credentials.needsRefresh = () => { - return true // Always call refresh, this is okay because there is caching existing in credential provider - } - - // Override refresh to use the connection credentials provider - credentials.refresh = (callback) => { - credentials.get(callback) - } - - return credentials - } - this.datazoneDomainPreferencesClient = (await globals.sdkClientBuilder.createAwsService( Service, { apiConfig: apiConfig, endpoint: `https://datazone.${this.region}.api.aws`, region: this.region, - credentialProvider: new AWS.CredentialProviderChain([provider]), + credentialProvider: adaptConnectionCredentialsProvider(this.credentialProvider), } as ServiceConfigurationOptions, undefined, false diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 35858f0dc5a..49ae0bf9907 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -64,6 +64,16 @@ export const SmusErrorCodes = { GetProjectAccountIdFailed: 'GetProjectAccountIdFailed', /** Error code for when region is missing */ RegionNotFound: 'RegionNotFound', + /** Error code for when Express domain is not found in the specified region */ + ExpressDomainNotFound: 'ExpressDomainNotFound', + /** Error code for when IAM profile is not found */ + ProfileNotFound: 'ProfileNotFound', + /** Error code for when IAM credential retrieval fails */ + CredentialRetrievalFailed: 'CredentialRetrievalFailed', + /** Error code for when IAM credential provider initialization fails */ + CredentialProviderInitFailed: 'CredentialProviderInitFailed', + /** Error code for when IAM profile type is invalid */ + InvalidProfileType: 'InvalidProfileType', } as const /** diff --git a/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts b/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts index ceeb4828b83..d2963965750 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts @@ -51,7 +51,7 @@ export async function recordSpaceTelemetry( span.record({ smusSpaceKey: node.resource.DomainSpaceKey, smusDomainRegion: node.resource.regionCode, - smusDomainId: parent?.getAuthProvider()?.activeConnection?.domainId, + smusDomainId: parent?.getAuthProvider()?.getDomainId(), smusDomainAccountId: accountId, smusProjectId: projectId, smusProjectAccountId: projectAccountId, diff --git a/packages/core/src/shared/vscode/setContext.ts b/packages/core/src/shared/vscode/setContext.ts index 3d45d93e14a..97e1bc8c751 100644 --- a/packages/core/src/shared/vscode/setContext.ts +++ b/packages/core/src/shared/vscode/setContext.ts @@ -32,6 +32,7 @@ export type contextKey = | 'aws.amazonq.editSuggestionActive' | 'aws.smus.connected' | 'aws.smus.inSmusSpaceEnvironment' + | 'aws.smus.isExpressMode' // Deprecated/legacy names. New keys should start with "aws.". | 'codewhisperer.activeLine' | 'gumby.isPlanAvailable' diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts index a6ca72736e9..98b106022b6 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts @@ -4,229 +4,247 @@ */ import assert from 'assert' +import { Credentials } from '@aws-sdk/types' import { - createSmusProfile, + SmusSsoConnection, + SmusIamConnection, + isSmusIamConnection, + isSmusSsoConnection, isValidSmusConnection, + createSmusProfile, scopeSmus, - SmusConnection, } from '../../../sagemakerunifiedstudio/auth/model' -import { SsoConnection } from '../../../auth/connection' -describe('SMUS Auth Model', function () { - const testDomainUrl = 'https://dzd_domainId.sagemaker.us-east-2.on.aws' - const testDomainId = 'dzd_domainId' - const testStartUrl = 'https://identitycenter.amazonaws.com/ssoins-testInstanceId' - const testRegion = 'us-east-2' +describe('SMUS Connection Model', function () { + const mockCredentials: Credentials = { + accessKeyId: 'test-access-key', + secretAccessKey: 'test-secret-key', + } - describe('scopeSmus', function () { - it('should have correct scope value', function () { - assert.strictEqual(scopeSmus, 'datazone:domain:access') - }) + const mockCredentialsProvider = async (): Promise => mockCredentials + + const mockGetToken = async () => ({ + accessToken: 'mock-access-token', + expiresAt: new Date(Date.now() + 3600000), // 1 hour from now }) - describe('createSmusProfile', function () { - it('should create profile with default scopes', function () { - const profile = createSmusProfile(testDomainUrl, testDomainId, testStartUrl, testRegion) + const mockGetRegistration = async () => ({ + clientId: 'mock-client-id', + clientSecret: 'mock-client-secret', + expiresAt: new Date(Date.now() + 86400000), // 24 hours from now + startUrl: 'https://test.sagemaker.us-east-1.on.aws/', + }) - assert.strictEqual(profile.domainUrl, testDomainUrl) - assert.strictEqual(profile.domainId, testDomainId) - assert.strictEqual(profile.startUrl, testStartUrl) - assert.strictEqual(profile.ssoRegion, testRegion) - assert.strictEqual(profile.type, 'sso') - assert.deepStrictEqual(profile.scopes, [scopeSmus]) + describe('isSmusIamConnection', function () { + it('should return true for valid SMUS IAM connection', function () { + const connection: SmusIamConnection = { + type: 'iam', + profileName: 'test-profile', + region: 'us-east-1', + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test IAM Connection', + endpointUrl: undefined, + getCredentials: mockCredentialsProvider, + } + + assert.strictEqual(isSmusIamConnection(connection), true) }) - it('should create profile with custom scopes', function () { - const customScopes = ['custom:scope', 'another:scope'] - const profile = createSmusProfile(testDomainUrl, testDomainId, testStartUrl, testRegion, customScopes) + it('should return false for SSO connection', function () { + const connection: SmusSsoConnection = { + type: 'sso', + startUrl: 'https://test.awsapps.com/start', + ssoRegion: 'us-east-1', + scopes: [scopeSmus], + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test SSO Connection', + getToken: mockGetToken, + getRegistration: mockGetRegistration, + } - assert.strictEqual(profile.domainUrl, testDomainUrl) - assert.strictEqual(profile.domainId, testDomainId) - assert.strictEqual(profile.startUrl, testStartUrl) - assert.strictEqual(profile.ssoRegion, testRegion) - assert.strictEqual(profile.type, 'sso') - assert.deepStrictEqual(profile.scopes, customScopes) + assert.strictEqual(isSmusIamConnection(connection), false) }) - it('should create profile with all required properties', function () { - const profile = createSmusProfile(testDomainUrl, testDomainId, testStartUrl, testRegion) - - // Check SsoProfile properties - assert.strictEqual(profile.type, 'sso') - assert.strictEqual(profile.startUrl, testStartUrl) - assert.strictEqual(profile.ssoRegion, testRegion) - assert.ok(Array.isArray(profile.scopes)) + it('should return false for connection missing required IAM properties', function () { + const connection = { + type: 'iam', + profileName: 'test-profile', + // Missing region, domainUrl, domainId, getCredentials + id: 'test-id', + label: 'Test IAM Connection', + endpointUrl: undefined, + } - // Check SmusProfile properties - assert.strictEqual(profile.domainUrl, testDomainUrl) - assert.strictEqual(profile.domainId, testDomainId) + assert.strictEqual(isSmusIamConnection(connection as any), false) }) - }) - - describe('isValidSmusConnection', function () { - it('should return true for valid SMUS connection', function () { - const validConnection = { - id: 'test-connection-id', - type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, - scopes: [scopeSmus], - label: 'Test SMUS Connection', - domainUrl: testDomainUrl, - domainId: testDomainId, - } as SmusConnection - assert.strictEqual(isValidSmusConnection(validConnection), true) + it('should return false for undefined connection', function () { + assert.strictEqual(isSmusIamConnection(undefined), false) }) - it('should return false for connection without SMUS scope', function () { - const connectionWithoutScope = { - id: 'test-connection-id', - type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, - scopes: ['sso:account:access'], + it('should return false for connection with wrong type', function () { + const connection = { + type: 'other', + profileName: 'test-profile', + region: 'us-east-1', + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', label: 'Test Connection', - domainUrl: testDomainUrl, - domainId: testDomainId, - } as any + } - assert.strictEqual(isValidSmusConnection(connectionWithoutScope), false) + assert.strictEqual(isSmusIamConnection(connection as any), false) }) + }) - it('should return false for connection without SMUS properties', function () { - const connectionWithoutSmusProps = { - id: 'test-connection-id', + describe('isSmusSsoConnection', function () { + it('should return true for valid SMUS SSO connection', function () { + const connection: SmusSsoConnection = { type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, + startUrl: 'https://test.awsapps.com/start', + ssoRegion: 'us-east-1', scopes: [scopeSmus], - label: 'Test Connection', - } as SsoConnection + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test SSO Connection', + getToken: mockGetToken, + getRegistration: mockGetRegistration, + } - assert.strictEqual(isValidSmusConnection(connectionWithoutSmusProps), false) + assert.strictEqual(isSmusSsoConnection(connection), true) }) - it('should return false for non-SSO connection', function () { - const nonSsoConnection = { - id: 'test-connection-id', + it('should return false for IAM connection', function () { + const connection: SmusIamConnection = { type: 'iam', + profileName: 'test-profile', + region: 'us-east-1', + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', label: 'Test IAM Connection', - domainUrl: testDomainUrl, - domainId: testDomainId, - scopes: [scopeSmus], + endpointUrl: undefined, + getCredentials: mockCredentialsProvider, } - assert.strictEqual(isValidSmusConnection(nonSsoConnection), false) - }) - - it('should return false for undefined connection', function () { - assert.strictEqual(isValidSmusConnection(undefined), false) - }) - - it('should return false for null connection', function () { - assert.strictEqual(isValidSmusConnection(undefined), false) + assert.strictEqual(isSmusSsoConnection(connection), false) }) - it('should return false for connection without scopes', function () { - const connectionWithoutScopes = { - id: 'test-connection-id', + it('should return false for SSO connection without SMUS scope', function () { + const connection = { type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, - label: 'Test Connection', - domainUrl: testDomainUrl, - domainId: testDomainId, + startUrl: 'https://test.awsapps.com/start', + ssoRegion: 'us-east-1', + scopes: ['other:scope'], + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test SSO Connection', } - assert.strictEqual(isValidSmusConnection(connectionWithoutScopes), false) + assert.strictEqual(isSmusSsoConnection(connection as any), false) }) - it('should return false for connection with empty scopes array', function () { - const connectionWithEmptyScopes = { - id: 'test-connection-id', + it('should return false for SSO connection missing SMUS properties', function () { + const connection = { type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, - scopes: [], - label: 'Test Connection', - domainUrl: testDomainUrl, - domainId: testDomainId, + startUrl: 'https://test.awsapps.com/start', + ssoRegion: 'us-east-1', + scopes: [scopeSmus], + // Missing domainUrl and domainId + id: 'test-id', + label: 'Test SSO Connection', } - assert.strictEqual(isValidSmusConnection(connectionWithEmptyScopes), false) + assert.strictEqual(isSmusSsoConnection(connection as any), false) }) - it('should return true for connection with SMUS scope among other scopes', function () { - const connectionWithMultipleScopes = { - id: 'test-connection-id', - type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, - scopes: ['sso:account:access', scopeSmus, 'other:scope'], - label: 'Test SMUS Connection', - domainUrl: testDomainUrl, - domainId: testDomainId, - } as SmusConnection - - assert.strictEqual(isValidSmusConnection(connectionWithMultipleScopes), true) + it('should return false for undefined connection', function () { + assert.strictEqual(isSmusSsoConnection(undefined), false) }) + }) - it('should return false for connection missing domainUrl', function () { - const connectionMissingDomainUrl = { - id: 'test-connection-id', + describe('isValidSmusConnection', function () { + it('should return true for valid SMUS SSO connection', function () { + const connection: SmusSsoConnection = { type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, + startUrl: 'https://test.awsapps.com/start', + ssoRegion: 'us-east-1', scopes: [scopeSmus], - label: 'Test Connection', - domainId: testDomainId, + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test SSO Connection', + getToken: mockGetToken, + getRegistration: mockGetRegistration, } - assert.strictEqual(isValidSmusConnection(connectionMissingDomainUrl), false) + assert.strictEqual(isValidSmusConnection(connection), true) }) - it('should return false for connection missing domainId', function () { - const connectionMissingDomainId = { - id: 'test-connection-id', - type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, - scopes: [scopeSmus], + it('should return true for valid SMUS IAM connection', function () { + const connection: SmusIamConnection = { + type: 'iam', + profileName: 'test-profile', + region: 'us-east-1', + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test IAM Connection', + endpointUrl: undefined, + getCredentials: mockCredentialsProvider, + } + + assert.strictEqual(isValidSmusConnection(connection), true) + }) + + it('should return false for invalid connection', function () { + const connection = { + type: 'other', + id: 'test-id', label: 'Test Connection', - domainUrl: testDomainUrl, } - assert.strictEqual(isValidSmusConnection(connectionMissingDomainId), false) + assert.strictEqual(isValidSmusConnection(connection), false) + }) + + it('should return false for undefined connection', function () { + assert.strictEqual(isValidSmusConnection(undefined), false) }) }) - describe('SmusConnection interface', function () { - it('should extend both SmusProfile and SsoConnection', function () { - const connection = { - id: 'test-connection-id', - type: 'sso', - startUrl: testStartUrl, - ssoRegion: testRegion, - scopes: [scopeSmus], - label: 'Test SMUS Connection', - domainUrl: testDomainUrl, - domainId: testDomainId, - } as SmusConnection - - // Should have Connection properties - assert.strictEqual(connection.id, 'test-connection-id') - assert.strictEqual(connection.label, 'Test SMUS Connection') - - // Should have SsoConnection properties - assert.strictEqual(connection.type, 'sso') - assert.strictEqual(connection.startUrl, testStartUrl) - assert.strictEqual(connection.ssoRegion, testRegion) - assert.ok(Array.isArray(connection.scopes)) - - // Should have SmusProfile properties - assert.strictEqual(connection.domainUrl, testDomainUrl) - assert.strictEqual(connection.domainId, testDomainId) + describe('createSmusProfile', function () { + it('should create a valid SMUS profile with default scope', function () { + const domainUrl = 'https://test.sagemaker.us-east-1.on.aws/' + const domainId = 'test-domain-id' + const startUrl = 'https://test.awsapps.com/start' + const region = 'us-east-1' + + const profile = createSmusProfile(domainUrl, domainId, startUrl, region) + + assert.strictEqual(profile.domainUrl, domainUrl) + assert.strictEqual(profile.domainId, domainId) + assert.strictEqual(profile.startUrl, startUrl) + assert.strictEqual(profile.ssoRegion, region) + assert.strictEqual(profile.type, 'sso') + assert.deepStrictEqual(profile.scopes, [scopeSmus]) + }) + + it('should create a valid SMUS profile with custom scopes', function () { + const domainUrl = 'https://test.sagemaker.us-east-1.on.aws/' + const domainId = 'test-domain-id' + const startUrl = 'https://test.awsapps.com/start' + const region = 'us-east-1' + const customScopes = ['custom:scope1', 'custom:scope2'] + + const profile = createSmusProfile(domainUrl, domainId, startUrl, region, customScopes) + + assert.deepStrictEqual(profile.scopes, customScopes) }) }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 7cd2662f467..198503a333e 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -88,6 +88,10 @@ describe('SmusAuthenticationProvider', function () { get isConnectionExpired() { return mockSecondaryAuthState.isConnectionExpired }, + state: { + get: sinon.stub().returns({}), + update: sinon.stub().resolves(), + }, onDidChangeActiveConnection: sinon.stub().returns({ dispose: sinon.stub() }), restoreConnection: sinon.stub().resolves(), useNewConnection: sinon.stub().resolves(mockSmusConnection), @@ -108,7 +112,7 @@ describe('SmusAuthenticationProvider', function () { executeCommandStub = sinon.stub(vscode.commands, 'executeCommand').resolves() sinon.stub(require('../../../auth/secondaryAuth'), 'getSecondaryAuth').returns(mockSecondaryAuth) - smusAuthProvider = new SmusAuthenticationProvider(mockAuth, mockSecondaryAuth) + smusAuthProvider = new SmusAuthenticationProvider(mockAuth) // Reset the executeCommand stub for clean state executeCommandStub.resetHistory() @@ -757,4 +761,457 @@ describe('SmusAuthenticationProvider', function () { }) }) }) + + describe('signOut', function () { + let mockState: any + + beforeEach(function () { + mockState = { + get: sinon.stub(), + update: sinon.stub().resolves(), + } + mockSecondaryAuth.state = mockState + mockSecondaryAuth.forgetConnection = sinon.stub().resolves() + }) + + it('should do nothing when no active connection exists', async function () { + mockSecondaryAuthState.activeConnection = undefined + + await smusAuthProvider.signOut() + + assert.ok(mockState.get.notCalled) + assert.ok(mockState.update.notCalled) + assert.ok(mockSecondaryAuth.deleteConnection.notCalled) + assert.ok(mockSecondaryAuth.forgetConnection.notCalled) + }) + + it('should delete SSO connection and clear metadata', async function () { + const ssoConnection = { + ...mockSmusConnection, + type: 'sso' as const, + id: 'sso-connection-id', + } + mockSecondaryAuthState.activeConnection = ssoConnection + + const smusConnections = { + 'sso-connection-id': { + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockState.get.withArgs('smus.connections').returns(smusConnections) + + await smusAuthProvider.signOut() + + assert.ok(mockState.get.calledWith('smus.connections')) + assert.ok(mockState.update.calledWith('smus.connections', {})) + assert.ok(mockSecondaryAuth.deleteConnection.called) + assert.ok(mockSecondaryAuth.forgetConnection.notCalled) + }) + + it('should forget IAM connection without deleting and clear metadata', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + const smusConnections = { + 'profile:test-profile': { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockState.get.withArgs('smus.connections').returns(smusConnections) + + await smusAuthProvider.signOut() + + assert.ok(mockState.get.calledWith('smus.connections')) + assert.ok(mockState.update.calledWith('smus.connections', {})) + assert.ok(mockSecondaryAuth.forgetConnection.called) + assert.ok(mockSecondaryAuth.deleteConnection.notCalled) + }) + + it('should handle mock connection in SMUS space environment', async function () { + const mockConnection = { + id: 'mock-connection-id', + // No 'type' property - simulates mock connection + } + mockSecondaryAuthState.activeConnection = mockConnection as any + + const smusConnections = { + 'mock-connection-id': { + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockState.get.withArgs('smus.connections').returns(smusConnections) + + await smusAuthProvider.signOut() + + assert.ok(mockState.get.calledWith('smus.connections')) + assert.ok(mockState.update.calledWith('smus.connections', {})) + assert.ok(mockSecondaryAuth.deleteConnection.notCalled) + assert.ok(mockSecondaryAuth.forgetConnection.notCalled) + }) + + it('should handle missing metadata gracefully', async function () { + const ssoConnection = { + ...mockSmusConnection, + type: 'sso' as const, + id: 'sso-connection-id', + } + mockSecondaryAuthState.activeConnection = ssoConnection + + mockState.get.withArgs('smus.connections').returns({}) + + await smusAuthProvider.signOut() + + assert.ok(mockState.get.calledWith('smus.connections')) + // When there's no metadata to delete, update should not be called + assert.ok(mockState.update.notCalled) + assert.ok(mockSecondaryAuth.deleteConnection.called) + }) + + it('should throw ToolkitError when deleteConnection fails', async function () { + const ssoConnection = { + ...mockSmusConnection, + type: 'sso' as const, + id: 'sso-connection-id', + } + mockSecondaryAuthState.activeConnection = ssoConnection + + mockState.get.withArgs('smus.connections').returns({}) + mockSecondaryAuth.deleteConnection.rejects(new Error('Delete failed')) + + await assert.rejects( + () => smusAuthProvider.signOut(), + (err: ToolkitError) => { + return ( + err.code === 'SignOutFailed' && + err.message.includes('Failed to sign out from SageMaker Unified Studio') + ) + } + ) + }) + + it('should throw ToolkitError when forgetConnection fails', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + mockState.get.withArgs('smus.connections').returns({}) + mockSecondaryAuth.forgetConnection.rejects(new Error('Forget failed')) + + await assert.rejects( + () => smusAuthProvider.signOut(), + (err: ToolkitError) => { + return ( + err.code === 'SignOutFailed' && + err.message.includes('Failed to sign out from SageMaker Unified Studio') + ) + } + ) + }) + }) + + describe('connectWithIamProfile', function () { + let mockState: any + const testProfileName = 'test-profile' + const testIamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + + beforeEach(function () { + mockState = { + get: sinon.stub(), + update: sinon.stub().resolves(), + } + mockSecondaryAuth.state = mockState + mockAuth.getConnection = sinon.stub() + mockAuth.refreshConnectionState = sinon.stub().resolves() + }) + + it('should connect with existing IAM profile and store metadata', async function () { + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) + mockState.get.withArgs('smus.connections').returns({}) + + const result = await smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl) + + assert.strictEqual(result.id, testIamConnection.id) + assert.strictEqual(result.type, 'iam') + assert.strictEqual(result.profileName, testProfileName) + assert.strictEqual(result.region, testRegion) + assert.strictEqual(result.domainUrl, testDomainUrl) + assert.strictEqual(result.domainId, testDomainId) + + assert.ok(mockAuth.getConnection.calledWith({ id: `profile:${testProfileName}` })) + assert.ok(mockSecondaryAuth.useNewConnection.calledWith(testIamConnection)) + assert.ok(mockAuth.refreshConnectionState.calledWith(testIamConnection)) + assert.ok( + mockState.update.calledWith('smus.connections', { + [testIamConnection.id]: { + profileName: testProfileName, + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + isExpressDomain: false, + }, + }) + ) + }) + + it('should trigger project selection after successful connection', async function () { + isInSmusSpaceEnvironmentStub.returns(false) + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) + mockState.get.withArgs('smus.connections').returns({}) + + await smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl) + + assert.ok(executeCommandStub.calledWith('aws.smus.switchProject')) + }) + + it('should not trigger project selection in SMUS space environment', async function () { + isInSmusSpaceEnvironmentStub.returns(true) + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) + mockState.get.withArgs('smus.connections').returns({}) + + await smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl) + + assert.ok(executeCommandStub.notCalled) + }) + + it('should merge with existing SMUS connections metadata', async function () { + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) + + const existingConnections = { + 'other-connection-id': { + domainUrl: 'https://other-domain.sagemaker.us-west-2.on.aws', + domainId: 'other-domain-id', + }, + } + mockState.get.withArgs('smus.connections').returns(existingConnections) + + await smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl) + + assert.ok( + mockState.update.calledWith('smus.connections', { + 'other-connection-id': existingConnections['other-connection-id'], + [testIamConnection.id]: { + profileName: testProfileName, + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + isExpressDomain: false, + }, + }) + ) + }) + + it('should throw error for invalid domain URL', async function () { + extractDomainInfoStub.returns({ domainId: undefined, region: testRegion }) + + await assert.rejects( + () => smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, 'invalid-url'), + (err: ToolkitError) => { + return ( + err.code === 'FailedToConnect' && + err.message.includes('Failed to connect to SageMaker Unified Studio with IAM profile') + ) + } + ) + + assert.ok(mockAuth.getConnection.notCalled) + assert.ok(mockSecondaryAuth.useNewConnection.notCalled) + }) + + it('should throw error when IAM connection not found', async function () { + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(undefined) + + await assert.rejects( + () => smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl), + (err: ToolkitError) => { + return ( + err.code === 'FailedToConnect' && + err.message.includes('Failed to connect to SageMaker Unified Studio with IAM profile') && + (err.cause as any)?.code === 'ConnectionNotFound' + ) + } + ) + + assert.ok(mockSecondaryAuth.useNewConnection.notCalled) + }) + + it('should throw error when connection is not IAM type', async function () { + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + const nonIamConnection = { + id: 'profile:test-profile', + type: 'sso' as const, + label: 'Test SSO Connection', + } + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(nonIamConnection) + + await assert.rejects( + () => smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl), + (err: ToolkitError) => { + return ( + err.code === 'FailedToConnect' && + err.message.includes('Failed to connect to SageMaker Unified Studio with IAM profile') + ) + } + ) + }) + + it('should handle useNewConnection failure', async function () { + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) + mockState.get.withArgs('smus.connections').returns({}) + mockSecondaryAuth.useNewConnection.rejects(new Error('Failed to use connection')) + + await assert.rejects( + () => smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl), + (err: ToolkitError) => { + return ( + err.code === 'FailedToConnect' && + err.message.includes('Failed to connect to SageMaker Unified Studio with IAM profile') + ) + } + ) + }) + + it('should handle refreshConnectionState failure', async function () { + extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) + mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) + mockState.get.withArgs('smus.connections').returns({}) + mockAuth.refreshConnectionState.rejects(new Error('Failed to refresh state')) + + await assert.rejects( + () => smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl), + (err: ToolkitError) => { + return ( + err.code === 'FailedToConnect' && + err.message.includes('Failed to connect to SageMaker Unified Studio with IAM profile') + ) + } + ) + }) + }) + + describe('activeConnection with IAM metadata', function () { + let mockState: any + + beforeEach(function () { + mockState = { + get: sinon.stub(), + update: sinon.stub().resolves(), + } + mockSecondaryAuth.state = mockState + }) + + it('should return IAM connection with SMUS metadata when available', function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + const smusConnections = { + 'profile:test-profile': { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockState.get.withArgs('smus.connections').returns(smusConnections) + + const result = smusAuthProvider.activeConnection + + assert.strictEqual(result?.id, iamConnection.id) + assert.strictEqual((result as any)?.type, 'iam') + assert.strictEqual((result as any).profileName, 'test-profile') + assert.strictEqual((result as any).region, testRegion) + assert.strictEqual((result as any).domainUrl, testDomainUrl) + assert.strictEqual((result as any).domainId, testDomainId) + }) + + it('should return SSO connection with SMUS metadata when available', function () { + const ssoConnection = { + ...mockSmusConnection, + type: 'sso' as const, + } + mockSecondaryAuthState.activeConnection = ssoConnection + + const smusConnections = { + [ssoConnection.id]: { + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockState.get.withArgs('smus.connections').returns(smusConnections) + + const result = smusAuthProvider.activeConnection + + assert.strictEqual(result?.id, ssoConnection.id) + assert.strictEqual((result as any)?.type, 'sso') + assert.strictEqual((result as any)?.domainUrl, testDomainUrl) + assert.strictEqual((result as any)?.domainId, testDomainId) + }) + + it('should return base connection when no metadata available', function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + mockState.get.withArgs('smus.connections').returns({}) + + const result = smusAuthProvider.activeConnection + + assert.strictEqual(result?.id, iamConnection.id) + assert.strictEqual((result as any)?.type, 'iam') + assert.strictEqual((result as any).profileName, undefined) + assert.strictEqual((result as any).domainUrl, undefined) + }) + + it('should return undefined when no active connection', function () { + mockSecondaryAuthState.activeConnection = undefined + + const result = smusAuthProvider.activeConnection + + assert.strictEqual(result, undefined) + }) + + it('should handle missing smus.connections state gracefully', function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + mockState.get.withArgs('smus.connections').returns(undefined) + + const result = smusAuthProvider.activeConnection + + assert.strictEqual(result?.id, iamConnection.id) + assert.strictEqual((result as any)?.type, 'iam') + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts index 61ab6095c5e..4924f18d84c 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts @@ -3,171 +3,29 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as assert from 'assert' +import assert from 'assert' import { SmusIamProfileSelector } from '../../../../sagemakerunifiedstudio/auth/ui/iamProfileSelection' describe('SmusIamProfileSelector', function () { - // Note: Due to AWS Toolkit test framework restrictions on mocking vscode.window, - // these tests focus on the interface and behavior rather than deep mocking. - // The actual QuickPick functionality is tested through integration tests. - - describe('showIamProfileSelection', function () { - it('should export the correct interface', function () { - // Verify the class exists and has the expected static method - assert.ok('showIamProfileSelection' in SmusIamProfileSelector) - assert.strictEqual(typeof SmusIamProfileSelector.showIamProfileSelection, 'function') - }) - - it('should be callable without throwing', function () { - // Verify the method exists and is accessible - assert.doesNotThrow(() => { - assert.ok('showIamProfileSelection' in SmusIamProfileSelector) - }) - }) - - it('should handle return type union correctly', function () { - // Test that the return types are properly defined - const testResult1: { profileName: string; region: string } = { profileName: 'test', region: 'us-east-1' } - const testResult2: { isEditing: true; message: string } = { isEditing: true, message: 'editing' } - const testResult3: { isBack: true; message: string } = { isBack: true, message: 'back' } + describe('validateProfile', function () { + // Note: These tests would require mocking loadSharedCredentialsProfiles + // For now, we'll focus on the basic functionality tests + // In a real implementation, we'd need to set up proper test fixtures - assert.strictEqual(testResult1.profileName, 'test') - assert.strictEqual(testResult1.region, 'us-east-1') - assert.strictEqual(testResult2.isEditing, true) - assert.strictEqual(testResult3.isBack, true) + it('should be a static method', function () { + assert.strictEqual(typeof SmusIamProfileSelector.validateProfile, 'function') }) }) describe('showRegionSelection', function () { - it('should export the correct interface', function () { - // Verify the class exists and has the expected static method - assert.ok('showRegionSelection' in SmusIamProfileSelector) + it('should be a static method', function () { assert.strictEqual(typeof SmusIamProfileSelector.showRegionSelection, 'function') }) - - it('should be callable without throwing', function () { - // Verify the method exists and is accessible - assert.doesNotThrow(() => { - assert.ok('showRegionSelection' in SmusIamProfileSelector) - }) - }) - - it('should handle return type correctly', function () { - // Test that the return type is properly defined - const testResult: string = 'us-east-1' - assert.strictEqual(testResult, 'us-east-1') - }) - }) - - describe('validateProfile', function () { - it('should export the correct interface', function () { - // Verify the class exists and has the expected static method - assert.ok('validateProfile' in SmusIamProfileSelector) - assert.strictEqual(typeof SmusIamProfileSelector.validateProfile, 'function') - }) - - it('should be callable without throwing', function () { - // Verify the method exists and is accessible - assert.doesNotThrow(() => { - assert.ok('validateProfile' in SmusIamProfileSelector) - }) - }) - - it('should handle validation result type correctly', function () { - // Test that the return types are properly defined - const validResult: { isValid: boolean; error?: string } = { isValid: true } - const invalidResult: { isValid: boolean; error?: string } = { isValid: false, error: 'test error' } - - assert.strictEqual(validResult.isValid, true) - assert.strictEqual(validResult.error, undefined) - assert.strictEqual(invalidResult.isValid, false) - assert.strictEqual(invalidResult.error, 'test error') - }) }) - describe('showCredentialManagement', function () { - it('should export the correct interface', function () { - // Verify the class exists and has the expected static method - assert.ok('showCredentialManagement' in SmusIamProfileSelector) - assert.strictEqual(typeof SmusIamProfileSelector.showCredentialManagement, 'function') - }) - - it('should be callable without throwing', function () { - // Verify the method exists and is accessible - assert.doesNotThrow(() => { - assert.ok('showCredentialManagement' in SmusIamProfileSelector) - }) - }) - - it('should handle return type correctly', function () { - // Test that the return type is properly defined - const testResult1: boolean = true - const testResult2: boolean = false - - assert.strictEqual(testResult1, true) - assert.strictEqual(testResult2, false) - }) - }) - - describe('class structure', function () { - it('should be a class with static methods', function () { - // Verify the selector is properly structured - assert.strictEqual(typeof SmusIamProfileSelector, 'function') - assert.ok(SmusIamProfileSelector.prototype) - }) - - it('should have all required methods', function () { - // Verify all expected methods exist - const methods = [ - 'showIamProfileSelection', - 'showRegionSelection', - 'validateProfile', - 'showCredentialManagement', - ] - - for (const method of methods) { - assert.ok(method in SmusIamProfileSelector, `Missing method: ${method}`) - assert.strictEqual( - typeof SmusIamProfileSelector[method as keyof typeof SmusIamProfileSelector], - 'function', - `${method} should be a function` - ) - } - }) - }) - - describe('interface types', function () { - it('should handle IamProfileSelection interface correctly', function () { - // Test the interface structure - const selection: { profileName: string; region: string } = { - profileName: 'my-profile', - region: 'us-west-2', - } - - assert.strictEqual(selection.profileName, 'my-profile') - assert.strictEqual(selection.region, 'us-west-2') - }) - - it('should handle IamProfileEditingInProgress interface correctly', function () { - // Test the interface structure - const editing: { isEditing: true; message: string } = { - isEditing: true, - message: 'User is editing credentials', - } - - assert.strictEqual(editing.isEditing, true) - assert.strictEqual(editing.message, 'User is editing credentials') - }) - - it('should handle IamProfileBackNavigation interface correctly', function () { - // Test the interface structure - const back: { isBack: true; message: string } = { - isBack: true, - message: 'User chose to go back', - } - - assert.strictEqual(back.isBack, true) - assert.strictEqual(back.message, 'User chose to go back') + describe('showIamProfileSelection', function () { + it('should be a static method', function () { + assert.strictEqual(typeof SmusIamProfileSelector.showIamProfileSelection, 'function') }) }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts index ebf2eae2cb0..435397885df 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts @@ -8,12 +8,12 @@ import sinon from 'sinon' import * as vscode from 'vscode' import { SageMakerUnifiedStudioAuthInfoNode } from '../../../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode' import { SmusAuthenticationProvider } from '../../../../sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider' -import { SmusConnection } from '../../../../sagemakerunifiedstudio/auth/model' +import { SmusConnection, SmusSsoConnection } from '../../../../sagemakerunifiedstudio/auth/model' describe('SageMakerUnifiedStudioAuthInfoNode', function () { let authInfoNode: SageMakerUnifiedStudioAuthInfoNode let mockAuthProvider: any - let mockConnection: SmusConnection + let mockConnection: SmusSsoConnection let currentActiveConnection: SmusConnection | undefined beforeEach(function () { @@ -39,6 +39,17 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { isConnected: sinon.stub().returns(true), isConnectionValid: sinon.stub().returns(true), onDidChange: sinon.stub().callsFake((listener: () => void) => ({ dispose: sinon.stub() })), + getDomainId: sinon.stub().callsFake(() => { + return currentActiveConnection?.domainId + }), + getDomainRegion: sinon.stub().callsFake(() => { + if (currentActiveConnection?.type === 'sso') { + return (currentActiveConnection as any).ssoRegion + } else if (currentActiveConnection?.type === 'iam') { + return (currentActiveConnection as any).region + } + return undefined + }), get activeConnection() { return currentActiveConnection }, diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts index 64b866c7704..4c0cad57366 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts @@ -194,7 +194,13 @@ describe('SmusRootNode', function () { const mockAuthProvider = { isConnected: sinon.stub().returns(true), isConnectionValid: sinon.stub().returns(false), - activeConnection: { domainId: testDomainId, ssoRegion: 'us-west-2' }, + activeConnection: { + type: 'sso', + domainId: testDomainId, + ssoRegion: 'us-west-2', + domainUrl: 'https://test-domain.datazone.aws.amazon.com', + scopes: ['datazone:domain:access'], + }, onDidChange: sinon.stub().returns({ dispose: sinon.stub() }), showReauthenticationPrompt: sinon.stub(), } as any From 169de3669a1a5832e39db665c7566f60d1352ca2 Mon Sep 17 00:00:00 2001 From: Bhargav Date: Fri, 10 Oct 2025 10:26:38 -0700 Subject: [PATCH 04/53] fix(smus): Address PR comments and minor code improvements (#2249) **Description** Addressed some commnets from prior PRs and also consolidated a lot of duplicated code. Also removed some blocks that were not used/required. Minor text changes as well. **Motivation** Clean up. **Testing Done** Unit tests and manually tested flows again locally. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../auth/authenticationOrchestrator.ts | 2 +- .../providers/smusAuthenticationProvider.ts | 22 +- .../auth/ui/authenticationMethodSelection.ts | 4 +- .../auth/ui/iamProfileSelection.ts | 820 +++++++----------- .../shared/smusUtils.ts | 5 + .../auth/smusAuthenticationProvider.test.ts | 20 +- .../auth/ui/iamProfileSelection.test.ts | 10 - 7 files changed, 354 insertions(+), 529 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index 175abe491c8..60d02bdb55f 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -156,7 +156,7 @@ export class SmusAuthenticationOrchestrator { try { // Connect to SMUS using the authentication provider - const connection = await authProvider.connectToSmus(domainUrl) + const connection = await authProvider.connectToSmusWithSso(domainUrl) if (!connection) { throw new ToolkitError('Failed to establish connection', { diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index e36c897083d..a1513ed84f4 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -333,12 +333,12 @@ export class SmusAuthenticationProvider { } /** - * Authenticates with SageMaker Unified Studio using a domain URL + * Authenticates with SageMaker Unified Studio using SSO and a domain URL * @param domainUrl The SageMaker Unified Studio domain URL - * @returns Promise resolving to the connection + * @returns Promise resolving to the SSO connection */ - @withTelemetryContext({ name: 'connectToSmus', class: authClassName }) - public async connectToSmus(domainUrl: string): Promise { + @withTelemetryContext({ name: 'connectToSmusWithSso', class: authClassName }) + public async connectToSmusWithSso(domainUrl: string): Promise { const logger = getLogger() try { @@ -366,7 +366,7 @@ export class SmusAuthenticationProvider { if (connectionState === 'valid') { logger.info('SMUS: Using existing valid connection') - // Only SSO connections can be used with connectToSmus + // Only SSO connections can be used with connectToSmusWithSso if (isSmusSsoConnection(existingConn)) { // Use the existing SSO connection const result = await this.secondaryAuth.useNewConnection(existingConn) @@ -377,14 +377,6 @@ export class SmusAuthenticationProvider { } return result as SmusConnection - } else { - // For IAM connections, we can't use connectToSmus - this method is only for SSO connections - throw new ToolkitError( - 'Cannot connect to SMUS with SSO method using an existing IAM connection. Please use connectWithIamProfile instead.', - { - code: 'InvalidConnectionType', - } - ) } } @@ -411,10 +403,6 @@ export class SmusAuthenticationProvider { } return result as SmusConnection - } else { - // For IAM connections, we can't reauthenticate - need to create a new connection - logger.info('SMUS: Existing IAM connection is invalid, will create new SSO connection') - // Fall through to create new SSO connection logic } } } diff --git a/packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts b/packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts index 8b0e79a9f5d..8693fc43670 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/ui/authenticationMethodSelection.ts @@ -38,8 +38,8 @@ export class SmusAuthenticationMethodSelector { const iamOption: vscode.QuickPickItem = { label: '$(key) IAM Role', - description: 'SageMaker Unified Studio Lightning/Express', - detail: 'Use Lightning IAM role credentials to access your Unified Studio Lightning resources', + description: 'SageMaker Unified Studio Express', + detail: 'Use login IAM role credentials to access your Unified Studio Express resources', } const ssoOption: vscode.QuickPickItem = { diff --git a/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts b/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts index 7a242e943f4..565a4c46d53 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/ui/iamProfileSelection.ts @@ -9,9 +9,36 @@ import { getLogger } from '../../../shared/logger/logger' import { ToolkitError } from '../../../shared/errors' import { loadSharedCredentialsProfiles } from '../../../auth/credentials/sharedCredentials' import { getCredentialsFilename, getConfigFilename } from '../../../auth/credentials/sharedCredentialsFile' -import { SmusErrorCodes } from '../../shared/smusUtils' +import { SmusErrorCodes, DataZoneServiceId } from '../../shared/smusUtils' +import globals from '../../../shared/extensionGlobals' import fs from '../../../shared/fs/fs' +/** + * Actions available in the credential management dialog + */ +enum CredentialManagementAction { + EditCredentialsFile = 'EDIT_CREDENTIALS_FILE', + EditConfigFile = 'EDIT_CONFIG_FILE', + AddNewProfile = 'ADD_NEW_PROFILE', +} + +/** + * Actions available in the profile selection dialog + */ +enum ProfileSelectionAction { + SelectProfile = 'SELECT_PROFILE', + ManageCredentials = 'MANAGE_CREDENTIALS', +} + +/** + * Actions available in the session token input dialog + */ +enum SessionTokenAction { + Skip = 'SKIP', + UseToken = 'USE_TOKEN', + Warning = 'WARNING', +} + /** * Result of IAM profile selection */ @@ -42,6 +69,30 @@ export interface IamProfileBackNavigation { export class SmusIamProfileSelector { private static readonly logger = getLogger() + // Validation regex patterns (based on AWS STS API specifications) + // Reference: https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html + private static readonly profileNamePattern = /^[a-zA-Z0-9_-]+$/ + // AWS AccessKeyId: 16-128 chars, pattern [\w]* (alphanumeric + underscore) + private static readonly accessKeyIdPattern = /^[a-zA-Z0-9_]*$/ + // AWS SecretAccessKey and SessionToken: Required per STS API, but no pattern/length constraints specified + private static readonly regionLinePattern = /^region\s*=.*$/m + + /** + * Creates a QuickPick with common settings for input dialogs + * @param title Title for the QuickPick + * @param placeholder Placeholder text + * @returns Configured QuickPick instance + */ + private static createInputQuickPick(title: string, placeholder: string): vscode.QuickPick { + const quickPick = vscode.window.createQuickPick() + quickPick.title = title + quickPick.placeholder = placeholder + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + quickPick.buttons = [vscode.QuickInputButtons.Back] + return quickPick + } + /** * Shows the IAM profile selection dialog matching the Figma design * @returns Promise resolving to the selected profile and region, editing status, or back navigation @@ -57,7 +108,11 @@ export class SmusIamProfileSelector { const profileNames = Object.keys(profiles) // Create QuickPick items for profiles - const profileItems: vscode.QuickPickItem[] = profileNames.map((profileName) => { + const profileItems: (vscode.QuickPickItem & { + action: ProfileSelectionAction + profileName: string + region: string + })[] = profileNames.map((profileName) => { const profile = profiles[profileName] const region = profile.region || 'not-set' @@ -65,17 +120,18 @@ export class SmusIamProfileSelector { label: `$(key) ${profileName}`, description: `IAM Credentials, configured locally (${region})`, detail: `Profile: ${profileName} | Region: ${region}`, - // Store profile data for easy access + action: ProfileSelectionAction.SelectProfile, profileName, region, - } as vscode.QuickPickItem & { profileName: string; region: string } + } }) - // Add "Add and edit credentials" option - const addCredentialsItem: vscode.QuickPickItem = { - label: '$(add) Add and edit credentials', + // Add "Add or edit credentials" option + const addCredentialsItem: vscode.QuickPickItem & { action: ProfileSelectionAction } = { + label: '$(add) Add or edit credentials', description: 'Manage AWS credential profiles', detail: 'Add new profiles or edit existing credential files', + action: ProfileSelectionAction.ManageCredentials, } const options = [...profileItems, addCredentialsItem] @@ -110,14 +166,28 @@ export class SmusIamProfileSelector { isCompleted = true quickPick.dispose() - // Check if user selected "Add and edit credentials" - if (selectedItem === addCredentialsItem) { + const itemWithAction = selectedItem as vscode.QuickPickItem & { + action: ProfileSelectionAction + profileName?: string + region?: string + } + + // Check if user selected "Add or edit credentials" + if (itemWithAction.action === ProfileSelectionAction.ManageCredentials) { // Handle the async credential management flow void (async () => { try { - const shouldRestart = await SmusIamProfileSelector.showCredentialManagement() - if (shouldRestart) { - // Only restart if user completed the "Add New Profile" flow + const managementResult = await SmusIamProfileSelector.showCredentialManagement() + + // Check if a new profile was created (returns IamProfileSelection) + if (typeof managementResult === 'object' && 'profileName' in managementResult) { + // User created a new profile, use it directly + logger.debug( + `SMUS Auth: Using newly created profile: ${managementResult.profileName}` + ) + resolve(managementResult) + } else if (managementResult === true) { + // User wants to restart profile selection (e.g., clicked back) const result = await SmusIamProfileSelector.showIamProfileSelection() resolve(result) } else { @@ -144,24 +214,37 @@ export class SmusIamProfileSelector { } // User selected an existing profile - const profileItem = selectedItem as vscode.QuickPickItem & { profileName: string; region: string } + // Ensure we have profile data (should always be present for SelectProfile action) + if (!itemWithAction.profileName || !itemWithAction.region) { + reject(new ToolkitError('Invalid profile selection', { code: 'InvalidProfileSelection' })) + return + } - logger.debug(`SMUS Auth: User selected profile: ${profileItem.profileName}`) + const profileName = itemWithAction.profileName + const profileRegion = itemWithAction.region + + logger.debug(`SMUS Auth: User selected profile: ${profileName}`) // Check if region is not set and prompt for region selection - if (profileItem.region === 'not-set') { + if (profileRegion === 'not-set') { void (async () => { try { const selectedRegion = await SmusIamProfileSelector.showRegionSelection() + // Check if user clicked back on region selection + if (selectedRegion === 'BACK') { + resolve({ + isBack: true, + message: 'User chose to go back from region selection.', + }) + return + } + // Update the profile with the selected region - await SmusIamProfileSelector.updateProfileRegion( - profileItem.profileName, - selectedRegion - ) + await SmusIamProfileSelector.updateProfileRegion(profileName, selectedRegion) resolve({ - profileName: profileItem.profileName, + profileName: profileName, region: selectedRegion, }) } catch (error) { @@ -170,14 +253,14 @@ export class SmusIamProfileSelector { })() } else { resolve({ - profileName: profileItem.profileName, - region: profileItem.region, + profileName: profileName, + region: profileRegion, }) } }) quickPick.onDidTriggerButton((button) => { - if (button === backButton) { + if (button === vscode.QuickInputButtons.Back) { isCompleted = true quickPick.dispose() resolve({ @@ -213,50 +296,45 @@ export class SmusIamProfileSelector { /** * Shows region selection dialog for IAM authentication - * @param defaultRegion Optional default region to pre-select + * @param options Configuration options for the region selection dialog * @returns Promise resolving to the selected region or 'BACK' if user wants to go back */ - public static async showRegionSelection(defaultRegion?: string): Promise { + public static async showRegionSelection(options?: { + defaultRegion?: string + title?: string + placeholder?: string + returnBackOnCancel?: boolean + }): Promise { const logger = this.logger - // Common AWS regions - const regions = [ - { name: 'US East (N. Virginia)', code: 'us-east-1' }, - { name: 'US East (Ohio)', code: 'us-east-2' }, - { name: 'US West (Oregon)', code: 'us-west-2' }, - { name: 'US West (N. California)', code: 'us-west-1' }, - { name: 'Europe (Ireland)', code: 'eu-west-1' }, - { name: 'Europe (London)', code: 'eu-west-2' }, - { name: 'Europe (Frankfurt)', code: 'eu-central-1' }, - { name: 'Asia Pacific (Singapore)', code: 'ap-southeast-1' }, - { name: 'Asia Pacific (Sydney)', code: 'ap-southeast-2' }, - { name: 'Asia Pacific (Tokyo)', code: 'ap-northeast-1' }, - ] + // Get regions where DataZone service is available + const allRegions = globals.regionProvider.getRegions() + const dataZoneRegions = allRegions.filter((region) => + globals.regionProvider.isServiceInRegion(DataZoneServiceId, region.id) + ) + + // If no regions found with DataZone service, fall back to all regions + const regions = dataZoneRegions.length > 0 ? dataZoneRegions : allRegions const regionItems: vscode.QuickPickItem[] = regions.map( (region) => ({ label: region.name, - description: region.code, - detail: `AWS Region: ${region.code}`, - regionCode: region.code, + description: region.id, + detail: `AWS Region: ${region.id}`, + regionCode: region.id, }) as vscode.QuickPickItem & { regionCode: string } ) - const quickPick = vscode.window.createQuickPick() - quickPick.title = 'Select AWS Region' - quickPick.placeholder = 'Choose the AWS region for SageMaker Unified Studio' + const quickPick = this.createInputQuickPick( + options?.title ?? 'Select AWS Region', + options?.placeholder ?? 'Choose the AWS region for SageMaker Unified Studio' + ) quickPick.items = regionItems - quickPick.canSelectMany = false - quickPick.ignoreFocusOut = true - - // Add back button - const backButton = vscode.QuickInputButtons.Back - quickPick.buttons = [backButton] // Pre-select default region if provided - if (defaultRegion) { - const defaultItem = regionItems.find((item) => (item as any).regionCode === defaultRegion) + if (options?.defaultRegion) { + const defaultItem = regionItems.find((item) => (item as any).regionCode === options.defaultRegion) if (defaultItem) { quickPick.activeItems = [defaultItem] } @@ -268,10 +346,18 @@ export class SmusIamProfileSelector { quickPick.onDidAccept(() => { const selectedItem = quickPick.selectedItems[0] if (!selectedItem) { - quickPick.dispose() - reject( - new ToolkitError('No region selected', { code: SmusErrorCodes.UserCancelled, cancelled: true }) - ) + if (options?.returnBackOnCancel) { + quickPick.dispose() + resolve('BACK') + } else { + quickPick.dispose() + reject( + new ToolkitError('No region selected', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + } return } @@ -286,7 +372,7 @@ export class SmusIamProfileSelector { }) quickPick.onDidTriggerButton((button) => { - if (button === backButton) { + if (button === vscode.QuickInputButtons.Back) { isCompleted = true quickPick.dispose() resolve('BACK') @@ -296,12 +382,16 @@ export class SmusIamProfileSelector { quickPick.onDidHide(() => { if (!isCompleted) { quickPick.dispose() - reject( - new ToolkitError('Region selection cancelled', { - code: SmusErrorCodes.UserCancelled, - cancelled: true, - }) - ) + if (options?.returnBackOnCancel) { + resolve('BACK') + } else { + reject( + new ToolkitError('Region selection cancelled', { + code: SmusErrorCodes.UserCancelled, + cancelled: true, + }) + ) + } } }) @@ -309,74 +399,33 @@ export class SmusIamProfileSelector { }) } - /** - * Validates an IAM credential profile - * @param profileName Profile name to validate - * @returns Promise resolving to validation result - */ - public static async validateProfile(profileName: string): Promise<{ isValid: boolean; error?: string }> { - const logger = this.logger - - try { - logger.debug(`SMUS Auth: Validating profile: ${profileName}`) - - // Load profiles to check if the profile exists - const profiles = await loadSharedCredentialsProfiles() - - if (!profiles[profileName]) { - return { - isValid: false, - error: `Profile '${profileName}' not found in AWS credentials`, - } - } - - const profile = profiles[profileName] - - // Basic validation - check for required fields - if (!profile.aws_access_key_id && !profile.role_arn && !profile.sso_start_url) { - return { - isValid: false, - error: `Profile '${profileName}' is missing required credentials`, - } - } - - logger.debug(`SMUS Auth: Profile validation successful: ${profileName}`) - - return { isValid: true } - } catch (error) { - logger.error(`SMUS Auth: Profile validation failed: ${profileName}`, error) - - return { - isValid: false, - error: `Failed to validate profile '${profileName}': ${(error as Error).message}`, - } - } - } - /** * Shows credential management options (Add/Edit credentials) - * @returns Promise resolving to boolean indicating if profile selection should restart + * @returns Promise resolving to boolean indicating if profile selection should restart, or profile data if a new profile was created */ - public static async showCredentialManagement(): Promise { + public static async showCredentialManagement(): Promise { const logger = this.logger logger.debug('SMUS Auth: Showing credential management options') - const options: vscode.QuickPickItem[] = [ + const options: (vscode.QuickPickItem & { action: CredentialManagementAction })[] = [ { label: '$(file-text) Edit AWS Credentials File', description: 'Open ~/.aws/credentials file for editing', detail: 'Edit existing credential profiles or add new ones', + action: CredentialManagementAction.EditCredentialsFile, }, { label: '$(file-text) Edit AWS Config File', description: 'Open ~/.aws/config file for editing', detail: 'Edit AWS configuration settings and profiles', + action: CredentialManagementAction.EditConfigFile, }, { label: '$(add) Add New Profile', description: 'Create a new AWS credential profile', detail: 'Interactive setup for a new credential profile', + action: CredentialManagementAction.AddNewProfile, }, ] @@ -410,18 +459,29 @@ export class SmusIamProfileSelector { // Handle the async operations after disposing the quick pick void (async () => { try { - if (selectedItem.label.includes('Edit AWS Credentials File')) { - const result = await this.openCredentialsFile() - // If user clicked "Select Profile", restart profile selection - resolve(result === 'RESTART_PROFILE_SELECTION') - } else if (selectedItem.label.includes('Edit AWS Config File')) { - const result = await this.openConfigFile() - // If user clicked "Select Profile", restart profile selection - resolve(result === 'RESTART_PROFILE_SELECTION') - } else if (selectedItem.label.includes('Add New Profile')) { - await this.addNewProfile() - // Restart profile selection after adding new profile - resolve(true) + const itemWithAction = selectedItem as vscode.QuickPickItem & { + action: CredentialManagementAction + } + + switch (itemWithAction.action) { + case CredentialManagementAction.EditCredentialsFile: { + const result = await this.openAwsFile('credentials') + // If user clicked "Select Profile", restart profile selection + resolve(result === 'RESTART_PROFILE_SELECTION') + break + } + case CredentialManagementAction.EditConfigFile: { + const result = await this.openAwsFile('config') + // If user clicked "Select Profile", restart profile selection + resolve(result === 'RESTART_PROFILE_SELECTION') + break + } + case CredentialManagementAction.AddNewProfile: { + const newProfile = await this.addNewProfile() + // Return the newly created profile data to use it directly + resolve(newProfile) + break + } } } catch (error) { if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { @@ -435,7 +495,7 @@ export class SmusIamProfileSelector { }) quickPick.onDidTriggerButton((button) => { - if (button === backButton) { + if (button === vscode.QuickInputButtons.Back) { isCompleted = true quickPick.dispose() // User wants to go back to profile selection @@ -462,105 +522,48 @@ export class SmusIamProfileSelector { /** * Opens the AWS credentials file in VS Code editor */ - private static async openCredentialsFile(): Promise { - const logger = this.logger - - try { - const credentialsPath = getCredentialsFilename() - logger.debug(`SMUS Auth: Opening credentials file: ${credentialsPath}`) - - // Ensure the .aws directory exists - await this.ensureAwsDirectoryExists() - - // Create the file if it doesn't exist - if (!(await fs.existsFile(credentialsPath))) { - await fs.writeFile(credentialsPath, this.getDefaultCredentialsContent()) - logger.debug('SMUS Auth: Created new credentials file') - } - - // Open the file in VS Code - const document = await vscode.workspace.openTextDocument(credentialsPath) - await vscode.window.showTextDocument(document) - - // Show helpful message with options - const action = await vscode.window.showInformationMessage( - 'AWS credentials file opened. You can edit your profiles or select an existing one.', - 'Select Profile', - 'Open Credentials File', - 'Done' - ) - - if (action === 'Select Profile') { - // Directly restart profile selection - much cleaner than throwing errors - return 'RESTART_PROFILE_SELECTION' - } else if (action === 'Open Credentials File') { - // Keep the file open and let user edit - // File is already open, nothing more to do - } - // If "Done" or dismissed, just continue - - logger.debug('SMUS Auth: Credentials file opened successfully') - } catch (error) { - logger.error('SMUS Auth: Failed to open credentials file: %s', error) - throw new ToolkitError(`Failed to open AWS credentials file: ${(error as Error).message}`, { - code: 'CredentialsFileError', - }) - } - } - /** - * Opens the AWS config file in VS Code editor + * Opens an AWS configuration file in VS Code editor + * @param fileType Type of file to open ('credentials' or 'config') */ - private static async openConfigFile(): Promise { + private static async openAwsFile(fileType: 'credentials' | 'config'): Promise { const logger = this.logger + const isCredentials = fileType === 'credentials' try { - const configPath = getConfigFilename() - logger.debug(`SMUS Auth: Opening config file: ${configPath}`) + const filePath = isCredentials ? getCredentialsFilename() : getConfigFilename() + const fileLabel = isCredentials ? 'credentials' : 'config' + + logger.debug(`SMUS Auth: Opening ${fileLabel} file: ${filePath}`) // Ensure the .aws directory exists await this.ensureAwsDirectoryExists() // Create the file if it doesn't exist - if (!(await fs.existsFile(configPath))) { - await fs.writeFile(configPath, this.getDefaultConfigContent()) - logger.debug('SMUS Auth: Created new config file') + if (!(await fs.existsFile(filePath))) { + await fs.writeFile(filePath, '') + logger.debug(`SMUS Auth: Created new ${fileLabel} file`) } // Open the file in VS Code - const document = await vscode.workspace.openTextDocument(configPath) + const document = await vscode.workspace.openTextDocument(filePath) await vscode.window.showTextDocument(document) - // Show helpful message with options - const action = await vscode.window.showInformationMessage( - 'AWS config file opened. You can edit your configuration or select an existing profile.', - 'Select Profile', - 'Open Config File', - 'Done' - ) - - if (action === 'Select Profile') { - // Directly restart profile selection - much cleaner than throwing errors - return 'RESTART_PROFILE_SELECTION' - } else if (action === 'Open Config File') { - // Keep the file open and let user edit - // File is already open, nothing more to do - } - // If "Done" or dismissed, just continue - - logger.debug('SMUS Auth: Config file opened successfully') + logger.debug(`SMUS Auth: ${fileLabel} file opened successfully`) } catch (error) { - logger.error('SMUS Auth: Failed to open config file: %s', error) - throw new ToolkitError(`Failed to open AWS config file: ${(error as Error).message}`, { - code: 'ConfigFileError', + const fileLabel = isCredentials ? 'credentials' : 'config' + logger.error(`SMUS Auth: Failed to open ${fileLabel} file: %s`, error) + throw new ToolkitError(`Failed to open AWS ${fileLabel} file: ${(error as Error).message}`, { + code: isCredentials ? 'CredentialsFileError' : 'ConfigFileError', }) } } /** * Interactive flow to add a new AWS credential profile with back navigation + * @returns Promise resolving to the newly created profile data */ - private static async addNewProfile(): Promise { + private static async addNewProfile(): Promise { const logger = this.logger try { @@ -583,17 +586,17 @@ export class SmusIamProfileSelector { ) // Show success message - const openFile = await vscode.window.showInformationMessage( - `AWS profile '${profileData.profileName}' has been added successfully!`, - 'Open Credentials File', - 'Done' + void vscode.window.showInformationMessage( + `AWS profile '${profileData.profileName}' has been added successfully and will be used for authentication.` ) - if (openFile === 'Open Credentials File') { - await this.openCredentialsFile() - } - logger.debug(`SMUS Auth: Successfully added new profile: ${profileData.profileName}`) + + // Return the profile data to use it directly + return { + profileName: profileData.profileName, + region: profileData.region, + } } catch (error) { // Only log actual errors, not user cancellations if (error instanceof ToolkitError && error.code === SmusErrorCodes.UserCancelled) { @@ -616,7 +619,7 @@ export class SmusIamProfileSelector { accessKeyId: string secretAccessKey: string sessionToken?: string - region?: string + region: string } | 'BACK' > { @@ -633,7 +636,7 @@ export class SmusIamProfileSelector { // Step 1: Profile Name const result = await this.getProfileNameInput() if (result === 'BACK') { - return 'BACK' // Exit the entire flow + return 'BACK' // User wants to go back - exit to credential management menu } profileName = result currentStep = 2 @@ -673,8 +676,12 @@ export class SmusIamProfileSelector { break } case 5: { - // Step 5: Region (optional) - const result = await this.getRegionInput() + // Step 5: Region + const result = await this.showRegionSelection({ + title: 'Add New AWS Profile - Step 5 of 5', + placeholder: 'Select a default region', + returnBackOnCancel: true, + }) if (result === 'BACK') { currentStep = 4 // Go back to step 4 } else { @@ -691,7 +698,7 @@ export class SmusIamProfileSelector { accessKeyId, secretAccessKey, sessionToken: sessionToken || undefined, - region: region || undefined, + region, // Region is always set since step 5 is required } } @@ -700,23 +707,16 @@ export class SmusIamProfileSelector { */ private static async getProfileNameInput(): Promise { return new Promise((resolve) => { - const quickPick = vscode.window.createQuickPick() - quickPick.title = 'Add New AWS Profile - Step 1 of 5' - quickPick.placeholder = 'Type a profile name (e.g., my-profile, dev, prod)' - quickPick.canSelectMany = false - quickPick.ignoreFocusOut = true - - // Add back button - const backButton = vscode.QuickInputButtons.Back - quickPick.buttons = [backButton] - - // Enable text input + const quickPick = this.createInputQuickPick( + 'Add New AWS Profile - Step 1 of 5', + 'Type a profile name (e.g., my-profile, dev, prod)' + ) quickPick.items = [] let isCompleted = false quickPick.onDidTriggerButton((button) => { - if (button === backButton) { + if (button === vscode.QuickInputButtons.Back) { isCompleted = true quickPick.dispose() resolve('BACK') @@ -740,25 +740,25 @@ export class SmusIamProfileSelector { if (value.includes(' ')) { quickPick.items = [ { - label: '$(error) Profile name cannot contain spaces', - description: 'Remove spaces from the profile name', + label: `${value}`, + description: '$(error) Cannot contain spaces', detail: 'Valid characters: letters, numbers, hyphens, underscores', }, ] - } else if (!/^[a-zA-Z0-9_-]*$/.test(value)) { + } else if (!this.profileNamePattern.test(value)) { quickPick.items = [ { - label: '$(error) Invalid characters in profile name', - description: 'Profile names can only contain letters, numbers, hyphens, and underscores', - detail: `Current input: "${value}"`, + label: `${value}`, + description: '$(error) Invalid characters', + detail: 'Profile names can only contain letters, numbers, hyphens, and underscores', }, ] } else if (value.length < 2) { quickPick.items = [ { - label: '$(info) Profile name is too short', - description: 'Profile names should be at least 2 characters long', - detail: `Current length: ${value.length} characters`, + label: `${value}`, + description: `$(info) Too short (${value.length}/2 min)`, + detail: 'Profile names should be at least 2 characters long', }, ] } else { @@ -770,17 +770,17 @@ export class SmusIamProfileSelector { if (profileExists) { quickPick.items = [ { - label: `$(warning) ${value}`, - description: 'Profile already exists - will be overwritten', + label: `${value}`, + description: '$(warning) Profile exists - will be overwritten', detail: 'Press Enter to overwrite the existing profile', }, ] } else { quickPick.items = [ { - label: `$(check) ${value}`, - description: 'Press Enter to use this profile name', - detail: `Valid profile name (${value.length} characters)`, + label: `${value}`, + description: `$(check) Valid (${value.length} characters)`, + detail: 'Press Enter to use this profile name', }, ] } @@ -788,9 +788,9 @@ export class SmusIamProfileSelector { // If we can't load profiles, just show as valid quickPick.items = [ { - label: `$(check) ${value}`, - description: 'Press Enter to use this profile name', - detail: `Valid profile name (${value.length} characters)`, + label: `${value}`, + description: `$(check) Valid (${value.length} characters)`, + detail: 'Press Enter to use this profile name', }, ] } @@ -807,7 +807,7 @@ export class SmusIamProfileSelector { if (value.includes(' ')) { return // Don't accept names with spaces } - if (!/^[a-zA-Z0-9_-]+$/.test(value)) { + if (!this.profileNamePattern.test(value)) { return // Don't accept invalid characters } @@ -861,23 +861,16 @@ export class SmusIamProfileSelector { */ private static async getAccessKeyIdInput(): Promise { return new Promise((resolve) => { - const quickPick = vscode.window.createQuickPick() - quickPick.title = 'Add New AWS Profile - Step 2 of 5' - quickPick.placeholder = 'Type your AWS Access Key ID (e.g., AKIAIOSFODNN7EXAMPLE)' - quickPick.canSelectMany = false - quickPick.ignoreFocusOut = true - - // Add back button - const backButton = vscode.QuickInputButtons.Back - quickPick.buttons = [backButton] - - // Enable text input + const quickPick = this.createInputQuickPick( + 'Add New AWS Profile - Step 2 of 5', + 'Type your AWS Access Key ID (e.g., AKIAIOSFODNN7EXAMPLE)' + ) quickPick.items = [] let isCompleted = false quickPick.onDidTriggerButton((button) => { - if (button === backButton) { + if (button === vscode.QuickInputButtons.Back) { isCompleted = true quickPick.dispose() resolve('BACK') @@ -897,37 +890,38 @@ export class SmusIamProfileSelector { return } - // Validate input as user types - if (!/^[A-Z0-9]*$/.test(value)) { + // Validate input as user types (AWS STS API: 16-128 chars, pattern [\w]*) + // Reference: https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html + if (!this.accessKeyIdPattern.test(value)) { quickPick.items = [ { - label: '$(error) Invalid characters in Access Key ID', - description: 'Access Key IDs should only contain uppercase letters and numbers', - detail: `Current input: "${value}"`, + label: `${value}`, + description: '$(error) Invalid characters', + detail: 'Access Key IDs can only contain letters, numbers, and underscores', }, ] } else if (value.length < 16) { quickPick.items = [ { - label: '$(info) Access Key ID seems short', - description: 'Access Key IDs are typically 16-32 characters long', - detail: `Current length: ${value.length} characters`, + label: `${value}`, + description: `$(info) Too short (${value.length}/16 min)`, + detail: 'AWS Access Key IDs must be 16-128 characters long', }, ] - } else if (value.length > 32) { + } else if (value.length > 128) { quickPick.items = [ { - label: '$(error) Access Key ID seems too long', - description: 'Access Key IDs are typically 16-32 characters long', - detail: `Current length: ${value.length} characters`, + label: `${value}`, + description: `$(error) Too long (${value.length}/128 max)`, + detail: 'AWS Access Key IDs must be 16-128 characters long', }, ] } else { quickPick.items = [ { - label: `$(check) ${value}`, - description: 'Press Enter to use this Access Key ID', - detail: `Valid Access Key ID (${value.length} characters)`, + label: `${value}`, + description: `$(check) Valid (${value.length} characters)`, + detail: 'Press Enter to use this Access Key ID', }, ] } @@ -936,11 +930,15 @@ export class SmusIamProfileSelector { quickPick.onDidAccept(() => { const value = quickPick.value.trim() - // Validate final input + // Validate final input (AWS STS API: 16-128 chars, pattern [\w]*) + // Reference: https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html if (!value) { return // Don't accept empty input } - if (value.length < 16 || value.length > 32) { + if (!this.accessKeyIdPattern.test(value)) { + return // Don't accept invalid characters + } + if (value.length < 16 || value.length > 128) { return // Don't accept invalid length } @@ -965,23 +963,16 @@ export class SmusIamProfileSelector { */ private static async getSecretAccessKeyInput(): Promise { return new Promise((resolve) => { - const quickPick = vscode.window.createQuickPick() - quickPick.title = 'Add New AWS Profile - Step 3 of 5' - quickPick.placeholder = 'Type your AWS Secret Access Key (will be hidden when typing)' - quickPick.canSelectMany = false - quickPick.ignoreFocusOut = true - - // Add back button - const backButton = vscode.QuickInputButtons.Back - quickPick.buttons = [backButton] - - // Enable text input + const quickPick = this.createInputQuickPick( + 'Add New AWS Profile - Step 3 of 5', + 'Type your AWS Secret Access Key (will be hidden when typing)' + ) quickPick.items = [] let isCompleted = false quickPick.onDidTriggerButton((button) => { - if (button === backButton) { + if (button === vscode.QuickInputButtons.Back) { isCompleted = true quickPick.dispose() resolve('BACK') @@ -994,43 +985,32 @@ export class SmusIamProfileSelector { quickPick.items = [ { label: '$(lock) Enter AWS Secret Access Key', - description: 'e.g., wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY', - detail: 'Secret Access Keys are typically 40+ characters long', + description: 'Required field', + detail: 'Enter your AWS Secret Access Key', }, ] return } - // Validate input as user types (but don't show the actual value for security) - if (value.length < 20) { - quickPick.items = [ - { - label: '$(info) Secret Access Key seems short', - description: 'Secret Access Keys are typically 40+ characters long', - detail: `Current length: ${value.length} characters`, - }, - ] - } else if (value.length >= 20) { - quickPick.items = [ - { - label: `$(check) Secret Access Key entered (${value.length} characters)`, - description: 'Press Enter to use this Secret Access Key', - detail: 'Secret key length looks good', - }, - ] - } + // AWS STS API: Required, no specific pattern/length constraints in docs + // Reference: https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html + quickPick.items = [ + { + label: '•'.repeat(Math.min(value.length, 40)), + description: `$(check) ${value.length} characters entered`, + detail: 'Press Enter to continue', + }, + ] }) quickPick.onDidAccept(() => { const value = quickPick.value.trim() - // Validate final input + // Validate final input - AWS STS API only requires non-empty + // Reference: https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html if (!value) { return // Don't accept empty input } - if (value.length < 20) { - return // Don't accept keys that are too short - } isCompleted = true quickPick.dispose() @@ -1053,14 +1033,10 @@ export class SmusIamProfileSelector { */ private static async getSessionTokenInput(): Promise { return new Promise((resolve) => { - const quickPick = vscode.window.createQuickPick() - quickPick.title = 'Add New AWS Profile - Step 4 of 5' - quickPick.placeholder = 'Enter your AWS Session Token (optional for temporary credentials)' - quickPick.canSelectMany = false - quickPick.ignoreFocusOut = true - - const backButton = vscode.QuickInputButtons.Back - quickPick.buttons = [backButton] + const quickPick = this.createInputQuickPick( + 'Add New AWS Profile - Step 4 of 5', + 'Enter your AWS Session Token (optional for temporary credentials)' + ) // Start with skip option only quickPick.items = [ @@ -1068,13 +1044,14 @@ export class SmusIamProfileSelector { label: '$(arrow-right) Skip', description: 'Skip session token (for permanent credentials)', detail: 'Use this for regular IAM user access keys', - }, + action: SessionTokenAction.Skip, + } as vscode.QuickPickItem & { action: SessionTokenAction }, ] let isCompleted = false quickPick.onDidTriggerButton((button) => { - if (button === backButton) { + if (button === vscode.QuickInputButtons.Back) { isCompleted = true quickPick.dispose() resolve('BACK') @@ -1089,39 +1066,28 @@ export class SmusIamProfileSelector { label: '$(arrow-right) Skip', description: 'Skip session token (for permanent credentials)', detail: 'Use this for regular IAM user access keys', - }, + action: SessionTokenAction.Skip, + } as vscode.QuickPickItem & { action: SessionTokenAction }, ] return } - // Validate input as user types - if (value.length < 50) { - quickPick.items = [ - { - label: '$(warning) Session token seems too short', - description: 'AWS session tokens are typically much longer', - detail: `Current length: ${value.length} characters`, - }, - { - label: '$(arrow-right) Skip', - description: 'Skip session token (for permanent credentials)', - detail: 'Use this for regular IAM user access keys', - }, - ] - } else { - quickPick.items = [ - { - label: '$(check) Use this session token', - description: 'Session token looks valid', - detail: `Length: ${value.length} characters`, - }, - { - label: '$(arrow-right) Skip', - description: 'Skip session token (for permanent credentials)', - detail: 'Use this for regular IAM user access keys', - }, - ] - } + // AWS STS API: Required for temporary credentials, no specific pattern/length constraints in docs + // Reference: https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html + quickPick.items = [ + { + label: '•'.repeat(Math.min(value.length, 40)), + description: `$(check) ${value.length} characters entered`, + detail: 'Press Enter to use this session token', + action: SessionTokenAction.UseToken, + } as vscode.QuickPickItem & { action: SessionTokenAction }, + { + label: '$(arrow-right) Skip', + description: 'Skip session token (for permanent credentials)', + detail: 'Use this for regular IAM user access keys', + action: SessionTokenAction.Skip, + } as vscode.QuickPickItem & { action: SessionTokenAction }, + ] }) quickPick.onDidAccept(() => { @@ -1137,99 +1103,28 @@ export class SmusIamProfileSelector { return } - // If user selected skip or no selection with empty value - if (!selectedItem || selectedItem.label.includes('Skip')) { - resolve('') - return - } - - // If user selected "Use this session token", use the typed value (trimmed) - if (selectedItem.label.includes('Use this session token')) { - resolve(currentValue.trim()) - return - } - - // Default to empty - resolve('') - }) - - quickPick.onDidHide(() => { - if (!isCompleted) { - quickPick.dispose() - resolve('BACK') - } - }) - - quickPick.show() - }) - } - - /** - * Gets region input with back navigation - */ - private static async getRegionInput(): Promise { - return new Promise((resolve) => { - const quickPick = vscode.window.createQuickPick() - quickPick.title = 'Add New AWS Profile - Step 5 of 5' - quickPick.placeholder = 'Select a default region (optional)' - quickPick.canSelectMany = false - quickPick.ignoreFocusOut = true - - const backButton = vscode.QuickInputButtons.Back - quickPick.buttons = [backButton] - - const regions = [ - { name: 'US East (N. Virginia)', code: 'us-east-1' }, - { name: 'US East (Ohio)', code: 'us-east-2' }, - { name: 'US West (Oregon)', code: 'us-west-2' }, - { name: 'US West (N. California)', code: 'us-west-1' }, - { name: 'Europe (Ireland)', code: 'eu-west-1' }, - { name: 'Europe (London)', code: 'eu-west-2' }, - { name: 'Europe (Frankfurt)', code: 'eu-central-1' }, - { name: 'Asia Pacific (Singapore)', code: 'ap-southeast-1' }, - { name: 'Asia Pacific (Sydney)', code: 'ap-southeast-2' }, - { name: 'Asia Pacific (Tokyo)', code: 'ap-northeast-1' }, - ] - - const regionItems = regions.map((region) => ({ - label: region.name, - description: region.code, - detail: `AWS Region: ${region.code}`, - regionCode: region.code, - })) - - const skipItem = { - label: '$(arrow-right) Skip', - description: 'No default region', - detail: 'You can set this later if needed', - } - - quickPick.items = [...regionItems, skipItem] - - let isCompleted = false - - quickPick.onDidTriggerButton((button) => { - if (button === backButton) { - isCompleted = true - quickPick.dispose() - resolve('BACK') - } - }) - - quickPick.onDidAccept(() => { - const selectedItem = quickPick.selectedItems[0] + // If no selection with empty value, skip if (!selectedItem) { + resolve('') return } - isCompleted = true - quickPick.dispose() + const itemWithAction = selectedItem as vscode.QuickPickItem & { action: SessionTokenAction } - if (selectedItem === skipItem) { - resolve('') - } else { - const regionItem = selectedItem as any - resolve(regionItem.regionCode) + // Handle based on action + switch (itemWithAction.action) { + case SessionTokenAction.Skip: + resolve('') + break + case SessionTokenAction.UseToken: + resolve(currentValue.trim()) + break + case SessionTokenAction.Warning: + // User can still proceed with warning, use the typed value + resolve(currentValue.trim()) + break + default: + resolve('') } }) @@ -1375,12 +1270,11 @@ export class SmusIamProfileSelector { const profileSection = content.slice(profileStartIndex, profileEndIndex) // Check if region already exists in the profile - const regionRegex = /^region\s*=.*$/m let updatedProfileSection: string - if (regionRegex.test(profileSection)) { + if (this.regionLinePattern.test(profileSection)) { // Replace existing region - updatedProfileSection = profileSection.replace(regionRegex, `region = ${region}`) + updatedProfileSection = profileSection.replace(this.regionLinePattern, `region = ${region}`) } else { // Add region to the profile (before any empty lines at the end) const lines = profileSection.split('\n') @@ -1411,56 +1305,4 @@ export class SmusIamProfileSelector { }) } } - - /** - * Returns default content for a new credentials file - */ - private static getDefaultCredentialsContent(): string { - return `# AWS Credentials File -# -# This file stores your AWS access credentials. -# Each profile should have the following format: -# -# For permanent credentials: -# [profile-name] -# aws_access_key_id = YOUR_ACCESS_KEY_ID -# aws_secret_access_key = YOUR_SECRET_ACCESS_KEY -# region = us-east-1 -# -# For temporary/role-based credentials: -# [temp-profile] -# aws_access_key_id = YOUR_ACCESS_KEY_ID -# aws_secret_access_key = YOUR_SECRET_ACCESS_KEY -# aws_session_token = YOUR_SESSION_TOKEN -# region = us-east-1 -# -# Example: -# [default] -# aws_access_key_id = AKIAIOSFODNN7EXAMPLE -# aws_secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY -# region = us-east-1 - -` - } - - /** - * Returns default content for a new config file - */ - private static getDefaultConfigContent(): string { - return `# AWS Config File -# -# This file stores AWS configuration settings. -# Each profile should have the following format: -# -# [profile profile-name] -# region = us-east-1 -# output = json -# -# For the default profile, use: -# [default] -# region = us-east-1 -# output = json - -` - } } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 49ae0bf9907..41df3395118 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -84,6 +84,11 @@ export const SmusTimeouts = { apiCallTimeoutMs: 10 * 1000, } as const +/** + * DataZone service ID used for filtering regions + */ +export const DataZoneServiceId = 'datazone' + /** * Interface for AWS credential objects that need validation */ diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 198503a333e..466e7bf8386 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -197,11 +197,11 @@ describe('SmusAuthenticationProvider', function () { }) }) - describe('connectToSmus', function () { + describe('connectToSmusWithSso', function () { it('should create new connection when none exists', async function () { mockAuth.listConnections.resolves([]) - const result = await smusAuthProvider.connectToSmus(testDomainUrl) + const result = await smusAuthProvider.connectToSmusWithSso(testDomainUrl) assert.strictEqual(result, mockSmusConnection) assert.ok(extractDomainInfoStub.calledWith(testDomainUrl)) @@ -216,7 +216,7 @@ describe('SmusAuthenticationProvider', function () { mockAuth.listConnections.resolves([existingConnection]) mockAuth.getConnectionState.returns('valid') - const result = await smusAuthProvider.connectToSmus(testDomainUrl) + const result = await smusAuthProvider.connectToSmusWithSso(testDomainUrl) assert.strictEqual(result, mockSmusConnection) assert.ok(mockAuth.createConnection.notCalled) @@ -229,7 +229,7 @@ describe('SmusAuthenticationProvider', function () { mockAuth.listConnections.resolves([existingConnection]) mockAuth.getConnectionState.returns('invalid') - const result = await smusAuthProvider.connectToSmus(testDomainUrl) + const result = await smusAuthProvider.connectToSmusWithSso(testDomainUrl) assert.strictEqual(result, mockSmusConnection) assert.ok(mockAuth.reauthenticate.calledWith(existingConnection)) @@ -241,7 +241,7 @@ describe('SmusAuthenticationProvider', function () { extractDomainInfoStub.returns({ domainId: undefined, region: testRegion }) await assert.rejects( - () => smusAuthProvider.connectToSmus('invalid-url'), + () => smusAuthProvider.connectToSmusWithSso('invalid-url'), (err: ToolkitError) => { // The error is wrapped with FailedToConnect, but the original error should be in the cause return err.code === 'FailedToConnect' && (err.cause as any)?.code === 'InvalidDomainUrl' @@ -256,7 +256,7 @@ describe('SmusAuthenticationProvider', function () { getSsoInstanceInfoStub.rejects(error) await assert.rejects( - () => smusAuthProvider.connectToSmus(testDomainUrl), + () => smusAuthProvider.connectToSmusWithSso(testDomainUrl), (err: ToolkitError) => err.code === 'FailedToConnect' ) // Should not trigger project selection on error @@ -268,7 +268,7 @@ describe('SmusAuthenticationProvider', function () { mockAuth.createConnection.rejects(error) await assert.rejects( - () => smusAuthProvider.connectToSmus(testDomainUrl), + () => smusAuthProvider.connectToSmusWithSso(testDomainUrl), (err: ToolkitError) => err.code === 'FailedToConnect' ) // Should not trigger project selection on error @@ -279,7 +279,7 @@ describe('SmusAuthenticationProvider', function () { isInSmusSpaceEnvironmentStub.returns(true) mockAuth.listConnections.resolves([]) - const result = await smusAuthProvider.connectToSmus(testDomainUrl) + const result = await smusAuthProvider.connectToSmusWithSso(testDomainUrl) assert.strictEqual(result, mockSmusConnection) assert.ok(mockAuth.createConnection.called) @@ -293,7 +293,7 @@ describe('SmusAuthenticationProvider', function () { mockAuth.listConnections.resolves([existingConnection]) mockAuth.getConnectionState.returns('valid') - const result = await smusAuthProvider.connectToSmus(testDomainUrl) + const result = await smusAuthProvider.connectToSmusWithSso(testDomainUrl) assert.strictEqual(result, mockSmusConnection) assert.ok(mockSecondaryAuth.useNewConnection.calledWith(existingConnection)) @@ -306,7 +306,7 @@ describe('SmusAuthenticationProvider', function () { mockAuth.listConnections.resolves([existingConnection]) mockAuth.getConnectionState.returns('invalid') - const result = await smusAuthProvider.connectToSmus(testDomainUrl) + const result = await smusAuthProvider.connectToSmusWithSso(testDomainUrl) assert.strictEqual(result, mockSmusConnection) assert.ok(mockAuth.reauthenticate.calledWith(existingConnection)) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts index 4924f18d84c..2a56b2baf0c 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/ui/iamProfileSelection.test.ts @@ -7,16 +7,6 @@ import assert from 'assert' import { SmusIamProfileSelector } from '../../../../sagemakerunifiedstudio/auth/ui/iamProfileSelection' describe('SmusIamProfileSelector', function () { - describe('validateProfile', function () { - // Note: These tests would require mocking loadSharedCredentialsProfiles - // For now, we'll focus on the basic functionality tests - // In a real implementation, we'd need to set up proper test fixtures - - it('should be a static method', function () { - assert.strictEqual(typeof SmusIamProfileSelector.validateProfile, 'function') - }) - }) - describe('showRegionSelection', function () { it('should be a static method', function () { assert.strictEqual(typeof SmusIamProfileSelector.showRegionSelection, 'function') From ab8202c60f1e9423adf431a0b80b77ee3946fa53 Mon Sep 17 00:00:00 2001 From: Keyvan Zare Rami Date: Tue, 7 Oct 2025 18:03:14 -0700 Subject: [PATCH 05/53] feat(smus): hide domain and project nodes in express mode --- packages/core/package.nls.json | 1 + .../providers/smusAuthenticationProvider.ts | 13 +- .../explorer/activation.ts | 4 + .../sageMakerUnifiedStudioProjectNode.ts | 29 +++- .../nodes/sageMakerUnifiedStudioRootNode.ts | 31 ++++- .../sageMakerUnifiedStudioSpacesParentNode.ts | 17 ++- .../shared/client/datazoneClient.ts | 59 ++++++++- .../shared/smusUtils.ts | 19 +++ .../shared/client/datazoneClient.test.ts | 124 ++++++++++++++++++ .../shared/smusUtils.test.ts | 33 +++++ packages/toolkit/package.json | 23 +++- 11 files changed, 331 insertions(+), 22 deletions(-) diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index bcb17a5bdb0..be5d5fbb69f 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -231,6 +231,7 @@ "AWS.command.s3.uploadFileToParent": "Upload to Parent...", "AWS.command.smus.switchProject": "Switch Project", "AWS.command.smus.refreshProject": "Refresh Project", + "AWS.command.smus.refresh": "Refresh", "AWS.command.smus.signOut": "Sign Out", "AWS.command.sagemaker.filterSpaces": "Filter Sagemaker Spaces", "AWS.command.stepFunctions.createStateMachineFromTemplate": "Create a new Step Functions state machine", diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index a1513ed84f4..2fa53a44bd4 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -864,14 +864,19 @@ export class SmusAuthenticationProvider { try { logger.debug('Fetching domain account ID via STS GetCallerIdentity') - // Get DER credentials provider - const derCredProvider = await this.getDerCredentialsProvider() - + let credentialsProvider + if (getContext('aws.smus.isExpressMode')) { + credentialsProvider = await this.getCredentialsProviderForIamProfile( + (this.activeConnection as SmusIamConnection).profileName + ) + } else { + credentialsProvider = await this.getDerCredentialsProvider() + } // Get the region for STS client const region = this.getDomainRegion() // Create STS client with DER credentials - const stsClient = new DefaultStsClient(region, await derCredProvider.getCredentials()) + const stsClient = new DefaultStsClient(region, await credentialsProvider.getCredentials()) // Make GetCallerIdentity call const callerIdentity = await stsClient.getCallerIdentity() diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts index a0a34ae0549..243a6b53a01 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts @@ -64,6 +64,10 @@ export async function activate(extensionContext: vscode.ExtensionContext): Promi await projectNode.refreshNode() }), + vscode.commands.registerCommand('aws.smus.refresh', async () => { + treeDataProvider.refresh() + }), + vscode.commands.registerCommand('aws.smus.switchProject', async () => { // Get the project node from the root node to ensure we're using the same instance const projectNode = smusRootNode.getProjectSelectNode() diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts index 8097ceed9e7..912693906e6 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts @@ -17,6 +17,8 @@ import { SageMakerUnifiedStudioComputeNode } from './sageMakerUnifiedStudioCompu import { getIcon } from '../../../shared/icons' import { getResourceMetadata } from '../../shared/utils/resourceMetadataUtils' import { getContext } from '../../../shared/vscode/setContext' +import { ToolkitError } from '../../../shared/errors' +import { SmusErrorCodes } from '../../shared/smusUtils' /** * Tree node representing a SageMaker Unified Studio project @@ -231,10 +233,29 @@ export class SageMakerUnifiedStudioProjectNode implements TreeNode { if (!this.project) { throw new Error('No project selected for initializing SageMaker client') } - const projectProvider = await this.authProvider.getProjectCredentialProvider(this.project.id) - this.logger.info(`Successfully obtained project credentials provider for project ${this.project.id}`) - const awsCredentialProvider = async (): Promise => { - return await projectProvider.getCredentials() + let awsCredentialProvider + if (getContext('aws.smus.isExpressMode')) { + const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const projectId = this.project.id + awsCredentialProvider = async (): Promise => { + const creds = await datazoneClient.getProjectDefaultEnvironmentCreds(projectId) + if (!creds.accessKeyId || !creds.secretAccessKey) { + throw new ToolkitError('Missing default environment credentials', { + code: SmusErrorCodes.CredentialRetrievalFailed, + }) + } + return { + accessKeyId: creds.accessKeyId!, + secretAccessKey: creds.secretAccessKey!, + sessionToken: creds.sessionToken, + } + } + } else { + const projectProvider = await this.authProvider.getProjectCredentialProvider(this.project.id) + this.logger.info(`Successfully obtained project credentials provider for project ${this.project.id}`) + awsCredentialProvider = async (): Promise => { + return await projectProvider.getCredentials() + } } const sagemakerClient = new SagemakerClient(regionCode, awsCredentialProvider) return sagemakerClient diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index daad15a1e15..62eb14a0663 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -19,6 +19,7 @@ import { ToolkitError } from '../../../../src/shared/errors' import { SmusAuthenticationMethod } from '../../auth/ui/authenticationMethodSelection' import { SmusAuthenticationOrchestrator } from '../../auth/authenticationOrchestrator' import { isSmusSsoConnection } from '../../auth/model' +import { getContext } from '../../../shared/vscode/setContext' const contextValueSmusRoot = 'sageMakerUnifiedStudioRoot' const contextValueSmusLogin = 'sageMakerUnifiedStudioLogin' @@ -134,6 +135,16 @@ export class SageMakerUnifiedStudioRootNode implements TreeNode { ] } + if (getContext('aws.smus.isExpressMode')) { + // In Express mode, immediately show data and compute nodes (project node's children) + if (!this.projectNode.project) { + await selectSMUSProject(this.projectNode) + } + + const projectChildren = await this.projectNode.getChildren() + return projectChildren + } + // When authenticated, show auth info and projects return [this.authInfoNode, this.projectNode] } @@ -461,7 +472,25 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj return } - const selectedProject = await showQuickPick(items) + let selectedProject + if (getContext('aws.smus.isExpressMode')) { + // In express mode, automatically select the express project + logger.debug('Auto-selecting the express project') + const userProfileId = await client.getUserProfileId() + selectedProject = items.find((item) => item.data.createdBy === userProfileId)?.data + if (!selectedProject) { + logger.info(`No project found created by the current user (${userProfileId})`) + void vscode.window.showInformationMessage('No accessible projects found') + return + } + logger.info( + `Selected project ${(selectedProject as DataZoneProject).name} (${(selectedProject as DataZoneProject).id})` + ) + } else { + // Show project picker + selectedProject = await showQuickPick(items) + } + const accountId = await authProvider.getDomainAccountId() span.record({ smusDomainId: authProvider.getDomainId(), diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts index 4531c117978..cf69bcafde2 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts @@ -18,6 +18,7 @@ import { PollingSet } from '../../../shared/utilities/pollingSet' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { SmusUtils } from '../../shared/smusUtils' import { getIcon } from '../../../shared/icons' +import { getContext } from '../../../shared/vscode/setContext' export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { public readonly id = 'smusSpacesParentNode' @@ -179,19 +180,27 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { private async updateChildren(): Promise { const datazoneClient = await DataZoneClient.getInstance(this.authProvider) - // Will be of format: 'ABCA4NU3S7PEOLDQPLXYZ:user-12345678-d061-70a4-0bf2-eeee67a6ab12' - const userId = await datazoneClient.getUserId() - const ssoUserProfileId = SmusUtils.extractSSOIdFromUserId(userId || '') + + let userProfileId + if (getContext('aws.smus.isExpressMode')) { + userProfileId = await datazoneClient?.getUserProfileId() + } else { + // Will be of format: 'ABCA4NU3S7PEOLDQPLXYZ:user-12345678-d061-70a4-0bf2-eeee67a6ab12' + const userId = await datazoneClient.getUserId() + userProfileId = SmusUtils.extractSSOIdFromUserId(userId || '') + } + const sagemakerDomainId = await this.getSageMakerDomainId() const [spaceApps, domains] = await this.sagemakerClient.fetchSpaceAppsAndDomains( sagemakerDomainId, false /* filterSmusDomains */ ) // Filter spaceApps to only show spaces owned by current user + this.logger.debug(`SMUS: Filtering spaces for user profile ID: ${userProfileId}`) const filteredSpaceApps = new Map() for (const [key, app] of spaceApps.entries()) { const userProfile = app.OwnershipSettingsSummary?.OwnerUserProfileName - if (ssoUserProfileId === userProfile) { + if (userProfileId === userProfile) { filteredSpaceApps.set(key, app) } } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts index 4373400ca0c..12c78e3bb10 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts @@ -20,6 +20,9 @@ import { import { getLogger } from '../../../shared/logger/logger' import type { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { DefaultStsClient } from '../../../shared/clients/stsClient' +import { getContext } from '../../../shared/vscode/setContext' +import { SmusUtils } from '../smusUtils' +import { SmusIamConnection } from '../../auth/model' /** * Represents a DataZone domain @@ -41,6 +44,7 @@ export interface DataZoneProject { name: string description?: string domainId: string + createdBy?: string createdAt?: Date updatedAt?: Date } @@ -252,7 +256,7 @@ export class DataZoneClient { const domainBlueprints = await datazoneClient.listEnvironmentBlueprints({ domainIdentifier: this.domainId, managed: true, - name: toolingBlueprintName, + name: this.getToolingBlueprintName(), }) const toolingBlueprint = domainBlueprints.items?.[0] @@ -269,7 +273,7 @@ export class DataZoneClient { provider: sageMakerProviderName, }) - const defaultEnv = listEnvs.items?.find((env) => env.name === toolingBlueprintName) + const defaultEnv = listEnvs.items?.find((env) => env.name === this.getToolingBlueprintName()) if (!defaultEnv) { this.logger.error('Failed to find default Tooling environment') throw new Error('Failed to find default Tooling environment') @@ -294,10 +298,22 @@ export class DataZoneClient { private async getDataZoneClient(): Promise { if (!this.datazoneClient) { try { - this.logger.debug('DataZoneClient: Creating authenticated DataZone client with DER credentials') - const credentialsProvider = async () => { - const credentials = await (await this.authProvider.getDerCredentialsProvider()).getCredentials() + let credentials + if (getContext('aws.smus.isExpressMode')) { + this.logger.info( + 'DataZoneClient: Creating authenticated DataZone client with Iam profile credentials' + ) + const activeConnection = this.authProvider.activeConnection! + credentials = await ( + await this.authProvider.getCredentialsProviderForIamProfile( + (activeConnection as SmusIamConnection).profileName + ) + ).getCredentials() + } else { + this.logger.debug('DataZoneClient: Creating authenticated DataZone client with DER credentials') + credentials = await (await this.authProvider.getDerCredentialsProvider()).getCredentials() + } return { accessKeyId: credentials.accessKeyId, secretAccessKey: credentials.secretAccessKey, @@ -426,6 +442,7 @@ export class DataZoneClient { name: project.name || '', description: project.description, domainId: this.domainId, + createdBy: project.createdBy, createdAt: project.createdAt ? new Date(project.createdAt) : undefined, updatedAt: project.updatedAt ? new Date(project.updatedAt) : undefined, })) @@ -688,7 +705,7 @@ export class DataZoneClient { domainBlueprints = await datazoneClient.listEnvironmentBlueprints({ domainIdentifier: domainId, managed: true, - name: toolingBlueprintName, + name: this.getToolingBlueprintName(), }) } catch (err) { this.logger.error( @@ -725,7 +742,7 @@ export class DataZoneClient { throw err } - const defaultEnv = listEnvs.items?.find((env) => env.name === toolingBlueprintName) + const defaultEnv = listEnvs.items?.find((env) => env.name === this.getToolingBlueprintName()) if (!defaultEnv || !defaultEnv.id) { this.logger.error( 'No default Tooling environment found for domainId: %s, projectId: %s', @@ -801,4 +818,32 @@ export class DataZoneClient { this.logger.debug(`Retrieved caller identity, UserId: ${callerIdentity.UserId}`) return callerIdentity.UserId } + + public async getUserProfileId(): Promise { + const activeConnection = this.authProvider.activeConnection! + const smusConnections = (this.authProvider.secondaryAuth.state.get('smus.connections') as any) || {} + const profileName = smusConnections[activeConnection.id].profileName + const credentialsProvider = await this.authProvider.getCredentialsProviderForIamProfile(profileName) + + const stsClient = new DefaultStsClient(this.getRegion(), await credentialsProvider.getCredentials()) + const callerIdentity = await stsClient.getCallerIdentity() + this.logger.debug(`Retrieved caller identity, Arn: ${callerIdentity.Arn}`) + + const roleArn = SmusUtils.convertAssumedRoleArnToIamRoleArn(callerIdentity.Arn!) + this.logger.debug(`Retrieved user identity, Iam role Arn: ${callerIdentity.Arn}`) + + const datazoneClient = await this.getDataZoneClient() + const userProfile = await datazoneClient.getUserProfile({ + domainIdentifier: this.getDomainId(), + userIdentifier: roleArn, + }) + return userProfile.id + } + + /** + * Gets the correct tooling blueprint name + */ + private getToolingBlueprintName(): string { + return getContext('aws.smus.isExpressMode') ? 'ToolingLite' : toolingBlueprintName + } } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 41df3395118..0e36b8de299 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -379,6 +379,25 @@ export class SmusUtils { const resourceMetadata = getResourceMetadata() return isSMUSspace && !!resourceMetadata?.AdditionalMetadata?.DataZoneDomainId } + + /** + * Converts an STS assumed-role ARN to its corresponding IAM role ARN. + * Example: + * Input: arn:aws:sts::123456789012:assumed-role/MyRole/MySession + * Output: arn:aws:iam::123456789012:role/MyRole + */ + public static convertAssumedRoleArnToIamRoleArn(stsArn: string): string { + const arnRegex = /^arn:aws:sts::(\d{12}):assumed-role\/([A-Za-z0-9+=,.@_\/-]+)\/([A-Za-z0-9+=,.@_-]+)$/ + + const match = stsArn.match(arnRegex) + if (!match) { + throw new Error(`Invalid STS ARN format: ${stsArn}`) + } + + const [, accountId, roleName] = match + + return `arn:aws:iam::${accountId}:role/${roleName}` + } } /** diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts index 38dbd5e33f5..988f360eaf7 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts @@ -8,6 +8,8 @@ import * as sinon from 'sinon' import { DataZoneClient } from '../../../../sagemakerunifiedstudio/shared/client/datazoneClient' import { SmusAuthenticationProvider } from '../../../../sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider' import { GetEnvironmentCommandOutput } from '@aws-sdk/client-datazone/dist-types/commands/GetEnvironmentCommand' +import { DefaultStsClient } from '../../../../shared/clients/stsClient' +import { SmusUtils } from '../../../../sagemakerunifiedstudio/shared/smusUtils' describe('DataZoneClient', () => { let dataZoneClient: DataZoneClient @@ -18,6 +20,7 @@ describe('DataZoneClient', () => { beforeEach(async () => { // Create mock connection object const mockConnection = { + id: 'connection-id', domainId: testDomainId, ssoRegion: testRegion, } @@ -31,6 +34,16 @@ describe('DataZoneClient', () => { onDidChangeActiveConnection: sinon.stub().returns({ dispose: sinon.stub(), }), + secondaryAuth: { + state: { + get: sinon.stub().returns({ + 'connection-id': { + profileName: 'test-profile', + }, + }), + }, + }, + getCredentialsProviderForIamProfile: sinon.stub(), } as any // Set up the DataZoneClient using getInstance since constructor is private @@ -480,4 +493,115 @@ describe('DataZoneClient', () => { await assert.rejects(() => dataZoneClient.fetchAllProjectMemberships('project-1'), error) }) }) + + describe('getUserProfileId', () => { + let stsClientStub: sinon.SinonStub + let convertAssumedRoleArnStub: sinon.SinonStub + let mockCredentialsProvider: any + + beforeEach(() => { + // Mock connection with ID + mockAuthProvider.activeConnection = { id: 'connection-id' } + + // Mock credentials provider + mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'id', + secretAccessKey: 'secret', + sessionToken: 'token', + }), + } + + mockAuthProvider.getCredentialsProviderForIamProfile.resolves(mockCredentialsProvider) + + // Stub STS client + stsClientStub = sinon.stub(DefaultStsClient.prototype, 'getCallerIdentity') + + // Stub SmusUtils method + convertAssumedRoleArnStub = sinon.stub(SmusUtils, 'convertAssumedRoleArnToIamRoleArn') + }) + + afterEach(() => { + stsClientStub.restore() + convertAssumedRoleArnStub.restore() + }) + + it('should successfully get user profile ID', async () => { + const mockStsResponse = { + Arn: 'arn:aws:sts::123456789012:assumed-role/MyRole/MySession', + UserId: 'AIDACKCEVSQ6C2EXAMPLE', + } + + const mockIamRoleArn = 'arn:aws:iam::123456789012:role/service-role/MyRole' + const mockUserProfileId = 'user-profile-123' + + stsClientStub.resolves(mockStsResponse) + convertAssumedRoleArnStub.returns(mockIamRoleArn) + + const mockDataZone = { + getUserProfile: sinon.stub().resolves({ + id: mockUserProfileId, + userIdentifier: mockIamRoleArn, + }), + } + + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) + + const result = await dataZoneClient.getUserProfileId() + + assert.strictEqual(result, mockUserProfileId) + + // Verify the flow + assert.ok(mockAuthProvider.getCredentialsProviderForIamProfile.calledWith('test-profile')) + assert.ok(stsClientStub.calledOnce) + assert.ok(convertAssumedRoleArnStub.calledWith(mockStsResponse.Arn)) + assert.ok( + mockDataZone.getUserProfile.calledWith({ + domainIdentifier: testDomainId, + userIdentifier: mockIamRoleArn, + }) + ) + }) + + it('should handle STS getCallerIdentity failure', async () => { + const stsError = new Error('STS API Error') + stsClientStub.rejects(stsError) + + await assert.rejects(() => dataZoneClient.getUserProfileId(), stsError) + }) + + it('should handle convertAssumedRoleArnToIamRoleArn failure', async () => { + const mockStsResponse = { + Arn: 'invalid-arn-format', + UserId: 'AIDACKCEVSQ6C2EXAMPLE', + } + + const conversionError = new Error('Invalid STS ARN format') + stsClientStub.resolves(mockStsResponse) + convertAssumedRoleArnStub.throws(conversionError) + + await assert.rejects(() => dataZoneClient.getUserProfileId(), conversionError) + }) + + it('should handle DataZone getUserProfile failure', async () => { + const mockStsResponse = { + Arn: 'arn:aws:sts::123456789012:assumed-role/MyRole/MySession', + UserId: 'AIDACKCEVSQ6C2EXAMPLE', + } + + const mockIamRoleArn = 'arn:aws:iam::123456789012:role/service-role/MyRole' + const datazoneError = new Error('DataZone API Error') + + stsClientStub.resolves(mockStsResponse) + convertAssumedRoleArnStub.returns(mockIamRoleArn) + + const mockDataZone = { + getUserProfile: sinon.stub().rejects(datazoneError), + } + + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) + + await assert.rejects(() => dataZoneClient.getUserProfileId(), datazoneError) + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts index c03b55c64c6..6fed8ae713f 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts @@ -462,6 +462,39 @@ describe('SmusUtils', () => { assert.strictEqual(result, false) }) }) + + describe('convertAssumedRoleArnToIamRoleArn', () => { + it('should convert basic assumed role ARN to IAM role ARN', () => { + const stsArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/MySession' + const expected = 'arn:aws:iam::123456789012:role/MyRole' + + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(stsArn) + assert.strictEqual(result, expected) + }) + + it('should throw error for invalid ARN format - missing components', () => { + const invalidArn = 'arn:aws:sts::123456789012:assumed-role/MyRole' + + assert.throws( + () => SmusUtils.convertAssumedRoleArnToIamRoleArn(invalidArn), + (error: Error) => { + assert.ok(error.message.includes('Invalid STS ARN format')) + assert.ok(error.message.includes(invalidArn)) + return true + } + ) + }) + + it('should throw error for empty string', () => { + assert.throws( + () => SmusUtils.convertAssumedRoleArnToIamRoleArn(''), + (error: Error) => { + assert.ok(error.message.includes('Invalid STS ARN format')) + return true + } + ) + }) + }) }) describe('extractAccountIdFromSageMakerArn', () => { diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 9247087651d..a1c37e48971 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -1270,6 +1270,10 @@ { "command": "aws.smus.refreshProject", "when": "false" + }, + { + "command": "aws.smus.refresh", + "when": "false" } ], "editor/title": [ @@ -1334,12 +1338,17 @@ "view/title": [ { "command": "aws.smus.switchProject", - "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && !aws.smus.inSmusSpaceEnvironment", + "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && !aws.smus.inSmusSpaceEnvironment && !aws.smus.isExpressMode", "group": "smus@0" }, { "command": "aws.smus.refreshProject", - "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected", + "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && !aws.smus.isExpressMode", + "group": "smus@1" + }, + { + "command": "aws.smus.refresh", + "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && aws.smus.isExpressMode", "group": "smus@1" }, { @@ -2777,6 +2786,16 @@ } } }, + { + "command": "aws.smus.refresh", + "title": "%AWS.command.smus.refresh%", + "category": "%AWS.title%", + "enablement": "isCloud9 || !aws.isWebExtHost", + "icon": { + "dark": "resources/icons/vscode/dark/refresh.svg", + "light": "resources/icons/vscode/light/refresh.svg" + } + }, { "command": "aws.smus.signOut", "title": "%AWS.command.smus.signOut%", From 7e63431ff762b884542e52c09f7db738d65676b0 Mon Sep 17 00:00:00 2001 From: Bhargav Date: Tue, 14 Oct 2025 12:02:23 -0700 Subject: [PATCH 06/53] fix(smus): Fix IAM User login in SMUS (#2250) **Description** Users can use IAM roles as well as IAM Users to login to SMUS. There was an error in the project filtering flow when using IAM user flow and this PR handles that. **Motivation** Support IAM user flow. **Testing Done** Unit tests, manually tested IAM user and IAM role flows. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../shared/client/datazoneClient.ts | 2 +- .../shared/smusUtils.ts | 30 +++++++++-- .../shared/smusUtils.test.ts | 52 +++++++++++++++++++ 3 files changed, 78 insertions(+), 6 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts index 12c78e3bb10..6dcbf41e381 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts @@ -830,7 +830,7 @@ export class DataZoneClient { this.logger.debug(`Retrieved caller identity, Arn: ${callerIdentity.Arn}`) const roleArn = SmusUtils.convertAssumedRoleArnToIamRoleArn(callerIdentity.Arn!) - this.logger.debug(`Retrieved user identity, Iam role Arn: ${callerIdentity.Arn}`) + this.logger.debug(`Retrieved user identity, IAM ARN: ${roleArn}`) const datazoneClient = await this.getDataZoneClient() const userProfile = await datazoneClient.getUserProfile({ diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 0e36b8de299..9c2427b8b4e 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -381,22 +381,42 @@ export class SmusUtils { } /** - * Converts an STS assumed-role ARN to its corresponding IAM role ARN. - * Example: + * Converts an STS assumed-role ARN to its corresponding IAM role ARN, or returns IAM user ARN as-is. + * Supports all AWS partitions (aws, aws-cn, aws-us-gov, etc.) + * Examples: * Input: arn:aws:sts::123456789012:assumed-role/MyRole/MySession * Output: arn:aws:iam::123456789012:role/MyRole + * + * Input: arn:aws:iam::123456789012:user/MyUser + * Output: arn:aws:iam::123456789012:user/MyUser + * + * Input: arn:aws-cn:sts::123456789012:assumed-role/MyRole/MySession + * Output: arn:aws-cn:iam::123456789012:role/MyRole */ public static convertAssumedRoleArnToIamRoleArn(stsArn: string): string { - const arnRegex = /^arn:aws:sts::(\d{12}):assumed-role\/([A-Za-z0-9+=,.@_\/-]+)\/([A-Za-z0-9+=,.@_-]+)$/ + // Check if it's already an IAM user ARN - return as-is + // Supports all AWS partitions: aws, aws-cn, aws-us-gov, etc. + const iamUserRegex = /^arn:(aws[a-z-]*):iam::(\d{12}):user\/([A-Za-z0-9+=,.@_\/-]+)$/ + if (iamUserRegex.test(stsArn)) { + return stsArn + } + + // Check if it's already an IAM role ARN - return as-is + const iamRoleRegex = /^arn:(aws[a-z-]*):iam::(\d{12}):role\/([A-Za-z0-9+=,.@_\/-]+)$/ + if (iamRoleRegex.test(stsArn)) { + return stsArn + } + // Try to convert STS assumed-role ARN to IAM role ARN + const arnRegex = /^arn:(aws[a-z-]*):sts::(\d{12}):assumed-role\/([A-Za-z0-9+=,.@_\/-]+)\/([A-Za-z0-9+=,.@_-]+)$/ const match = stsArn.match(arnRegex) if (!match) { throw new Error(`Invalid STS ARN format: ${stsArn}`) } - const [, accountId, roleName] = match + const [, partition, accountId, roleName] = match - return `arn:aws:iam::${accountId}:role/${roleName}` + return `arn:${partition}:iam::${accountId}:role/${roleName}` } } diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts index 6fed8ae713f..ad14344f3eb 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts @@ -472,6 +472,58 @@ describe('SmusUtils', () => { assert.strictEqual(result, expected) }) + it('should convert assumed role ARN with aws-cn partition', () => { + const stsArn = 'arn:aws-cn:sts::123456789012:assumed-role/MyRole/MySession' + const expected = 'arn:aws-cn:iam::123456789012:role/MyRole' + + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(stsArn) + assert.strictEqual(result, expected) + }) + + it('should convert assumed role ARN with aws-us-gov partition', () => { + const stsArn = 'arn:aws-us-gov:sts::123456789012:assumed-role/MyRole/MySession' + const expected = 'arn:aws-us-gov:iam::123456789012:role/MyRole' + + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(stsArn) + assert.strictEqual(result, expected) + }) + + it('should return IAM user ARN as-is', () => { + const iamUserArn = 'arn:aws:iam::619071339486:user/vabharga-test' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + + it('should return IAM user ARN with aws-cn partition as-is', () => { + const iamUserArn = 'arn:aws-cn:iam::123456789012:user/my-user' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + + it('should return IAM user ARN with aws-us-gov partition as-is', () => { + const iamUserArn = 'arn:aws-us-gov:iam::123456789012:user/my-user' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + + it('should return IAM role ARN as-is', () => { + const iamRoleArn = 'arn:aws:iam::123456789012:role/MyRole' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamRoleArn) + assert.strictEqual(result, iamRoleArn) + }) + + it('should return IAM role ARN with aws-cn partition as-is', () => { + const iamRoleArn = 'arn:aws-cn:iam::123456789012:role/MyRole' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamRoleArn) + assert.strictEqual(result, iamRoleArn) + }) + + it('should handle IAM user ARN with special characters', () => { + const iamUserArn = 'arn:aws:iam::123456789012:user/path/to/user-name_123' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + it('should throw error for invalid ARN format - missing components', () => { const invalidArn = 'arn:aws:sts::123456789012:assumed-role/MyRole' From d8ecb5f304d73dab5b1dd37dbc8626db25711997 Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Wed, 15 Oct 2025 11:01:48 -0700 Subject: [PATCH 07/53] feat(sagemakerunifiedstudio): Support remote access for Kiro IDE (#2242) ## Problem SageMaker AI Studio and SageMaker Unified Studio support the ability for customers to connect their local VS Code IDE to SageMaker Spaces from the AWS Toolkit extension, but this is not supported for the Kiro IDE. The primary reason is that the VS Code Remote SSH extension is not available for other IDEs, and an SSH extension is an essential component of the remote access feature architecture. ## Solution This PR adds a new `SageMaker Remote SSH` extension to the AWS Toolkit VS Code repository, forked from https://github.com/jeanp413/open-remote-ssh, which performs a similar function to the VS Code Remote SSH extension. It doesn't have as many features as the VS Code version (which is closed source), but it suffices for simple use cases. Several notes about this implementation: - Overall, this additional extension is intended to be a temporary solution (e.g., no longer than six months), as we are expecting the Kiro team to eventually provide a built-in SSH solution that is more feature rich (i.e., supports other types of hosts, not just SageMaker Spaces), though no timeline has been defined. - The `SageMaker Remote SSH` extension name, description and icon are not finalized, currently pending internal review. For now, it is using the AWS Toolkit icon, which is just saved directly into the repository to simplify the build process. - The reason that we have created a separate extension, as opposed to simply authoring the code directly into the AWS Toolkit extension, is that SSH extensions must be configured as `ui` extensions, whereas the AWS Toolkit is a `workspace` extension (see https://code.visualstudio.com/api/advanced-topics/extension-host). - The SageMaker Remote SSH extension code is authored as a workspace under `packages/sagemaker-remote-ssh`. This means it shares `node_modules` with the rest of the repository. This simplifies some things such as generating attribution notices. I originally attempted another approach, where the package is nested somewhere under `packages/toolkit`, but I faced some typescript errors with duplicate declaration files being detected. - The SageMaker Remote SSH extension VSIX file is not intended to be distributed separately, but rather is packaged under the `toolkit` extension's `resources` directory as part of the build process. - When a user attempts to connect to a SageMaker Space from within the Kiro IDE, the user will be prompted to install SageMaker Remote SSH extension from disk from the AWS Toolkit extension's `resources` directory. - VS Code users should not be affected by this change, ensured by conditionally checking the IDE name at the relevant places. - The Deep Link feature of SageMaker AI Studio, which allows customers to ingress into the IDE from the SageMaker Studio web portal, is not being updated for the Kiro IDE at this time. The SageMaker Unified Studio doesn't support this feature today even for VS Code. Either the SMAI or SMUS team may follow-up on this at a later date. - The `open-remote-ssh` repository was originally licensed under MIT, but we are re-licensing it under Apache-2.0. All source files from the original extension have a header which credits the author and preserves the original copyright notice. - In order to support the VS Code proposed `resolvers` API (to function as an SSH extension), we used the `vscode-dts` utility to generate the `vscode.proposed.resolvers.d.ts` file, which we have simply committed to the codebase for simplicity, as we don't expect to need to update it later. - Most of the code from the original `open-remote-ssh` extension has been deleted, in order to make it mostly invisible to users (i.e., no user interface for browsing hosts, no registered commands), and to prevent conflicts with that extension if the user has it installed. - The `open-remote-ssh` extension did not come with any unit tests, and we haven't added any for the forked version (`sagemaker-remote-ssh`). There is room for pushback here, but we do not want to invest in comprehensively unit-testing essentially 3rd party code. - ~~The SageMaker Remote SSH extension's TypeScript configuration has been relaxed, and there are numerous ESLint overrides, since most of the code came from `open-remote-ssh` and we don't want to invest in updating it all.~~ --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .gitignore | 1 + aws-toolkit-vscode.code-workspace | 3 + package-lock.json | 116 +++++ .../sagemaker/detached-server/errorPage.ts | 4 +- .../sagemaker/detached-server/server.ts | 49 +- .../core/src/awsService/sagemaker/model.ts | 99 +++- .../sagemaker/sagemakerSshKiroUtils.ts | 159 ++++++ .../core/src/shared/extensionUtilities.ts | 14 +- packages/core/src/shared/extensions.ts | 1 + packages/core/src/shared/remoteSession.ts | 15 +- .../core/src/shared/utilities/pathFind.ts | 16 +- packages/core/src/shared/vscode/constants.ts | 1 + .../test/awsService/sagemaker/model.test.ts | 64 ++- .../sagemaker/sagemakerSshKiroUtils.test.ts | 273 ++++++++++ packages/sagemaker-ssh-kiro/CHANGELOG.md | 2 + packages/sagemaker-ssh-kiro/README.md | 3 + .../sagemaker-ssh-kiro/aws-icon-256x256.png | Bin 0 -> 10466 bytes packages/sagemaker-ssh-kiro/package.json | 99 ++++ .../scripts/build/copyFiles.ts | 62 +++ .../sagemaker-ssh-kiro/src/authResolver.ts | 306 +++++++++++ .../src/common/disposable.ts | 46 ++ .../sagemaker-ssh-kiro/src/common/logger.ts | 20 + .../sagemaker-ssh-kiro/src/common/ports.ts | 138 +++++ .../src/common/promiseUtils.ts | 37 ++ .../src/common/streamUtils.ts | 33 ++ packages/sagemaker-ssh-kiro/src/extension.ts | 40 ++ .../sagemaker-ssh-kiro/src/serverConfig.ts | 44 ++ .../sagemaker-ssh-kiro/src/serverSetup.ts | 382 ++++++++++++++ .../sagemaker-ssh-kiro/src/sshConnection.ts | 349 +++++++++++++ packages/sagemaker-ssh-kiro/tsconfig.json | 11 + .../vscode.proposed.resolvers.d.ts | 475 ++++++++++++++++++ packages/sagemaker-ssh-kiro/webpack.config.js | 40 ++ packages/toolkit/package.json | 3 +- packages/toolkit/scripts/build/copyFiles.ts | 22 + 34 files changed, 2879 insertions(+), 48 deletions(-) create mode 100644 packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts create mode 100644 packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts create mode 100644 packages/sagemaker-ssh-kiro/CHANGELOG.md create mode 100644 packages/sagemaker-ssh-kiro/README.md create mode 100644 packages/sagemaker-ssh-kiro/aws-icon-256x256.png create mode 100644 packages/sagemaker-ssh-kiro/package.json create mode 100644 packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts create mode 100644 packages/sagemaker-ssh-kiro/src/authResolver.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/disposable.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/logger.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/ports.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts create mode 100644 packages/sagemaker-ssh-kiro/src/common/streamUtils.ts create mode 100644 packages/sagemaker-ssh-kiro/src/extension.ts create mode 100644 packages/sagemaker-ssh-kiro/src/serverConfig.ts create mode 100644 packages/sagemaker-ssh-kiro/src/serverSetup.ts create mode 100644 packages/sagemaker-ssh-kiro/src/sshConnection.ts create mode 100644 packages/sagemaker-ssh-kiro/tsconfig.json create mode 100644 packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts create mode 100644 packages/sagemaker-ssh-kiro/webpack.config.js diff --git a/.gitignore b/.gitignore index 7d3ab3dd558..63809306e36 100644 --- a/.gitignore +++ b/.gitignore @@ -47,6 +47,7 @@ packages/toolkit/package.nls.json packages/toolkit/resources packages/amazonq/package.nls.json packages/amazonq/resources +packages/sagemaker-ssh-kiro/resources # Icons packages/*/resources/fonts/aws-toolkit-icons.woff diff --git a/aws-toolkit-vscode.code-workspace b/aws-toolkit-vscode.code-workspace index f03aafae2fe..a0b64cc44ad 100644 --- a/aws-toolkit-vscode.code-workspace +++ b/aws-toolkit-vscode.code-workspace @@ -12,6 +12,9 @@ { "path": "packages/amazonq", }, + { + "path": "packages/sagemaker-ssh-kiro", + }, ], "settings": { "typescript.tsdk": "node_modules/typescript/lib", diff --git a/package-lock.json b/package-lock.json index 645d6e348fa..2b2f038eba3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21057,6 +21057,33 @@ "@types/node": "*" } }, + "node_modules/@types/ssh2": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/@types/ssh2/-/ssh2-1.15.5.tgz", + "integrity": "sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^18.11.18" + } + }, + "node_modules/@types/ssh2/node_modules/@types/node": { + "version": "18.19.129", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.129.tgz", + "integrity": "sha512-hrmi5jWt2w60ayox3iIXwpMEnfUvOLJCRtrOPbHtH15nTjvO7uhnelvrdAs0dO0/zl5DZ3ZbahiaXEVb54ca/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/ssh2/node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/stream-buffers": { "version": "3.0.7", "dev": true, @@ -22305,6 +22332,15 @@ "dev": true, "license": "MIT" }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, "node_modules/asn1.js": { "version": "5.4.1", "license": "MIT", @@ -22611,6 +22647,15 @@ "dev": true, "license": "MIT" }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/big.js": { "version": "5.2.2", "dev": true, @@ -22890,6 +22935,15 @@ "version": "1.0.3", "license": "MIT" }, + "node_modules/buildcheck": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/buildcheck/-/buildcheck-0.0.6.tgz", + "integrity": "sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==", + "optional": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/builtin-modules": { "version": "3.3.0", "dev": true, @@ -23675,6 +23729,20 @@ "node": ">=4" } }, + "node_modules/cpu-features": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cpu-features/-/cpu-features-0.0.10.tgz", + "integrity": "sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "buildcheck": "~0.0.6", + "nan": "^2.19.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "license": "MIT", @@ -28293,6 +28361,13 @@ "thenify-all": "^1.0.0" } }, + "node_modules/nan": { + "version": "2.23.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.23.0.tgz", + "integrity": "sha512-1UxuyYGdoQHcGg87Lkqm3FzefucTa0NAiOcuRsDmysep3c1LVCRK2krrUDafMWtjSG04htvAmvg96+SDknOmgQ==", + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.3", "dev": true, @@ -30241,6 +30316,10 @@ "version": "2.1.2", "license": "MIT" }, + "node_modules/sagemaker-ssh-kiro": { + "resolved": "packages/sagemaker-ssh-kiro", + "link": true + }, "node_modules/sanitize-html": { "version": "2.13.0", "license": "MIT", @@ -30825,6 +30904,23 @@ "version": "1.0.3", "license": "BSD-3-Clause" }, + "node_modules/ssh2": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/ssh2/-/ssh2-1.17.0.tgz", + "integrity": "sha512-wPldCk3asibAjQ/kziWQQt1Wh3PgDFpC0XpwclzKcdT1vql6KeYxf5LIt4nlFkUeR8WuphYMKqUA56X4rjbfgQ==", + "hasInstallScript": true, + "dependencies": { + "asn1": "^0.2.6", + "bcrypt-pbkdf": "^1.0.2" + }, + "engines": { + "node": ">=10.16.0" + }, + "optionalDependencies": { + "cpu-features": "~0.0.10", + "nan": "^2.23.0" + } + }, "node_modules/stack-trace": { "version": "0.0.10", "license": "MIT", @@ -31654,6 +31750,12 @@ "node": "*" } }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "license": "Unlicense" + }, "node_modules/type": { "version": "1.2.0", "dev": true, @@ -34987,6 +35089,20 @@ "assert": "^2.1.0" } }, + "packages/sagemaker-ssh-kiro": { + "version": "0.1.0", + "license": "Apache-2.0", + "dependencies": { + "ssh2": "^1.17.0" + }, + "devDependencies": { + "@types/ssh2": "^1.15.0" + }, + "engines": { + "npm": "^10.1.0", + "vscode": "^1.83.0" + } + }, "packages/toolkit": { "name": "aws-toolkit-vscode", "version": "3.79.0-SNAPSHOT", diff --git a/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts b/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts index bff3e62ae61..2cafa824442 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts @@ -70,8 +70,8 @@ export const ErrorText = { 'Your session has expired. This is likely due to network connectivity issues after machine sleep/resume. Please wait 10-30 seconds for automatic credential refresh, then try again. If the issue persists, try reconnecting through AWS Toolkit.', }, [ExceptionType.INTERNAL_FAILURE]: { - Title: 'Failed to connect remotely to VSCode', - Text: 'Unable to establish remote connection to VSCode. This could be due to several factors. Please try again by clicking the VSCode button. If the problem persists, please contact your admin.', + Title: 'Failed to connect remotely to the Space', + Text: 'Unable to establish remote connection to the Space. This could be due to several factors. Please try again by clicking the connect button. If the problem persists, please contact your admin.', }, [ExceptionType.RESOURCE_LIMIT_EXCEEDED]: { Title: 'Connection limit reached', diff --git a/packages/core/src/awsService/sagemaker/detached-server/server.ts b/packages/core/src/awsService/sagemaker/detached-server/server.ts index e785516146c..4b6f52b06c2 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/server.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/server.ts @@ -40,6 +40,9 @@ server.listen(0, '127.0.0.1', async () => { const pid = process.pid console.log(`Detached server listening on http://127.0.0.1:${port} (pid: ${pid})`) + const parentIdeType = process.env.PARENT_IDE_TYPE + + console.log(`Parent IDE type: ${parentIdeType}`) const filePath = process.env.SAGEMAKER_LOCAL_SERVER_FILE_PATH if (!filePath) { @@ -60,15 +63,27 @@ server.listen(0, '127.0.0.1', async () => { function checkVSCodeWindows(): Promise { return new Promise((resolve) => { const platform = os.platform() + const parentIdeType = process.env.PARENT_IDE_TYPE if (platform === 'win32') { - execFile('tasklist', ['/FI', 'IMAGENAME eq Code.exe'], (err, stdout) => { - if (err) { - resolve(false) - return - } - resolve(/Code\.exe/i.test(stdout)) - }) + if (parentIdeType === 'kiro') { + execFile('tasklist', ['/FI', 'IMAGENAME eq kiro.exe'], (err, stdout) => { + if (err) { + resolve(false) + return + } + resolve(/kiro\.exe/i.test(stdout)) + }) + } else { + // Default to VSCode + execFile('tasklist', ['/FI', 'IMAGENAME eq Code.exe'], (err, stdout) => { + if (err) { + resolve(false) + return + } + resolve(/Code\.exe/i.test(stdout)) + }) + } } else if (platform === 'darwin') { execFile('ps', ['aux'], (err, stdout) => { if (err) { @@ -76,9 +91,15 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout - .split('\n') - .some((line) => /Visual Studio Code( - Insiders)?\.app\/Contents\/MacOS\/Electron/.test(line)) + let found = false + if (parentIdeType === 'kiro') { + found = stdout.split('\n').some((line) => /kiro\.app\/Contents\/MacOS\/Electron/i.test(line)) + } else { + // Default to VSCode + found = stdout + .split('\n') + .some((line) => /Visual Studio Code( - Insiders)?\.app\/Contents\/MacOS\/Electron/i.test(line)) + } resolve(found) }) } else { @@ -88,7 +109,13 @@ function checkVSCodeWindows(): Promise { return } - const found = stdout.split('\n').some((line) => /^(code(-insiders)?|electron)$/i.test(line.trim())) + let found = false + if (parentIdeType === 'kiro') { + found = stdout.split('\n').some((line) => /^kiro(-insiders)?$/i.test(line.trim())) + } else { + // Default to VSCode + found = stdout.split('\n').some((line) => /^(code(-insiders)?|electron)$/i.test(line.trim())) + } resolve(found) }) } diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index cd0c1e43173..04fd3dab946 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode' import { sshAgentSocketVariable, startSshAgent, startVscodeRemote } from '../../shared/extensions/ssh' import { createBoundProcess, ensureDependencies } from '../../shared/remoteSession' -import { SshConfig } from '../../shared/sshConfig' +import { ensureConnectScript, SshConfig } from '../../shared/sshConfig' import * as path from 'path' import { persistLocalCredentials, persistSmusProjectCreds, persistSSMConnection } from './credentialMapping' import * as os from 'os' @@ -22,6 +22,10 @@ import { ToolkitError } from '../../shared/errors' import { SagemakerSpaceNode } from './explorer/sagemakerSpaceNode' import { sleep } from '../../shared/utilities/timeoutUtils' import { SagemakerUnifiedStudioSpaceNode } from '../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpaceNode' +import { isKiro } from '../../shared/extensionUtilities' +import { getIdeType } from '../../shared/extensionUtilities' +import { ChildProcess } from '../../shared/utilities/processUtils' +import { ensureSageMakerSshKiroExtension } from './sagemakerSshKiroUtils' const logger = getLogger('sagemaker') @@ -29,17 +33,28 @@ export async function tryRemoteConnection( node: SagemakerSpaceNode | SagemakerUnifiedStudioSpaceNode, ctx: vscode.ExtensionContext ) { + if (useSageMakerSshKiroExtension()) { + await ensureSageMakerSshKiroExtension(ctx) + } + + const path = '/home/sagemaker-user' + const username = 'sagemaker-user' const spaceArn = (await node.getSpaceArn()) as string const isSMUS = node instanceof SagemakerUnifiedStudioSpaceNode const remoteEnv = await prepareDevEnvConnection(spaceArn, ctx, 'sm_lc', isSMUS, node) + try { - await startVscodeRemote( - remoteEnv.SessionProcess, - remoteEnv.hostname, - '/home/sagemaker-user', - remoteEnv.vscPath, - 'sagemaker-user' - ) + if (useSageMakerSshKiroExtension()) { + await startRemoteViaSageMakerSshKiro( + remoteEnv.SessionProcess, + remoteEnv.hostname, + path, + remoteEnv.vscPath, + username + ) + } else { + await startVscodeRemote(remoteEnv.SessionProcess, remoteEnv.hostname, path, remoteEnv.vscPath, username) + } } catch (err) { getLogger().info( `sm:OpenRemoteConnect: Unable to connect to target space with arn: ${await node.getAppArn()} error: ${err}` @@ -59,16 +74,21 @@ export async function prepareDevEnvConnection( domain?: string ) { const remoteLogger = configureRemoteConnectionLogger() - const { ssm, vsc, ssh } = (await ensureDependencies()).unwrap() - - // Check timeout setting for remote SSH connections - const remoteSshConfig = vscode.workspace.getConfiguration('remote.SSH') - const current = remoteSshConfig.get('connectTimeout') - if (typeof current === 'number' && current < 120) { - await remoteSshConfig.update('connectTimeout', 120, vscode.ConfigurationTarget.Global) - void vscode.window.showInformationMessage( - 'Updated "remote.SSH.connectTimeout" to 120 seconds to improve stability.' - ) + // Skip Remote SSH extension check in Kiro since it uses embedded SageMaker SSH Kiro extension + const { ssm, vsc, ssh } = ( + await ensureDependencies({ skipRemoteSshCheck: useSageMakerSshKiroExtension() }) + ).unwrap() + + if (!useSageMakerSshKiroExtension()) { + // Check timeout setting for remote SSH connections + const remoteSshConfig = vscode.workspace.getConfiguration('remote.SSH') + const current = remoteSshConfig.get('connectTimeout') + if (typeof current === 'number' && current < 120) { + await remoteSshConfig.update('connectTimeout', 120, vscode.ConfigurationTarget.Global) + void vscode.window.showInformationMessage( + 'Updated "remote.SSH.connectTimeout" to 120 seconds to improve stability.' + ) + } } const hostnamePrefix = connectionType @@ -86,14 +106,24 @@ export async function prepareDevEnvConnection( } await startLocalServer(ctx) - await removeKnownHost(hostname) - - const sshConfig = new SshConfig(ssh, 'sm_', 'sagemaker_connect') - const config = await sshConfig.ensureValid() - if (config.isErr()) { - const err = config.err() - logger.error(`sagemaker: failed to add ssh config section: ${err.message}`) - throw err + + if (useSageMakerSshKiroExtension()) { + // Skip SSH Config and known host changes when using the SageMaker SSH + // Kiro uses the embedded SageMaker SSH Kiro extension which handles SSH connections differently + const scriptResult = await ensureConnectScript('sagemaker_connect') + if (scriptResult.isErr()) { + throw scriptResult + } + } else { + await removeKnownHost(hostname) + + const sshConfig = new SshConfig(ssh, 'sm_', 'sagemaker_connect') + const config = await sshConfig.ensureValid() + if (config.isErr()) { + const err = config.err() + logger.error(`failed to add ssh config section: ${err.message}`) + throw err + } } // set envirionment variables @@ -145,6 +175,7 @@ export async function startLocalServer(ctx: vscode.ExtensionContext) { ...process.env, SAGEMAKER_ENDPOINT: customEndpoint, SAGEMAKER_LOCAL_SERVER_FILE_PATH: infoFilePath, + PARENT_IDE_TYPE: getIdeType(), }, }) @@ -236,3 +267,19 @@ export async function removeKnownHost(hostname: string): Promise { } } } + +export function useSageMakerSshKiroExtension(): boolean { + return isKiro() +} + +export async function startRemoteViaSageMakerSshKiro( + ProcessClass: typeof ChildProcess, + hostname: string, + targetDirectory: string, + vscPath: string, + user?: string +): Promise { + const userAt = user ? `${user}@` : '' + const workspaceUri = `vscode-remote://sagemaker-ssh-kiro+${userAt}${hostname}${targetDirectory}` + await new ProcessClass(vscPath, ['--folder-uri', workspaceUri]).run() +} diff --git a/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts new file mode 100644 index 00000000000..d8f44d4f239 --- /dev/null +++ b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts @@ -0,0 +1,159 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { VSCODE_EXTENSION_ID } from '../../shared/extensions' + +import { glob } from 'glob' +import * as path from 'path' +import * as semver from 'semver' +import * as vscode from 'vscode' +import { ToolkitError } from '../../shared/errors' +import fs from '../../shared/fs/fs' +import { getLogger } from '../../shared/logger/logger' +import { showConfirmationMessage } from '../../shared/utilities/messages' + +const logger = getLogger('sagemaker') + +const pluginTechnicalName = 'sagemaker-ssh-kiro' +const pluginDisplayName = 'Amazon SageMaker SSH Plugin for Kiro' +const minKiroVersion = '0.3.0' + +let vscodeProductJson: any + +async function getEditorProductJson() { + if (!vscodeProductJson) { + const productJsonPath = path.join(vscode.env.appRoot, 'product.json') + logger.info(`Reading vscode product.json at ${productJsonPath}`) + const productJsonStr = await fs.readFileText(productJsonPath) + vscodeProductJson = JSON.parse(productJsonStr) + } + + return vscodeProductJson +} + +export async function getKiroVersion(): Promise { + return (await getEditorProductJson()).version +} + +/** + * Finds the embedded SageMaker SSH Kiro extension VSIX file and extracts its version. + */ +export async function findEmbeddedSageMakerSshKiroExtension( + ctx: vscode.ExtensionContext +): Promise<{ path: string; version: string }> { + const resourcesDir = ctx.asAbsolutePath('resources') + + try { + // Use forward slashes for glob pattern + const globPattern = path.join(resourcesDir, 'sagemaker-ssh-kiro-*.vsix').replace(/\\/g, '/') + const matches = await glob(globPattern) + if (matches.length === 0) { + throw new ToolkitError(`The ${pluginTechnicalName} extension VSIX file not found in: ${resourcesDir}.`) + } + + if (matches.length > 1) { + // Multiple files could only happen if we built the toolkit extension incorrectly or if the user modified the extension directory. + throw new ToolkitError( + `Unexpectedly found multiple (${matches.length}) ${pluginTechnicalName} extension VSIX files in: ${resourcesDir}` + ) + } + + const filePath = matches[0] + const fileName = path.basename(filePath) + const versionMatch = fileName.match(/^sagemaker-ssh-kiro-(.+)\.vsix$/) + + if (!versionMatch) { + throw new ToolkitError(`Failed to extract version number from VSIX filename: ${fileName}`) + } + + const version = versionMatch[1] + logger.info(`Found the ${pluginTechnicalName} extension VSIX file: ${fileName} (version ${version})`) + return { path: filePath, version } + } catch (error) { + if (error instanceof ToolkitError) { + throw error + } + throw new ToolkitError( + `An error occurred while searching for the ${pluginTechnicalName} extension VSIX file: ${error}` + ) + } +} + +/** + * Ensures the SageMaker SSH Kiro extension is installed and up-to-date. + */ +export async function ensureSageMakerSshKiroExtension(ctx: vscode.ExtensionContext): Promise { + const kiroVersion = await getKiroVersion() + + if (semver.lt(kiroVersion, minKiroVersion)) { + throw new ToolkitError( + `SageMaker remote access requires Kiro version ${minKiroVersion} or higher (current: ${kiroVersion}). Update Kiro to continue.` + ) + } + + logger.info(`Kiro version ${kiroVersion} meets minimum requirement (${minKiroVersion})`) + + // Find the embedded extension file and extract its version + const { path: embeddedPath, version: embeddedVersion } = await findEmbeddedSageMakerSshKiroExtension(ctx) + + // Check if extension is already installed with the correct version + const installedExtension = vscode.extensions.getExtension(VSCODE_EXTENSION_ID.sagemakerSshKiro) + + if (installedExtension) { + if (installedExtension.packageJSON.version === embeddedVersion) { + logger.info( + `The ${pluginTechnicalName} extension is already installed with expected version ${embeddedVersion}.` + ) + return + } else { + logger.info( + `The ${pluginTechnicalName} extension is installed with version ${installedExtension.packageJSON.version}, but expected version ${embeddedVersion}` + ) + } + } else { + logger.info( + `The ${pluginTechnicalName} extension is not installed. Attempting to install version ${embeddedVersion}...` + ) + } + + // Determine if this is an update or new installation + const isUpdate = installedExtension !== undefined + const currentVersion = installedExtension?.packageJSON.version + + // Prompt user for confirmation + const actionText = isUpdate ? 'update' : 'install' + const confirmButtonText = isUpdate ? 'Update' : 'Install' + const installOrUpdateQuestion = isUpdate + ? `update from version ${currentVersion} to ${embeddedVersion}` + : `install version ${embeddedVersion}` + + const ok = await showConfirmationMessage({ + prompt: `The ${pluginDisplayName} needs to be ${isUpdate ? 'updated' : 'installed'} to connect to the Space. Would you like to ${installOrUpdateQuestion}?`, + confirm: confirmButtonText, + }) + + if (!ok) { + void vscode.window.showInformationMessage( + `Aborted connecting to the Space because you declined to ${actionText} the ${pluginDisplayName}.` + ) + const cancellationErrorMessage = `User declined to ${actionText} the ${pluginTechnicalName} extension (version ${embeddedVersion}).` + logger.info(cancellationErrorMessage) + throw new ToolkitError(cancellationErrorMessage, { cancelled: true }) + } + + logger.info(`Installing the ${pluginTechnicalName} extension (version ${embeddedVersion}) from: ${embeddedPath}`) + + // Install the extension + await vscode.commands.executeCommand('workbench.extensions.installExtension', vscode.Uri.file(embeddedPath)) + + logger.info(`Installed the ${pluginTechnicalName} extension (version ${embeddedVersion}).`) + + // Show success notification + const successMessage = isUpdate + ? `${pluginDisplayName} updated to version ${embeddedVersion}` + : `${pluginDisplayName} installed (version ${embeddedVersion})` + + void vscode.window.showInformationMessage(successMessage) +} diff --git a/packages/core/src/shared/extensionUtilities.ts b/packages/core/src/shared/extensionUtilities.ts index b8b5780c612..ca77f01b504 100644 --- a/packages/core/src/shared/extensionUtilities.ts +++ b/packages/core/src/shared/extensionUtilities.ts @@ -25,6 +25,7 @@ import { import { cloud9Appname, cloud9CnAppname, + kiroAppname, sageMakerAppname, sageMakerUnifiedStudio, vscodeAppname, @@ -71,7 +72,7 @@ let computeRegion: string | undefined = notInitialized let serviceName: string = notInitialized let isSMUS: boolean = false -export function getIdeType(): 'vscode' | 'cloud9' | 'sagemaker' | 'unknown' { +export function getIdeType(): 'vscode' | 'cloud9' | 'sagemaker' | 'kiro' | 'unknown' { if (vscode.env.appName === cloud9Appname || vscode.env.appName === cloud9CnAppname) { return 'cloud9' } @@ -80,6 +81,10 @@ export function getIdeType(): 'vscode' | 'cloud9' | 'sagemaker' | 'unknown' { return 'sagemaker' } + if (vscode.env.appName?.includes(kiroAppname)) { + return 'kiro' + } + // Theia doesn't necessarily have all env properties // so we should be defensive and assume appName is nullable. if (vscode.env.appName?.startsWith(vscodeAppname)) { @@ -183,6 +188,13 @@ export function isCloud9(flavor: 'classic' | 'codecatalyst' | 'any' = 'any'): bo return (flavor === 'classic' && !codecat) || (flavor === 'codecatalyst' && codecat) } +/** + * Determines if the current system is the Kiro IDE. + */ +export function isKiro(): boolean { + return getIdeType() === 'kiro' +} + /** * * @param appName to identify the proper SM instance diff --git a/packages/core/src/shared/extensions.ts b/packages/core/src/shared/extensions.ts index d9b242e96a6..04102313cd7 100644 --- a/packages/core/src/shared/extensions.ts +++ b/packages/core/src/shared/extensions.ts @@ -25,6 +25,7 @@ export const VSCODE_EXTENSION_ID = { dotnet: 'ms-dotnettools.csdevkit', git: 'vscode.git', remotessh: 'ms-vscode-remote.remote-ssh', + sagemakerSshKiro: 'amazonwebservices.sagemaker-ssh-kiro', } as const export const vscodeExtensionMinVersion = { diff --git a/packages/core/src/shared/remoteSession.ts b/packages/core/src/shared/remoteSession.ts index b45bdb3ca9c..bbf4ab2fd22 100644 --- a/packages/core/src/shared/remoteSession.ts +++ b/packages/core/src/shared/remoteSession.ts @@ -92,11 +92,16 @@ export interface VscodeRemoteConnection { readonly SessionProcess: typeof ChildProcess } -export async function ensureDependencies(): Promise> { - try { - await ensureRemoteSshInstalled() - } catch (e) { - return Result.err(e as Error) +export async function ensureDependencies(options?: { + skipRemoteSshCheck?: boolean +}): Promise> { + // Skip Remote SSH extension check if explicitly requested (e.g., for SageMaker in Kiro) + if (!options?.skipRemoteSshCheck) { + try { + await ensureRemoteSshInstalled() + } catch (e) { + return Result.err(e as Error) + } } const tools = await ensureTools() diff --git a/packages/core/src/shared/utilities/pathFind.ts b/packages/core/src/shared/utilities/pathFind.ts index a0eea9e38ae..2fb25994031 100644 --- a/packages/core/src/shared/utilities/pathFind.ts +++ b/packages/core/src/shared/utilities/pathFind.ts @@ -12,6 +12,7 @@ import { Settings } from '../settings' import { getLogger } from '../logger/logger' import { mergeResolvedShellPath } from '../env/resolveEnv' import { matchesPattern } from './textUtilities' +import { getIdeType } from '../extensionUtilities' /** Full path to VSCode CLI. */ let vscPath: string @@ -53,7 +54,7 @@ export async function tryRun( /** * Gets the fullpath to `code` (VSCode CLI), or falls back to "code" (not - * absolute) if it works. + * absolute) if it works. For Kiro on Windows, looks for `kiro.cmd` instead. * * @see https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 */ @@ -63,6 +64,10 @@ export async function getVscodeCliPath(): Promise { } const vscExe = process.argv0 + const ideType = getIdeType() + const isKiro = ideType === 'kiro' + const isWindows = process.platform === 'win32' + // https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 const vscs = [ // Special case for flatpak (steamdeck). #V896741845 @@ -72,6 +77,13 @@ export async function getVscodeCliPath(): Promise { path.resolve(`${vscode.env.appRoot}/bin/code`), // macOS path.resolve(`${vscode.env.appRoot}/../../bin/code`), // Windows path.resolve(`${vscode.env.appRoot}/../../bin/code-insiders`), // Windows + // Kiro-specific paths for Windows + ...(isKiro && isWindows + ? [ + path.resolve(`${vscode.env.appRoot}/../../bin/kiro.cmd`), + path.resolve(`${vscode.env.appRoot}/../../bin/kiro`), + ] + : []), // Linux example "appRoot": vscode-linux-x64-1.42.0/VSCode-linux-x64/resources/app path.resolve(`${vscode.env.appRoot}/code`), path.resolve(vscExe, '../bin/code-insiders'), @@ -79,6 +91,8 @@ export async function getVscodeCliPath(): Promise { path.resolve(vscExe, '../../bin/code-insiders'), path.resolve(vscExe, '../../bin/code'), '/usr/bin/code', + // Kiro fallbacks + ...(isKiro ? ['kiro', 'kiro.cmd'] : []), 'code', // $PATH ] for (const vsc of vscs) { diff --git a/packages/core/src/shared/vscode/constants.ts b/packages/core/src/shared/vscode/constants.ts index fbe266e0e0b..6961f911f38 100644 --- a/packages/core/src/shared/vscode/constants.ts +++ b/packages/core/src/shared/vscode/constants.ts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ export const vscodeAppname = 'Visual Studio Code' +export const kiroAppname = 'Kiro' export const cloud9Appname = 'AWS Cloud9' export const cloud9CnAppname = 'Amazon Cloud9' export const sageMakerAppname = 'SageMaker Code Editor' diff --git a/packages/core/src/test/awsService/sagemaker/model.test.ts b/packages/core/src/test/awsService/sagemaker/model.test.ts index e6a9637ed15..b7e734902ea 100644 --- a/packages/core/src/test/awsService/sagemaker/model.test.ts +++ b/packages/core/src/test/awsService/sagemaker/model.test.ts @@ -8,7 +8,12 @@ import * as sinon from 'sinon' import * as os from 'os' import * as path from 'path' import { DevSettings, fs, ToolkitError } from '../../../shared' -import { removeKnownHost, startLocalServer, stopLocalServer } from '../../../awsService/sagemaker/model' +import { + removeKnownHost, + startLocalServer, + stopLocalServer, + startRemoteViaSageMakerSshKiro, +} from '../../../awsService/sagemaker/model' import { assertLogsContain } from '../../globalSetup.test' import assert from 'assert' @@ -279,4 +284,61 @@ describe('SageMaker Model', () => { } }) }) + + describe('startRemoteViaSageMakerSshKiro', function () { + let sandbox: sinon.SinonSandbox + let mockProcessClass: sinon.SinonStub + let mockProcessInstance: { run: sinon.SinonStub } + + beforeEach(function () { + sandbox = sinon.createSandbox() + mockProcessInstance = { run: sandbox.stub().resolves() } + mockProcessClass = sandbox.stub().returns(mockProcessInstance) + }) + + afterEach(function () { + sandbox.restore() + }) + + it('constructs correct workspace URI without user', async function () { + await startRemoteViaSageMakerSshKiro( + mockProcessClass as any, + 'space_arn', + '/home/sagemaker-user', + '/usr/bin/code' + ) + + const expectedUri = `vscode-remote://sagemaker-ssh-kiro+space_arn/home/sagemaker-user` + sinon.assert.calledOnceWithExactly(mockProcessClass, '/usr/bin/code', ['--folder-uri', expectedUri]) + sinon.assert.calledOnce(mockProcessInstance.run) + }) + + it('constructs correct workspace URI with user', async function () { + await startRemoteViaSageMakerSshKiro( + mockProcessClass as any, + 'space_arn', + '/home/sagemaker-user', + '/usr/bin/code', + 'sagemaker-user' + ) + + const expectedUri = `vscode-remote://sagemaker-ssh-kiro+sagemaker-user@space_arn/home/sagemaker-user` + sinon.assert.calledOnceWithExactly(mockProcessClass, '/usr/bin/code', ['--folder-uri', expectedUri]) + sinon.assert.calledOnce(mockProcessInstance.run) + }) + + it('handles different target directories', async function () { + await startRemoteViaSageMakerSshKiro( + mockProcessClass as any, + 'space_arn', + '/workspace/project', + '/usr/bin/code', + 'sagemaker-user' + ) + + const expectedUri = `vscode-remote://sagemaker-ssh-kiro+sagemaker-user@space_arn/workspace/project` + sinon.assert.calledOnceWithExactly(mockProcessClass, '/usr/bin/code', ['--folder-uri', expectedUri]) + sinon.assert.calledOnce(mockProcessInstance.run) + }) + }) }) diff --git a/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts new file mode 100644 index 00000000000..c256b1672af --- /dev/null +++ b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts @@ -0,0 +1,273 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import * as sinon from 'sinon' +import * as path from 'path' +// Import methods only for typing, actual functions will be dynamically imported +import type { + findEmbeddedSageMakerSshKiroExtension as findEmbeddedSageMakerSshKiroExtensionStatic, + ensureSageMakerSshKiroExtension as ensureSageMakerSshKiroExtensionStatic, + getKiroVersion as getKiroVersionStatic, +} from '../../../awsService/sagemaker/sagemakerSshKiroUtils' +import { VSCODE_EXTENSION_ID } from '../../../shared/extensions' +import { assertLogsContain } from '../../globalSetup.test' +import assert from 'assert' +import { getTestWindow } from '../../shared/vscode/window' +import fs from '../../../shared/fs/fs' + +describe('SageMaker SSH Kiro Utils', () => { + const resourcesDir = '/mock/extension/path/resources' + + let sandbox: sinon.SinonSandbox + let mockContext: vscode.ExtensionContext + let readFileTextStub: sinon.SinonStub + + // Dynamically imported functions with fresh module state + let findEmbeddedSageMakerSshKiroExtension: typeof findEmbeddedSageMakerSshKiroExtensionStatic + let ensureSageMakerSshKiroExtension: typeof ensureSageMakerSshKiroExtensionStatic + let getKiroVersion: typeof getKiroVersionStatic + + beforeEach(() => { + sandbox = sinon.createSandbox() + mockContext = { + asAbsolutePath: (relativePath: string) => path.join('/mock/extension/path', relativePath), + } as vscode.ExtensionContext + + // Mock product.json reading + readFileTextStub = sandbox.stub(fs, 'readFileText') + readFileTextStub.resolves(JSON.stringify({ version: '0.3.0' })) + + // Mock vscode.env.appRoot + sandbox.stub(vscode.env, 'appRoot').value('/mock/vscode/app') + + // Get fresh module instance for each test to reset cached state + const freshModule = require('../../../awsService/sagemaker/sagemakerSshKiroUtils') + findEmbeddedSageMakerSshKiroExtension = freshModule.findEmbeddedSageMakerSshKiroExtension + ensureSageMakerSshKiroExtension = freshModule.ensureSageMakerSshKiroExtension + getKiroVersion = freshModule.getKiroVersion + }) + + afterEach(() => { + sandbox.restore() + + // Clear module cache to reset cached state for dynamic imports + for (const key of Object.keys(require.cache)) { + if (key.includes('sagemakerSshKiroUtils')) { + delete require.cache[key] + } + } + }) + + describe('findEmbeddedSageMakerSshKiroExtension', () => { + it('finds extension with valid version pattern', async () => { + const expectedPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.1.0.vsix') + sandbox.stub(require('glob'), 'glob').resolves([expectedPath]) + + const result = await findEmbeddedSageMakerSshKiroExtension(mockContext) + + assert.strictEqual(result.version, '0.1.0') + assert.strictEqual(result.path, expectedPath) + }) + + it('throws error when multiple VSIX files found', async () => { + const firstPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.1.0.vsix') + const secondPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.2.0.vsix') + sandbox.stub(require('glob'), 'glob').resolves([firstPath, secondPath]) + + await assert.rejects(() => findEmbeddedSageMakerSshKiroExtension(mockContext), /found multiple/i) + }) + + it('throws error when no VSIX files found', async () => { + sandbox.stub(require('glob'), 'glob').resolves([]) + + await assert.rejects(() => findEmbeddedSageMakerSshKiroExtension(mockContext), /not found/i) + }) + + it('throws error when filename does not match expected pattern', async () => { + const invalidPath = path.join(resourcesDir, 'invalid-filename.vsix') + sandbox.stub(require('glob'), 'glob').resolves([invalidPath]) + + await assert.rejects( + () => findEmbeddedSageMakerSshKiroExtension(mockContext), + /Failed to extract version number/i + ) + }) + + it('throws error when glob operation fails', async () => { + sandbox.stub(require('glob'), 'glob').rejects(new Error('Permission denied')) + + await assert.rejects(() => findEmbeddedSageMakerSshKiroExtension(mockContext), /Permission denied/i) + }) + }) + + describe('getKiroVersion', () => { + it('reads version from product.json', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.4.0' })) + + const version = await getKiroVersion() + + assert.strictEqual(version, '0.4.0') + sinon.assert.calledWith(readFileTextStub, path.join('/mock', 'vscode', 'app', 'product.json')) + }) + + it('caches product.json after first read', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.4.0' })) + + await getKiroVersion() + await getKiroVersion() + + sinon.assert.calledOnce(readFileTextStub) + }) + }) + + describe('ensureSageMakerSshKiroExtension', () => { + let getExtensionStub: sinon.SinonStub + let executeCommandStub: sinon.SinonStub + + beforeEach(() => { + const expectedPath = path.join(resourcesDir, 'sagemaker-ssh-kiro-0.1.0.vsix') + sandbox.stub(require('glob'), 'glob').resolves([expectedPath]) + + getExtensionStub = sandbox.stub(vscode.extensions, 'getExtension') + executeCommandStub = sandbox.stub(vscode.commands, 'executeCommand') + }) + + it('throws error when Kiro version is too old', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.2.9' })) + + await assert.rejects( + () => ensureSageMakerSshKiroExtension(mockContext), + /requires.+version 0\.3\.0 or higher \(current: 0\.2\.9\)/i + ) + }) + + it('succeeds when Kiro version meets minimum requirement', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.3.0' })) + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.1.0' } }) + + await ensureSageMakerSshKiroExtension(mockContext) + + assertLogsContain('meets minimum requirement', false, 'info') + }) + + it('succeeds when Kiro version exceeds minimum requirement', async () => { + readFileTextStub.resolves(JSON.stringify({ version: '0.4.0' })) + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.1.0' } }) + + await ensureSageMakerSshKiroExtension(mockContext) + + assertLogsContain('meets minimum requirement', false, 'info') + }) + + it('returns early when correct version already installed', async () => { + const mockExtension = { packageJSON: { version: '0.1.0' } } + getExtensionStub.withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro).returns(mockExtension) + + await ensureSageMakerSshKiroExtension(mockContext) + + assertLogsContain('already installed', false, 'info') + assert.equal(getTestWindow().shownMessages.length, 0) + sinon.assert.notCalled(executeCommandStub) + }) + + it('prompts for install when extension not installed', async () => { + getExtensionStub.withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro).returns(undefined) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be installed.*install version 0\.1\.0/i)) { + message.selectItem('Install') + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + }) + + it('prompts for update when older version installed', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.0.9' } }) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated.*from version 0.0.9 to 0.1.0/i)) { + message.selectItem('Update') + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + await getTestWindow().waitForMessage(/updated to version 0.1.0/i) + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + }) + + it('prompts for update when newer version installed', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.1.1' } }) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated.*from version 0.1.1 to 0.1.0/i)) { + message.selectItem('Update') + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + await getTestWindow().waitForMessage(/updated to version 0.1.0/i) + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + }) + + it('throws error when user declines installation', async () => { + getExtensionStub.withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro).returns(undefined) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be installed/i)) { + message.selectItem('Cancel') + return + } + }) + + await assert.rejects(() => ensureSageMakerSshKiroExtension(mockContext), /User declined to install/i) + sinon.assert.notCalled(executeCommandStub) + }) + + it('throws error when user declines update', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.0.9' } }) + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated/i)) { + message.selectItem('Cancel') + return + } + }) + + await assert.rejects(() => ensureSageMakerSshKiroExtension(mockContext), /User declined to update/i) + sinon.assert.notCalled(executeCommandStub) + }) + }) +}) diff --git a/packages/sagemaker-ssh-kiro/CHANGELOG.md b/packages/sagemaker-ssh-kiro/CHANGELOG.md new file mode 100644 index 00000000000..83b74a251a1 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/CHANGELOG.md @@ -0,0 +1,2 @@ +## 0.1.0 +- Initial release diff --git a/packages/sagemaker-ssh-kiro/README.md b/packages/sagemaker-ssh-kiro/README.md new file mode 100644 index 00000000000..84826a26f12 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/README.md @@ -0,0 +1,3 @@ +# Amazon SageMaker SSH Plugin for Kiro + +A plugin for AWS Toolkit that enables secure remote development in Amazon SageMaker Spaces using the Kiro IDE. This plugin provides SSH connectivity between your local Kiro environment and SageMaker Spaces, allowing you to develop, train, and deploy machine learning models using SageMaker's managed infrastructure while working in your local IDE. Note: This extension is specifically designed for Kiro IDE users; VS Code users should continue using the Microsoft Remote - SSH extension. diff --git a/packages/sagemaker-ssh-kiro/aws-icon-256x256.png b/packages/sagemaker-ssh-kiro/aws-icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..2cb94c1f3e347c0310ef39c204044d8b4fd2cd80 GIT binary patch literal 10466 zcmeI2q5AQ$VesbUQHcJ18mex1=W})#*lCW;Hua6vwy5Pl+h1`zqP+<>b(oBq1OURDQ4j zHatz4o8U7@ZokoR6)-1LXAzs*=;VK&TcBBJ_w|$n1ZNm{7%-Ybr~Lt``FiXtAJ#~i z;rsoi$4ZQRlW(q~bU-8wU@2U$GHkjLr*t0wU8x|YOFUlS$3^{_ni6I-&|5qVm)LJf z8aVRX<`>I}0A_;fS)V{N;@dK7`3%(0>-AQ!5lGzZ$9_aL9mf5TDYV|_e=tcF3Fccf zCFdoZh}AHFy7?Olxdw*54Ab>VQjf<30%{#UPH?kWfh(25#wn zu%3TFZWCS=n6iM}{wP(&jEwG$VAfn0J89DWcsbhLf?OPhB0Bx^4C=+5$^E_R4AYk`2H(iaWtnU z;=b$jiXa*B?>7}64_}h>Dnq!F(Cfpyuf(2p0DR|aO4SGK5Heq4zhYUy@oMb1!Nb4c zXCX*aqMKOD8T#;tzGQwovOp`=pcA{wg5<*{FjAYI#rKSe&r=f8OpN;1L&KHfPmXN8 zT^w#xCVTIJzpyBQU|1(cvVUfLk1coz`Kb+b@(09AtoNkS!ofkrC>pfB>oX7Ra*bi` zxVPfmqQrhQGDgXzz`HEpp$C#ln9xOZUwS9wP$`MuGswHu;Y(bs5g6ov>E1bvh`>YN zUCn{eIR!Wvfue(a7fR1l0Odmktk`03eg}X&3HFEr8B1HuFi6Cf75weE z1qIMpX5=uG&md4AAnyV|3y$xZ;F6G?*BL^TlDyYfgLGsdcm^&X78WW*_`k9L9U{re z4O{>*p#Vuaksq51*50^JQccZ0MA?fm&XP!K++3>lw&jeXCEur3`ist zZBl|D0V*IJ3vTq{zUC2;c#|@u7r1~CgThG|u*%&I{y4)Wp(qO^u1*9%h3pO(E+qr; z0OD8(l*xTV4mvNFAGk4~11bjaBSuN6(cwbXHUbGl4&U2CdEYP`C;dIky|NcH6xn^> zP)GD)NBCZOfmag3A%ldWmf9_*!~Qej-l+daO!!(`zc1Z*x9gf}wzG)nag-gt|uisIfl zEg(7G*XoPk?l|gJyA>4co+m`jKDW3z+xf#z&h|BlO<0_=snOX=p~{q6p(+>s<~Ua= zTe^z5+cBQ%ul(GT99Tl>ts3X}@pvZWq$ zJZ#vUYPzlbaUA(rAf_N*M&a^kHDa~Htn@u50VZ_Lb9spNZtV^+bjj2gF{!unaq7t( z)LWg$G|U@68(ojTZ7YnL?xy(uRC}Z4E4u{_W4R0z876MqVJ2jGfbB4uZud3%Br<)g zFB->wc&_E>S76f0$?@~)r<;`{!)66)IT7YB?f$UE=PABS#7h=0J}jwq)}004S=cF2t=`w> zzs(s}=3VEws9W!9b)cuIb}y|`eZTgV1*TTN7p}o?=HkeVf2z2{&o+_K zW4zb&x=FzA^yYj{cBRKR^6PuHR5_NCcP(1B)R#uWslDGCON@YhZ*ILuK8@MGr7)X$ zSVz%%`(w39(AwFiYdk-5alI?)g;c)$xXbX4Wp2Ag3#m!$wX!RR66@KsmJ0m_ht+J0 zy5&goa&vc+9f)bN#)s!RU%lql-6b{)2OdBVW_y%2JGjaXxcx|`XPIVN=WRJ=iqK)C z)dZ67`^3K;>PJt$8u6wU$w{t~(52KsH2xUrd-e(W3tS+G_l};r_W{3AvDqwNc}T%T z%c!bszbe6&tcGmiUciJ$T_Kh$rd)O^f5rV)d;VMDvpAf^xfUX^Czv~Qjr7q!G8I*4 zt9hBVLID(_ci+XtLY>5P&RT>9RGV6=nHPB}(*XnntmX)YEHojmW0AtGu3HGk5JZnnxIl4XO;#XY0S&imz<2 zvA82YCiCRvm|oZVKXpqQ+ReGFKvT}kzR2WGT)Bb|2I$ddW$RhZy1iA+4uNO zQv9edRA@9;)3M>ml|o@ZjYXbH(>(ae!V5k0;jAwGz$f0h&(>o9wo!uC8TN0?g-G4l z5oB{m@16g+UuE1~*`KRnrC&g)gC()9P8~=o+iQHAG;@0NvQnQNVeY+*W)~GYkI8+L z<_RVP`9CM~u4RJbyg`WJ2)&{FKt6kS!*td$pj}EhFSTkd2T*&HBtolyYT9ht zg-lpDC$UwNI(fD~-my}pmZDw1hP{n;nDCJr+hi>pA|}K7I94CaH?fP8*y2--$xAoO zeAkpY>xMUQ>1LVyPG)buP2vewvQRn)u63zh`d+KKLE4#2M&ToJZ)bmd{_5;zyxCuT)0M)-q-^V>rdey1wzLHTQbY_bigXCk zHfAG9Jg8((O}u|ce+~++(y1W|Q=tSIN!*9zEw<3o$3CA`V(X7>l5c>X2TsKhLhDs-K~l0jQK)xe^5bHRa3h*9sDb zrPFSyOD6QTV;o&s!cO~};p9b-R{~_oiJ1DmrpQ#KBn3|XXy&IO_eu^I zLLQUu(1B!Ll+t9VEQ2HzJ4Evbg$tOwqB|&gx(%qUF6U=_F+{w(^k+L^CAA~_k*NY` z&It|;kgq*{Out2j^S}qcN$eJKRVhIsq;AV2PsZF^2}&Sw>;Q7|^F9*vClxKL(+^#C zdHLEmZ~i+JEL;2TsG}-1V*;n#mP~&uPXj6iNYSOe3HH-L1~Z5Qb)ui*R^*h~V_&q1 zH|nC%w_O@epS+8 zN?yn`A;;JL}2$be{YHTGNK0L@(AK_ z=)Ku2ahQjp4kt`hlEH-5j*+@J+tOs%fBrO0r$CSg0rq%$(WX(h8+RNIFh(4t<6txL z)>k6nM50l(mn9hULFa^Z8H2ldwvc6-E$bV(#k&M`KaET-l>7aux#vvLuA(d`Uos^k z44m#+kAe%sn9e*k#`Fz3Uu%x27)};xeqK77EK!$@vYn7jDIggbjf_&;bhnzjswiJ3 z5cC-vsK~?jF~vWKf47yus-C-`zay~`kdCF&(&+q!n`)=&mT4RR(eqf)mWc7sVLm~Y zW@e>_A29m{zH_>HLQ`PXdUdE^V+rncM8Mg5lSg7p5qpx9}xa^ye$d` zhqk#b$kc1XGF`^&*|>+vf*%J z^Mgfny5MGd-TZPfY)E`rV>9m%x1*65J*QWTsg;K!Z#VNXVw~%S9-8vZzKuBa1JkxF z-vWFgcwnV#U#4-mw`Oc0`!7N zR^PSiMEsHltx0`uN3GilFu)o&j*75@8QsXt@Uew(+7&72dk*07Sj0{kVm^;pIgIUJ zsHBg7eyQf^_+%*$DVJLh-*ydS3_EZ^~KD~GLijw^`RT*{EJ8fXR~b~ zc1qyP594}DaP=gjTlb~13QkHf{u7)7do-Dk?@&0c{F5e=MXL9m6CZM)cv7Rw!El4jpkg;JDD zV&}n7KsIeUUVsab4hwLi{p(*IELL$EavNE;x=_-9$l3ORw0K%X-!{wHSfs2NI5*g& z);^S?WNEx{orw}Rv8HRho>%q?O3H11&h@E0A)#mrK_R!{TTE!zw*4eT$iQLo58h;~ z62+=0*0-~(nV}?P2kZg!)n>rkL|!P-h}^WON=u0MN=gkiU*Lp1OT+{Z!Bc)iZK_!#Z!rn zuv=vt>=>hBNaPSqNr$|f`i`T~hZ_WWMDReH&Ra>~E`3}NxcC*_yg#b43|{}b$rTx& zYFE!Z&-+}bF53HJyy@e<1wWQP=jogD2=|remRS*ulMk72P+iAySQmIJ8I63Gk24H+ zXKK!NgQxq!WJ6sS9!}dP)!GL(98oZY&(&@YMK2SHQS!r^IiQG z!D%7L8o;@2^Q`*=6WH)*yU7R2&)(0FEOVDxxLmYX8@2_bF~y#x+}muH5| zsg=*x#Xgih!;fJN|1*|QmmOTf z|u6!e;Z~~-MMbBePD}5^CHqI8hz7~D0f-M|8Zf~bM zSaUcZ?1LRNRecy(Hth*11y^8^<}e7MHa^FDJv}nc##Ee}KZIC8p5D);wH!W#vK6~u zyX<;DtTRzVi`c&4vRF^L^>axR%*>cn_J@#bqrdYNvgpVF#P{L@=Y_htO9mT4?dV7!t*O$P1?O$-^>+nq4?%Jc z3HP4EP~NTj1l~V1#Wf;+dD2ynrWm`4J(pniZMht(U&e2~Tl17@a~~gEh_s5+Ppu}- zU2Qf@MUi}{F$nyPiNSUwv3}I(y1SD=zV&Zl{6nvyZS$;gsTj_8PS=08<;#H&x0Z;5 zWTI0yx`J`pgx!qVGT^#D((k{nEK(+ZSJ^#@^N2BGV+{Uju3zRbr4m9e6y!C{Q;tn3Fn}Q?3HTQvO=KZ4A6FUpV_GzHN`xWZaRbi-KU)W``u&esl#5G z@BTt`x$QwuLnZFhr!(RlnJn`WC(~T1c-~DdkKaRzB!~#mh^Yl`4bS$s;Ljcug&zx8IoE zuf?{ZxSxG-Xrn)kzhY#agt2}2#U(c@@+*Lz(mnj}&fzKVIu)QVB|Gbys!?iv_rZ_{ z>x*VjuO3EgLG9me*U(teHC_)JiPQ4eJMRc{#pJ_YQ27b^5rgW32gIa$c5HKZDB|5m zFQqhv-(fWcUOMT1p4Sup%kC36J{pb`HXal>tML3@b_IDD$xaQ06U{po{W~1q4i_!1 z+ZK|LWu)wlXgt?qdG4)GAVVJPMCbRagLv-Fn1fNt*;%3@oV7`1PV%%`A#tJB6V2)C z+!`KZ{oc3~Cmx|wkw@RAy^7nem2JHBE0{-%8-O8ZrZ~SF5wpuKPkSdUuQ1rJAM>alUbH;H#pS@Z%2z}iYxH9|8iezq8A29NTl)3e|A^S zB`6Ms{ut9968RL`BWoS2sHy8+k^n=|zId}_j2l>eS5&s@sd;Im{=<>gyK}lgeISfP zM_W_j0>LkCiET_-utI_o`EvaJL#zVi)P`P-ZD3K**TS#ap;?gN@?{-{NGcm z$FG>yRtK~eF7WmZhdEiy- zZTo0ePF#;_acR%1kh<|`x%_kHF=KNFFm)lw(S-63o*~4gghcnWxVPT|QOkAC`AAzP zNcie>!Z)nC8D2WTQ^8Fo$sF}ypVb{Q)y#18=N3-QFJsbJJc~2@upqs8S^emTQgiSQ z1=#iuv4VX&HGAS0YyN&o=b&F-(&(BeR+~R+K6O3R>s;!JS)%-EZMRsKM)K#_W{L03>$RhX2LFDu6b1xQfuHov(A2+faw9NG=vFxHy0=rNz z`<&jr(>t+UukbhM)SKff1{POJ05w?Aa1^aLJD`0|U!I43v^7xLs_ z*AuROeUY@q`z|}V|9j;(QnOg9zsrS6(nBK&l0TNi=NMM7*n7ehtyquFF4+Wcia%1N zJpqs6(u^uVgncCnCs150pN7^SVF5dqRF@d_0gy*F;t%VJ}d?WHjL4;hS&im&P407IwZy3(wZTS@7#9HCaH#x*!zwJ z7?Bjg6jD`%vTjVHl3vKVb;+n;48BHrpw4KHizdbQbZNX!Yd z|4AE-)6`I1_*(HgB>#mqTkfqJkaKvb(jL3gH$U&|a%^}CIeG1NTLj-Xc&vJQkq{+XogeTn71XbuH)L-j6;d$;7^o-ae1SRxit(|ovZE`P4( zokr?l_pDW8ih2)SyV3^x=UsRJ7&%z#S0nr(tev&GtbH7;!LnneTgs;t#9gi{cUkkTV7$2dqY2=iDiCalw()ngaLGcaO-Fk zPJgG0;}Px2Tw(gB5N@w1ETfGhOAry5AYaUEKpu!XS3pcDjlaA--U7EWP!uRpq3nHAZ86-Ss8 z^e`1zzNq`;r_Dm+G_{=_B4aV#*mXU#BI>-LnrSrh&5Q4qSzmzk%x31hKrQHX+)r(@ z6Dl6$#-fz9-=FEQn*-;QKPz`3DR>ntTjwNx%%HU#b7xCA9>#LVNv`<2qB^yzSDhQhhI#G3@_picAcSN!DrI@Q)_UxW$h z(O}R7;Rb5vbrv$=i0WNm^lX`*)e0?Qiv+ceKfT<;{*5S?*hu+{22xFzvC@}604sC4UpRYx$7 z9oP;wMUE6Mu)idC(#vGMsyp_*yG$qAGMmkFi2fGnc$0zD_xzyEuWx7Wp2PKl{}jzV`xS{3y>>Rr-^PMrle~)u5cB zANnN}PwJvtR2YRm6_%z%JCS)wF>ks298-mRqjOw7#qN2&{prJlWJ2M)Zf1r$Q#Vf< zsS{5r@$0WPXg-)rKz}EDFvH=E zFopr>uVWYEXiR5tC>l;;319>}+ObQ~I*H3V%$SX| z&h_d{3R!PD6yiH1aZ{SLBaR<3BpK-5~U_`J!C)z+9uISas3asdeAAOqJsLLMTVZOg6 zxd&qm%lEZ)fk3~KP{R8fp=cD(`@1?Bu32*6jy_W2KlgE<^Yd?@YXRr~oHfWRkQs7K zr)2`4!4FzoT4GB98v1*#NAfNVXQw+zj0LR4aDWuK9G&qe2Ym8rG8*ZO9>Zn;(tGKK zAVA}8@GHpLwMnxaj0(Gn*q&9SyT_<{Ss|s-X*V0XndE@-1{<*c!E!5V{(s*LzQ?a9 z#1cR#a5?e|H?Z=I>|=h&TfWJ5yZ;n*BT>vP*UyD7r_pCWM;@UDe{l(F`10z1!+#Ks zU=Sfe(a>%2Uyjngg(6`sfI{&6vhV*s7LM9KUaz#k@uC9cw}ZGT>!*+9)0n^rhH;Ym zm%fD8b9s3%hQ{iCEcwm-zLa1@`a0%6$chiFezI47BJr_NVfg_-v8D~U1KMC_res+N z4-V+pB&siZhCm;LIG5ALO4{6)Q&wY?hiR> LWkl&KBme&ae(t$e literal 0 HcmV?d00001 diff --git a/packages/sagemaker-ssh-kiro/package.json b/packages/sagemaker-ssh-kiro/package.json new file mode 100644 index 00000000000..a5f197b28e6 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/package.json @@ -0,0 +1,99 @@ +{ + "name": "sagemaker-ssh-kiro", + "displayName": "Amazon SageMaker SSH Plugin for Kiro", + "description": "Plugin for AWS Toolkit that enables secure remote development in Amazon SageMaker Spaces using the Kiro IDE.", + "version": "0.1.0", + "publisher": "amazonwebservices", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/aws/aws-toolkit-vscode" + }, + "icon": "resources/marketplace/aws-icon-256x256.png", + "bugs": { + "url": "https://github.com/aws/aws-toolkit-vscode/issues" + }, + "galleryBanner": { + "color": "#232F3E", + "theme": "dark" + }, + "extensionKind": [ + "ui" + ], + "enabledApiProposals": [ + "resolvers", + "contribViewsRemote" + ], + "categories": [ + "Other" + ], + "keywords": [ + "AWS", + "SageMaker", + "remote development", + "ssh" + ], + "preview": false, + "qna": "https://github.com/aws/aws-toolkit-vscode/issues", + "api": "none", + "activationEvents": [ + "onStartupFinished", + "onResolveRemoteAuthority:sagemaker-ssh-kiro" + ], + "main": "./dist/extension.js", + "engines": { + "npm": "^10.1.0", + "vscode": "^1.83.0" + }, + "contributes": { + "configuration": { + "title": "SageMaker SSH", + "properties": { + "aws.sagemaker.ssh.kiro.defaultExtensions": { + "type": "array", + "items": { + "type": "string" + }, + "description": "List of extensions to be automatically installed when connecting to SageMaker Spaces.", + "scope": "application" + }, + "aws.sagemaker.ssh.kiro.serverDownloadUrlTemplate": { + "type": "string", + "description": "The URL from where the Kiro remote server will be downloaded for SageMaker Spaces.", + "scope": "application" + } + } + }, + "resourceLabelFormatters": [ + { + "scheme": "vscode-remote", + "authority": "sagemaker-ssh-kiro+*", + "formatting": { + "label": "${path}", + "separator": "/", + "tildify": true, + "workspaceSuffix": "SageMaker" + } + } + ] + }, + "scripts": { + "vscode:prepublish": "npm run clean && npm run buildScripts && webpack --mode production", + "buildScripts": "npm run copyFiles && tsc -p ./ --noEmit", + "copyFiles": "ts-node ./scripts/build/copyFiles.ts", + "clean": "ts-node ../../scripts/clean.ts dist/", + "webpack": "webpack --mode development", + "webpack:analyze": "webpack --mode production --analyze", + "bundle-analyze": "npx webpack-bundle-analyzer dist/extension.js", + "compile": "tsc -b", + "watch": "tsc -b -w", + "package": "ts-node ../../scripts/package.ts", + "update-dts": "npx vscode-dts dev" + }, + "devDependencies": { + "@types/ssh2": "^1.15.0" + }, + "dependencies": { + "ssh2": "^1.17.0" + } +} diff --git a/packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts b/packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts new file mode 100644 index 00000000000..b75788f3610 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/scripts/build/copyFiles.ts @@ -0,0 +1,62 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/* eslint-disable no-restricted-imports */ +import fs from 'fs' +import * as path from 'path' + +// Copies various dependencies into "dist/". + +const projectRoot = process.cwd() +const outRoot = path.join(projectRoot, 'dist') + +interface CopyTask { + /** + * Target file or directory to copy. + */ + readonly target: string + + /** + * Providing no destination means the target will be copied relative to the root directory. + */ + readonly destination?: string +} + +const tasks: CopyTask[] = [ + ...['LICENSE', 'NOTICE'].map((f) => { + return { target: path.join('../../', f), destination: path.join(projectRoot, f) } + }), + // Copy the AWS icon from toolkit resources + { + target: 'aws-icon-256x256.png', + destination: '../resources/marketplace/aws-icon-256x256.png', + }, +] + +function copy(task: CopyTask): void { + const src = path.resolve(projectRoot, task.target) + const dst = path.resolve(outRoot, task.destination ?? task.target) + + try { + fs.cpSync(src, dst, { + recursive: true, + force: true, + errorOnExist: false, + }) + } catch (error) { + throw new Error(`Copy "${src}" to "${dst}" failed: ${error instanceof Error ? error.message : error}`) + } +} +function main() { + try { + tasks.map(copy) + } catch (error) { + console.error('`copyFiles.ts` failed') + console.error(error) + process.exit(1) + } +} + +void main() diff --git a/packages/sagemaker-ssh-kiro/src/authResolver.ts b/packages/sagemaker-ssh-kiro/src/authResolver.ts new file mode 100644 index 00000000000..af59e3f5357 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/authResolver.ts @@ -0,0 +1,306 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as cp from 'child_process' // eslint-disable-line no-restricted-imports +import * as path from 'path' +import * as stream from 'stream' +import * as vscode from 'vscode' +import SSHConnection from './sshConnection' +import { findRandomPort } from './common/ports' +import { disposeAll } from './common/disposable' +import { installCodeServer, ServerInstallError } from './serverSetup' +import { waitForMatchingStreamOutput as waitForStreamOutput } from './common/streamUtils' +import { withTimeout } from './common/promiseUtils' + +// This mirrors the timeout value that the AWS Toolkit writes into the remote.SSH configuration for VS Code. +const connectTimeoutSeconds = 120 + +// This is hard-coded rather than imported from the AWS Toolkit core/ package to keep the bundle size low. +const awsToolkitExtensionId = 'amazonwebservices.aws-toolkit-vscode' + +export const sagemakerSshKiroAuthority = 'sagemaker-ssh-kiro' + +export function getRemoteAuthority(host: string) { + return `${sagemakerSshKiroAuthority}+${host}` +} + +class TunnelInfo implements vscode.Disposable { + constructor( + readonly localPort: number, + readonly remotePortOrSocketPath: number | string, + private disposables: vscode.Disposable[] + ) {} + + dispose() { + disposeAll(this.disposables) + } +} + +export class SageMakerSshKiroResolver implements vscode.RemoteAuthorityResolver, vscode.Disposable { + private sshConnection?: SSHConnection + private tunnels: TunnelInfo[] = [] + private proxyCommandProcess?: cp.ChildProcessWithoutNullStreams + + private labelFormatterDisposable?: vscode.Disposable + + constructor( + readonly context: vscode.ExtensionContext, + readonly logger: vscode.LogOutputChannel + ) {} + + resolve(authority: string, context: vscode.RemoteAuthorityResolverContext): Thenable { + const { hostname: hostname, user } = validateAuthority(authority) + + this.logger.info(`Resolving ssh remote authority '${authority}' (attemp #${context.resolveAttempt})`) + + const awsSagemakerConfig = vscode.workspace.getConfiguration('aws.sagemaker.ssh.kiro') + const serverDownloadUrlTemplate = awsSagemakerConfig.get('serverDownloadUrlTemplate') + let defaultExtensions = awsSagemakerConfig.get('defaultExtensions', []) + + // Ensure the AWS Toolkit is always installed. In VS Code, this is done by updating the user's + // `defaultExtensions` setting before connecting, but there is no need to update the user's setting if we are + // going to make sure it's installed every time. + if (!defaultExtensions.includes(awsToolkitExtensionId)) { + defaultExtensions = [...defaultExtensions, awsToolkitExtensionId] + } + + const awsToolkitGlobalStoragePath = this.context.globalStorageUri.fsPath.replace( + path.basename(this.context.globalStorageUri.fsPath), + awsToolkitExtensionId + ) + + const isWindows = process.platform === 'win32' + const scriptName = `sagemaker_connect${isWindows ? '.ps1' : ''}` + const sagemakerConnectPath = path.join(awsToolkitGlobalStoragePath, scriptName) + const proxyArgs = [hostname] + + return vscode.window.withProgress( + { + title: `Setting up SSH Host ${hostname}`, + location: vscode.ProgressLocation.Notification, + cancellable: false, + }, + async () => { + try { + // Use the determined sagemaker_connect script with appropriate arguments + const command = sagemakerConnectPath + + let options: cp.SpawnOptions = { + env: { ...process.env }, // Inherit environment variables from parent process + } + + if (isWindows && /\.ps1$/.test(command)) { + // For PowerShell scripts, use powershell.exe + const allArgs = ['-ExecutionPolicy', 'RemoteSigned', '-File', command, ...proxyArgs] + options = { + ...options, + windowsHide: true, + } + + this.logger.info(`Spawning SageMaker Connect: powershell.exe ${allArgs.join(' ')}`) + this.proxyCommandProcess = cp.spawn( + 'powershell.exe', + allArgs, + options + ) as cp.ChildProcessWithoutNullStreams + } else { + this.logger.info(`Spawning SageMaker Connect: ${command} with args: [${proxyArgs.join(',')}]`) + this.proxyCommandProcess = cp.spawn( + command, + proxyArgs, + options + ) as cp.ChildProcessWithoutNullStreams + } + + if (!this.proxyCommandProcess.stdout || !this.proxyCommandProcess.stdin) { + throw new Error('Failed to create proxy command process streams') + } + + // Monitor stderr for errors while spinning sagemaker_connect script + this.proxyCommandProcess.stderr.on('data', (data) => { + const errorText = data.toString() + this.logger.info(`SageMaker Connect stderr: ${errorText}`) + }) + + if (isWindows) { + // For Windows, we have to wait until the SSM session provides an appropriate ready signal, + // or else the SSH2 client handshake will fail for some unknown reason. + this.logger.info('Waiting for SSM session to be ready...') + const readySignals = ['Starting session with SessionId:', 'SSH-2.0-Go'] + + try { + await withTimeout( + waitForStreamOutput(this.proxyCommandProcess.stdout, (data: Buffer) => { + const output = data.toString() + // The stderr 'data' callback doesn't emit on Windows for some reason (possibly due to the way the sagemaker_connect + // powershell script is written), so logging stdout is the only way to see what is happening. + this.logger.info(`SageMaker Connect output: ${output}`) + + for (const signal of readySignals) { + if (output.includes(signal)) { + this.logger.info(`Tunnel ready signal detected: [${signal}]`) + return true + } + } + + return false + }), + 30_000 + ) + } catch (error: unknown) { + const errorMessage = `Failed to establish SSM session: ${error}` + this.logger.error(errorMessage) + throw new Error(errorMessage) + } + } + + const proxyStream = stream.Duplex.from({ + readable: this.proxyCommandProcess.stdout, + writable: this.proxyCommandProcess.stdin, + }) + + // Authentication is handled by AWS SSM Session Manager + this.sshConnection = new SSHConnection({ + sock: proxyStream, + username: user, + readyTimeout: connectTimeoutSeconds * 1000, + }) + await this.sshConnection.connect() + + const installResult = await installCodeServer( + this.sshConnection, + serverDownloadUrlTemplate, + defaultExtensions, + false + ) + + const tunnelConfig = await this.openTunnel(0, installResult.listeningOn) + this.tunnels.push(tunnelConfig) + + this.labelFormatterDisposable?.dispose() + this.labelFormatterDisposable = vscode.workspace.registerResourceLabelFormatter({ + scheme: 'vscode-remote', + authority: `${sagemakerSshKiroAuthority}+*`, + formatting: { + label: '${path}', + separator: '/', + tildify: true, + workspaceSuffix: `SageMaker: ${hostname}`, + }, + }) + + const resolvedResult: vscode.ResolverResult = new vscode.ResolvedAuthority( + '127.0.0.1', + tunnelConfig.localPort, + installResult.connectionToken + ) + return resolvedResult + } catch (e: unknown) { + this.logger.error(`Error resolving authority`, e) + + // Initial connection + if (context.resolveAttempt === 1) { + this.logger.show() + + const closeRemote = 'Close Remote' + const retry = 'Retry' + const result = await vscode.window.showErrorMessage( + `Could not establish connection to "${hostname}"`, + { modal: true }, + closeRemote, + retry + ) + + if (result === closeRemote) { + await vscode.commands.executeCommand('workbench.action.remote.close') + } else if (result === retry) { + await vscode.commands.executeCommand('workbench.action.reloadWindow') + } + } + + if (e instanceof ServerInstallError || !(e instanceof Error)) { + throw vscode.RemoteAuthorityResolverError.NotAvailable( + e instanceof Error ? e.message : String(e) + ) + } else { + throw vscode.RemoteAuthorityResolverError.TemporarilyNotAvailable(e.message) + } + } + } + ) + } + + private async openTunnel(localPort: number, remotePortOrSocketPath: number | string) { + localPort = localPort > 0 ? localPort : await findRandomPort() + + const disposables: vscode.Disposable[] = [] + const remotePort = typeof remotePortOrSocketPath === 'number' ? remotePortOrSocketPath : undefined + const remoteSocketPath = typeof remotePortOrSocketPath === 'string' ? remotePortOrSocketPath : undefined + + this.logger.info(`Opening tunnel ${localPort}(local) => ${remotePortOrSocketPath}(remote)`) + const tunnelConfig = await this.sshConnection!.addTunnel({ + name: `ssh_tunnel_${localPort}_${remotePortOrSocketPath}`, + remoteAddr: '127.0.0.1', + remotePort, + remoteSocketPath, + localPort, + }) + disposables.push({ + dispose: () => { + void this.sshConnection?.closeTunnel(tunnelConfig.name) + this.logger.info(`Tunnel ${tunnelConfig.name} closed`) + }, + }) + + return new TunnelInfo(localPort, remotePortOrSocketPath, disposables) + } + + dispose() { + disposeAll(this.tunnels) + void this.sshConnection?.close() + this.proxyCommandProcess?.kill() + this.labelFormatterDisposable?.dispose() + } +} + +export function validateAuthority(authority: string): { hostname: string; user: string } { + const [type, dest] = authority.split('+') + if (type !== sagemakerSshKiroAuthority) { + throw new Error(`Invalid authority type for SageMaker SSH Kiro resolver: ${type}`) + } + + let hostname = dest + let user = 'sagemaker-user' + if (dest.includes('@')) { + const parts = dest.split('@') + + if (parts.length !== 2) { + throw new Error(`Invalid connection format: ${dest}. Expected format: [user@]hostname`) + } + + const providedUser = parts[0].trim() + hostname = parts[1].trim() + + if (providedUser) { + if (!/^[a-zA-Z0-9_-]+$/.test(providedUser)) { + throw new Error( + `Invalid username format: ${providedUser}. Username must contain only alphanumeric characters, hyphens, and underscores.` + ) + } + + user = providedUser + } + } + + if (!/^sm_[a-zA-Z0-9\._-]+$/.test(hostname)) { + throw new Error(`Invalid SageMaker hostname format: ${hostname}. Expected either 'sm_*' format.`) + } + + return { hostname, user } +} diff --git a/packages/sagemaker-ssh-kiro/src/common/disposable.ts b/packages/sagemaker-ssh-kiro/src/common/disposable.ts new file mode 100644 index 00000000000..3db6fc06b80 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/disposable.ts @@ -0,0 +1,46 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as vscode from 'vscode' + +export function disposeAll(disposables: vscode.Disposable[]): void { + while (disposables.length) { + const item = disposables.pop() + if (item) { + item.dispose() + } + } +} + +export abstract class Disposable { + private _isDisposed = false + + protected _disposables: vscode.Disposable[] = [] + + public dispose(): any { + if (this._isDisposed) { + return + } + this._isDisposed = true + disposeAll(this._disposables) + } + + protected _register(value: T): T { + if (this._isDisposed) { + value.dispose() + } else { + this._disposables.push(value) + } + return value + } + + protected get isDisposed(): boolean { + return this._isDisposed + } +} diff --git a/packages/sagemaker-ssh-kiro/src/common/logger.ts b/packages/sagemaker-ssh-kiro/src/common/logger.ts new file mode 100644 index 00000000000..aacb46812d0 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/logger.ts @@ -0,0 +1,20 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' + +let logger: vscode.LogOutputChannel | undefined + +export function initializeLogger(): vscode.LogOutputChannel { + logger = vscode.window.createOutputChannel('Amazon SageMaker SSH Plugin for Kiro', { log: true }) + return logger +} + +export function getLogger(): vscode.LogOutputChannel { + if (!logger) { + throw new Error('Logger not initialized. This was probably called before extension activation') + } + return logger +} diff --git a/packages/sagemaker-ssh-kiro/src/common/ports.ts b/packages/sagemaker-ssh-kiro/src/common/ports.ts new file mode 100644 index 00000000000..ce866419974 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/ports.ts @@ -0,0 +1,138 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as net from 'net' + +/** + * Finds a random unused port assigned by the operating system. Will reject in case no free port can be found. + */ +export function findRandomPort(): Promise { + return new Promise((resolve, reject) => { + const server = net.createServer({ pauseOnConnect: true }) + server.on('error', reject) + server.on('listening', () => { + const port = (server.address() as net.AddressInfo).port + server.close(() => resolve(port)) + }) + server.listen(0, '127.0.0.1') + }) +} + +/** + * Given a start point and a max number of retries, will find a port that + * is openable. Will return 0 in case no free port can be found. + */ +export function findFreePort(startPort: number, giveUpAfter: number, timeout: number, stride = 1): Promise { + let done = false + + return new Promise((resolve) => { + const timeoutHandle = setTimeout(() => { + if (!done) { + done = true + return resolve(0) + } + }, timeout) + + doFindFreePort(startPort, giveUpAfter, stride, (port) => { + if (!done) { + done = true + clearTimeout(timeoutHandle) + return resolve(port) + } + }) + }) +} + +function doFindFreePort(startPort: number, giveUpAfter: number, stride: number, clb: (port: number) => void): void { + if (giveUpAfter === 0) { + return clb(0) + } + + const client = new net.Socket() + + // If we can connect to the port it means the port is already taken so we continue searching + client.once('connect', () => { + dispose(client) + + return doFindFreePort(startPort + stride, giveUpAfter - 1, stride, clb) + }) + + client.once('data', () => { + // this listener is required since node.js 8.x + }) + + client.once('error', (err: Error & { code?: string }) => { + dispose(client) + + // If we receive any non ECONNREFUSED error, it means the port is used but we cannot connect + if (err.code !== 'ECONNREFUSED') { + return doFindFreePort(startPort + stride, giveUpAfter - 1, stride, clb) + } + + // Otherwise it means the port is free to use! + return clb(startPort) + }) + + client.connect(startPort, '127.0.0.1') +} + +/** + * Uses listen instead of connect. Is faster, but if there is another listener on 0.0.0.0 then this will take 127.0.0.1 from that listener. + */ +export function findFreePortFaster(startPort: number, giveUpAfter: number, timeout: number): Promise { + let resolved = false + let timeoutHandle: NodeJS.Timeout | undefined = undefined + let countTried = 1 + const server = net.createServer({ pauseOnConnect: true }) + function doResolve(port: number, resolve: (port: number) => void) { + if (!resolved) { + resolved = true + server.removeAllListeners() + server.close() + if (timeoutHandle) { + clearTimeout(timeoutHandle) + } + resolve(port) + } + } + return new Promise((resolve) => { + timeoutHandle = setTimeout(() => { + doResolve(0, resolve) + }, timeout) + + server.on('listening', () => { + doResolve(startPort, resolve) + }) + server.on('error', (err) => { + if (err && ((err).code === 'EADDRINUSE' || (err).code === 'EACCES') && countTried < giveUpAfter) { + startPort++ + countTried++ + server.listen(startPort, '127.0.0.1') + } else { + doResolve(0, resolve) + } + }) + server.on('close', () => { + doResolve(0, resolve) + }) + server.listen(startPort, '127.0.0.1') + }) +} + +function dispose(socket: net.Socket): void { + try { + socket.removeAllListeners('connect') + socket.removeAllListeners('error') + socket.end() + socket.destroy() + socket.unref() + } catch (error) { + console.error(error) // otherwise this error would get lost in the callback chain + } +} diff --git a/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts b/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts new file mode 100644 index 00000000000..aea571d8e5c --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts @@ -0,0 +1,37 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +/** + * Creates a promise that resolves/rejects when the provided promise settles, or rejects when the timeout expires. + */ +export function withTimeout(promise: Promise, timeoutMs: number): Promise { + return new Promise((resolve, reject) => { + let isSettled = false + + const timeoutId = setTimeout(() => { + if (!isSettled) { + isSettled = true + reject(new Error(`Operation timed out after ${timeoutMs}ms`)) + } + }, timeoutMs) + + promise.then( + (result) => { + if (!isSettled) { + isSettled = true + clearTimeout(timeoutId) + resolve(result) + } + }, + (error) => { + if (!isSettled) { + isSettled = true + clearTimeout(timeoutId) + reject(error) + } + } + ) + }) +} diff --git a/packages/sagemaker-ssh-kiro/src/common/streamUtils.ts b/packages/sagemaker-ssh-kiro/src/common/streamUtils.ts new file mode 100644 index 00000000000..94c45e04a3a --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/common/streamUtils.ts @@ -0,0 +1,33 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as stream from 'stream' + +/** + * Returns a promise that resolves when the provided stream outputs data that satisfies the provided predicate function. + */ +export function waitForMatchingStreamOutput( + stream: stream.Readable, + predicate: (data: Buffer) => boolean +): Promise { + return new Promise((resolve, reject) => { + const onData = (data: Buffer) => { + if (predicate(data)) { + cleanup() + resolve() + } + } + + const cleanup = () => { + stream.off('data', onData) + } + + stream.on('data', onData) + stream.on('error', (error) => { + cleanup() + reject(error) + }) + }) +} diff --git a/packages/sagemaker-ssh-kiro/src/extension.ts b/packages/sagemaker-ssh-kiro/src/extension.ts new file mode 100644 index 00000000000..91e267c650a --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/extension.ts @@ -0,0 +1,40 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as vscode from 'vscode' +import { SageMakerSshKiroResolver as SageMakerSshKiroResolver, sagemakerSshKiroAuthority } from './authResolver' +import { initializeLogger } from './common/logger' + +export async function activate(context: vscode.ExtensionContext) { + const logger = initializeLogger() + context.subscriptions.push(logger) + + if (!vscode.env.appName.toLowerCase().includes('kiro')) { + const errorMessage = 'Amazon SageMaker SSH Plugin for Kiro is only supported in the Kiro IDE' + logger.error(errorMessage) + void vscode.window.showErrorMessage(errorMessage) + return + } + + try { + const sagemakerSSHResolver = new SageMakerSshKiroResolver(context, logger) + context.subscriptions.push( + vscode.workspace.registerRemoteAuthorityResolver(sagemakerSshKiroAuthority, sagemakerSSHResolver) + ) + context.subscriptions.push(sagemakerSSHResolver) + + logger.info('Amazon SageMaker SSH Plugin for Kiro activated successfully') + } catch (error) { + logger.error(`Amazon SageMaker SSH Plugin for Kiro: Activation failed: ${error}`) + void vscode.window.showErrorMessage(`SageMaker SSH Extension activation failed: ${error}`) + throw error + } +} + +export function deactivate() {} diff --git a/packages/sagemaker-ssh-kiro/src/serverConfig.ts b/packages/sagemaker-ssh-kiro/src/serverConfig.ts new file mode 100644 index 00000000000..f84a186e23d --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/serverConfig.ts @@ -0,0 +1,44 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as vscode from 'vscode' +import * as fs from 'fs' // eslint-disable-line no-restricted-imports +import * as path from 'path' + +let vscodeProductJson: any +async function getVSCodeProductJson() { + if (!vscodeProductJson) { + const productJsonStr = await fs.promises.readFile(path.join(vscode.env.appRoot, 'product.json'), 'utf8') + vscodeProductJson = JSON.parse(productJsonStr) + } + + return vscodeProductJson +} + +export interface IServerConfig { + version: string + commit: string + quality: string + serverApplicationName: string + serverDataFolderName: string + serverDownloadUrlTemplate?: string +} + +export async function getVSCodeServerConfig(): Promise { + const productJson = await getVSCodeProductJson() + + return { + version: vscode.version.replace('-insider', ''), + commit: productJson.commit, + quality: productJson.quality, + serverApplicationName: productJson.serverApplicationName, + serverDataFolderName: productJson.serverDataFolderName, + serverDownloadUrlTemplate: productJson.serverDownloadUrlTemplate, + } +} diff --git a/packages/sagemaker-ssh-kiro/src/serverSetup.ts b/packages/sagemaker-ssh-kiro/src/serverSetup.ts new file mode 100644 index 00000000000..b39841cdcf2 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/serverSetup.ts @@ -0,0 +1,382 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +import * as crypto from 'crypto' +import { getLogger } from './common/logger' +import { getVSCodeServerConfig } from './serverConfig' +import SSHConnection, { executeShellCommand } from './sshConnection' + +// Hard-code environment variables that are required for the install script to work on SageMaker Spaces. +const envVariables = { + USER: 'sagemaker-user', + HOME: '/home/sagemaker-user', +} + +export interface ServerInstallOptions { + id: string + quality: string + commit: string + version: string + extensionIds: string[] + useSocketPath: boolean + serverApplicationName: string + serverDataFolderName: string + serverDownloadUrlTemplate: string +} + +export interface ServerInstallResult { + exitCode: number + listeningOn: number | string + connectionToken: string + logFile: string + osReleaseId: string + arch: string + platform: string + tmpDir: string + [key: string]: any +} + +export class ServerInstallError extends Error { + constructor(message: string) { + super(message) + } +} + +export async function installCodeServer( + conn: SSHConnection, + serverDownloadUrlTemplate: string | undefined, + extensionIds: string[], + useSocketPath: boolean +): Promise { + const logger = getLogger() + const scriptId = crypto.randomBytes(12).toString('hex') + + const vscodeServerConfig = await getVSCodeServerConfig() + const installOptions: ServerInstallOptions = { + id: scriptId, + version: vscodeServerConfig.version, + commit: vscodeServerConfig.commit, + quality: vscodeServerConfig.quality, + extensionIds, + useSocketPath, + serverApplicationName: vscodeServerConfig.serverApplicationName, + serverDataFolderName: vscodeServerConfig.serverDataFolderName, + serverDownloadUrlTemplate: serverDownloadUrlTemplate || vscodeServerConfig.serverDownloadUrlTemplate || '', + } + + const installServerScript = generateBashInstallScript(installOptions) + + const serverSetupTimeoutSeconds = 120 + const commandOutput = await executeShellCommand( + conn, + // Fish shell does not support heredoc so let's workaround it using -c option, + // also replace single quotes (') within the script with ('\'') as there's no quoting within single quotes, see https://unix.stackexchange.com/a/24676 + `bash -c '${installServerScript.replace(/'/g, `'\\''`)}'`, + envVariables, + serverSetupTimeoutSeconds + ) + + if (commandOutput.stderr) { + logger.info(`Server install command stderr: ${commandOutput.stderr}`) + } + logger.info(`Server install command stdout: ${commandOutput.stdout}`) + + const resultMap = parseServerInstallOutput(commandOutput.stdout, scriptId) + if (!resultMap) { + throw new ServerInstallError(`Failed parsing install script output`) + } + + const exitCode = parseInt(resultMap.exitCode, 10) + if (exitCode !== 0) { + throw new ServerInstallError( + `Couldn't install vscode server on remote server, install script returned non-zero exit status, ${exitCode}` + ) + } + + const listeningOn = resultMap.listeningOn.match(/^\d+$/) + ? parseInt(resultMap.listeningOn, 10) + : resultMap.listeningOn + + return { + exitCode, + listeningOn, + connectionToken: resultMap.connectionToken, + logFile: resultMap.logFile, + osReleaseId: resultMap.osReleaseId, + arch: resultMap.arch, + platform: resultMap.platform, + tmpDir: resultMap.tmpDir, + } +} + +function parseServerInstallOutput(str: string, scriptId: string): { [k: string]: string } | undefined { + const startResultStr = `${scriptId}: start` + const endResultStr = `${scriptId}: end` + + const startResultIdx = str.lastIndexOf(startResultStr) + if (startResultIdx < 0) { + return undefined + } + + const endResultIdx = str.indexOf(endResultStr, startResultIdx + startResultStr.length) + if (endResultIdx < 0) { + return undefined + } + + const installResult = str.substring(startResultIdx + startResultStr.length, endResultIdx) + + const resultMap: { [k: string]: string } = {} + const resultArr = installResult.split(/\r?\n/) + for (const line of resultArr) { + const [key, value] = line.split('==') + resultMap[key] = value + } + + return resultMap +} + +function generateBashInstallScript({ + id, + quality, + version, + commit, + extensionIds, + useSocketPath, + serverApplicationName, + serverDataFolderName, + serverDownloadUrlTemplate, +}: ServerInstallOptions) { + const extensions = extensionIds.map((id) => '--install-extension ' + id).join(' ') + return ` +# Server installation script + +TMP_DIR="\${XDG_RUNTIME_DIR:-"/tmp"}" + +DISTRO_VERSION="${version}" +DISTRO_COMMIT="${commit}" +DISTRO_QUALITY="${quality}" + +SERVER_APP_NAME="${serverApplicationName}" +SERVER_INITIAL_EXTENSIONS="${extensions}" +SERVER_LISTEN_FLAG="${useSocketPath ? `--socket-path="$TMP_DIR/vscode-server-sock-${crypto.randomUUID()}"` : '--port=0'}" +SERVER_DATA_DIR="$HOME/${serverDataFolderName}" +SERVER_DIR="$SERVER_DATA_DIR/bin/$DISTRO_COMMIT" +SERVER_SCRIPT="$SERVER_DIR/bin/$SERVER_APP_NAME" +SERVER_LOGFILE="$SERVER_DATA_DIR/.$DISTRO_COMMIT.log" +SERVER_PIDFILE="$SERVER_DATA_DIR/.$DISTRO_COMMIT.pid" +SERVER_TOKENFILE="$SERVER_DATA_DIR/.$DISTRO_COMMIT.token" +SERVER_ARCH= +SERVER_CONNECTION_TOKEN= +SERVER_DOWNLOAD_URL= + +LISTENING_ON= +OS_RELEASE_ID= +ARCH= +PLATFORM= + +# Mimic output from logs of remote-ssh extension +print_install_results_and_exit() { + echo "${id}: start" + echo "exitCode==$1==" + echo "listeningOn==$LISTENING_ON==" + echo "connectionToken==$SERVER_CONNECTION_TOKEN==" + echo "logFile==$SERVER_LOGFILE==" + echo "osReleaseId==$OS_RELEASE_ID==" + echo "arch==$ARCH==" + echo "platform==$PLATFORM==" + echo "tmpDir==$TMP_DIR==" + echo "${id}: end" + exit 0 +} + +# Check if platform is supported +KERNEL="$(uname -s)" +case $KERNEL in + Darwin) + PLATFORM="darwin" + ;; + Linux) + PLATFORM="linux" + ;; + FreeBSD) + PLATFORM="freebsd" + ;; + DragonFly) + PLATFORM="dragonfly" + ;; + *) + echo "Error platform not supported: $KERNEL" + print_install_results_and_exit 1 + ;; +esac + +# Check machine architecture +ARCH="$(uname -m)" +case $ARCH in + x86_64 | amd64) + SERVER_ARCH="x64" + ;; + armv7l | armv8l) + SERVER_ARCH="armhf" + ;; + arm64 | aarch64) + SERVER_ARCH="arm64" + ;; + ppc64le) + SERVER_ARCH="ppc64le" + ;; + riscv64) + SERVER_ARCH="riscv64" + ;; + loongarch64) + SERVER_ARCH="loong64" + ;; + s390x) + SERVER_ARCH="s390x" + ;; + *) + echo "Error architecture not supported: $ARCH" + print_install_results_and_exit 1 + ;; +esac + +# https://www.freedesktop.org/software/systemd/man/os-release.html +OS_RELEASE_ID="$(grep -i '^ID=' /etc/os-release 2>/dev/null | sed 's/^ID=//gi' | sed 's/"//g')" +if [[ -z $OS_RELEASE_ID ]]; then + OS_RELEASE_ID="$(grep -i '^ID=' /usr/lib/os-release 2>/dev/null | sed 's/^ID=//gi' | sed 's/"//g')" + if [[ -z $OS_RELEASE_ID ]]; then + OS_RELEASE_ID="unknown" + fi +fi + +# Create installation folder +if [[ ! -d $SERVER_DIR ]]; then + mkdir -p $SERVER_DIR + if (( $? > 0 )); then + echo "Error creating server install directory" + print_install_results_and_exit 1 + fi +fi + +# adjust platform for vscodium download, if needed +if [[ $OS_RELEASE_ID = alpine ]]; then + PLATFORM=$OS_RELEASE_ID +fi + +SERVER_DOWNLOAD_URL="$(echo "${serverDownloadUrlTemplate.replace(/\$\{/g, '\\${')}" | sed "s/\\\${quality}/$DISTRO_QUALITY/g" | sed "s/\\\${version}/$DISTRO_VERSION/g" | sed "s/\\\${commit}/$DISTRO_COMMIT/g" | sed "s/\\\${os}/$PLATFORM/g" | sed "s/\\\${arch}/$SERVER_ARCH/g")" + +# Check if server script is already installed +if [[ ! -f $SERVER_SCRIPT ]]; then + case "$PLATFORM" in + darwin | linux | alpine ) + ;; + *) + echo "Error '$PLATFORM' needs manual installation of remote extension host" + print_install_results_and_exit 1 + ;; + esac + + pushd $SERVER_DIR > /dev/null + + if [[ ! -z $(which wget) ]]; then + wget --tries=3 --timeout=10 --continue --no-verbose -O vscode-server.tar.gz $SERVER_DOWNLOAD_URL + elif [[ ! -z $(which curl) ]]; then + curl --retry 3 --connect-timeout 10 --location --show-error --silent --output vscode-server.tar.gz $SERVER_DOWNLOAD_URL + else + echo "Error no tool to download server binary" + print_install_results_and_exit 1 + fi + + if (( $? > 0 )); then + echo "Error downloading server from $SERVER_DOWNLOAD_URL" + print_install_results_and_exit 1 + fi + + tar -xf vscode-server.tar.gz --strip-components 1 + if (( $? > 0 )); then + echo "Error while extracting server contents" + print_install_results_and_exit 1 + fi + + if [[ ! -f $SERVER_SCRIPT ]]; then + echo "Error server contents are corrupted" + print_install_results_and_exit 1 + fi + + rm -f vscode-server.tar.gz + + popd > /dev/null +else + echo "Server script already installed in $SERVER_SCRIPT" +fi + +# Try to find if server is already running +if [[ -f $SERVER_PIDFILE ]]; then + SERVER_PID="$(cat $SERVER_PIDFILE)" + SERVER_RUNNING_PROCESS="$(ps -o pid,args -p $SERVER_PID | grep $SERVER_SCRIPT)" +else + SERVER_RUNNING_PROCESS="$(ps -o pid,args -A | grep $SERVER_SCRIPT | grep -v grep)" +fi + +if [[ -z $SERVER_RUNNING_PROCESS ]]; then + if [[ -f $SERVER_LOGFILE ]]; then + rm $SERVER_LOGFILE + fi + if [[ -f $SERVER_TOKENFILE ]]; then + rm $SERVER_TOKENFILE + fi + + touch $SERVER_TOKENFILE + chmod 600 $SERVER_TOKENFILE + SERVER_CONNECTION_TOKEN="${crypto.randomUUID()}" + echo $SERVER_CONNECTION_TOKEN > $SERVER_TOKENFILE + + $SERVER_SCRIPT --start-server --host=127.0.0.1 $SERVER_LISTEN_FLAG $SERVER_INITIAL_EXTENSIONS --connection-token-file $SERVER_TOKENFILE --telemetry-level off --enable-remote-auto-shutdown --accept-server-license-terms &> $SERVER_LOGFILE & + echo $! > $SERVER_PIDFILE +else + echo "Server script is already running $SERVER_SCRIPT" +fi + +if [[ -f $SERVER_TOKENFILE ]]; then + SERVER_CONNECTION_TOKEN="$(cat $SERVER_TOKENFILE)" +else + echo "Error server token file not found $SERVER_TOKENFILE" + print_install_results_and_exit 1 +fi + +if [[ -f $SERVER_LOGFILE ]]; then + MAX_ATTEMPTS=60 + SLEEP_INTERVAL_SECONDS=0.5 + START_TIME=$(date +%s) + for i in $(seq 1 $MAX_ATTEMPTS); do + LISTENING_ON="$(cat $SERVER_LOGFILE | grep -E 'Extension host agent listening on .+' | sed 's/Extension host agent listening on //')" + if [[ -n $LISTENING_ON ]]; then + END_TIME=$(date +%s) + STARTUP_TIME=$((END_TIME - START_TIME)) + echo "Server started successfully in $STARTUP_TIME seconds (attempt $i/$MAX_ATTEMPTS)" + break + fi + sleep $SLEEP_INTERVAL_SECONDS + done + + if [[ -z $LISTENING_ON ]]; then + END_TIME=$(date +%s) + STARTUP_TIME=$((END_TIME - START_TIME)) + echo "Error server did not start successfully after $STARTUP_TIME seconds ($MAX_ATTEMPTS attempts)" + print_install_results_and_exit 1 + fi +else + echo "Error server log file not found $SERVER_LOGFILE" + print_install_results_and_exit 1 +fi + +# Finish server setup +print_install_results_and_exit 0 +` +} diff --git a/packages/sagemaker-ssh-kiro/src/sshConnection.ts b/packages/sagemaker-ssh-kiro/src/sshConnection.ts new file mode 100644 index 00000000000..2f19ee4b8f3 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/src/sshConnection.ts @@ -0,0 +1,349 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code copied from the following places: + * - https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + * - https://github.com/sanketbajoria/ssh2-promise + * Original copyright: Copyright (c) 2015 Sanket Bajoria + * Originally released under MIT license + */ + +import { EventEmitter } from 'events' +import * as net from 'net' +import { Server } from 'net' +import { Client, ClientChannel, ClientErrorExtensions, ConnectConfig, ShellOptions } from 'ssh2' +import { withTimeout } from './common/promiseUtils' + +export interface SSHConnectConfig extends ConnectConfig { + /** Optional Unique ID attached to ssh connection. */ + uniqueId?: string + /** Automatic retry to connect, after disconnect. Default true */ + reconnect?: boolean + /** Number of reconnect retry, after disconnect. Default 10 */ + reconnectTries?: number + /** Delay after which reconnect should be done. Default 5000ms */ + reconnectDelay?: number +} + +export interface SSHTunnelConfig { + /** Remote Address to connect */ + remoteAddr?: string + /** Local port to bind to. By default, it will bind to a random port, if not passed */ + localPort?: number + /** Remote Port to connect */ + remotePort?: number + /** Remote socket path to connect */ + remoteSocketPath?: string + /** Unique name */ + name?: string +} + +const defaultOptions: Partial = { + reconnect: false, + port: 22, + reconnectTries: 3, + reconnectDelay: 5000, +} + +const SSHConstants = { + CHANNEL: { + SSH: 'ssh', + TUNNEL: 'tunnel', + X11: 'x11', + }, + STATUS: { + BEFORECONNECT: 'beforeconnect', + CONNECT: 'connect', + BEFOREDISCONNECT: 'beforedisconnect', + DISCONNECT: 'disconnect', + }, +} + +interface CommandResult { + stdout: string + stderr: string +} + +/** + * Execute a command over a `shell` channel. This is currently used as a workaround instead of `exec` in order to be + * compatible with SageMaker Spaces. + */ +export async function executeShellCommand( + connection: SSHConnection, + command: string, + env: { [index: string]: string | undefined }, + timeoutSeconds: number +): Promise { + let stream: ClientChannel | undefined = undefined + + try { + // Arbitrary timeout for the shell to be established. + stream = await withTimeout(connection.shell({ env }), 10_000) + } catch (error: unknown) { + throw new Error(`Failed to establish a remote shell: ${error}`) + } + + // Then return a promise for the command execution + const executionPromise = new Promise((resolve, reject) => { + let stdout = '' + let stderr = '' + + stream!.on('close', () => { + resolve({ + stdout: stdout, + stderr: stderr, + }) + }) + stream!.on('error', (error: any) => { + reject(new Error(`Shell stream error: ${error}`)) + }) + stream!.on('data', (data: any) => { + stdout += data.toString() + }) + stream!.stderr.on('data', (data: any) => { + stderr += data.toString() + }) + + // Send command and exit afterward. + // This will lead to the `close` event being emitted after all stdout/stderr data has been received. + stream!.end(`${command}\nexit\n`) + }) + + return withTimeout(executionPromise, timeoutSeconds * 1000) +} + +// This class is mostly unmodified from jeanp413/open-remote-ssh, aside from removing unused features. +export default class SSHConnection extends EventEmitter { + public config: SSHConnectConfig + + private activeTunnels: { [index: string]: SSHTunnelConfig & { server: Server } } = {} + private __$connectPromise?: Promise + private __retries: number = 0 + private __err: (Error & ClientErrorExtensions & { code?: string }) | undefined + private sshConnection?: Client + + constructor(options: SSHConnectConfig) { + super() + this.config = Object.assign({}, defaultOptions, options) + this.config.uniqueId = this.config.uniqueId || `${this.config.username}@${this.config.host}` + } + + /** + * Emit message on this channel + */ + override emit(channel: string, status: string, payload?: any): boolean { + super.emit(channel, status, this, payload) + return super.emit(`${channel}:${status}`, this, payload) + } + + /** + * Get shell socket + */ + shell(options: ShellOptions = {}): Promise { + return this.connect().then(() => { + return new Promise((resolve, reject) => { + this.sshConnection!.shell(options, (err, stream) => (err ? reject(err) : resolve(stream))) + }) + }) + } + + /** + * Forward out + */ + forwardOut(srcIP: string, srcPort: number, destIP: string, destPort: number): Promise { + return this.connect().then(() => { + return new Promise((resolve, reject) => { + this.sshConnection!.forwardOut(srcIP, srcPort, destIP, destPort, (err, stream) => { + if (err) { + return reject(err) + } + resolve(stream) + }) + }) + }) + } + + /** + * Close SSH Connection + */ + close(): Promise { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.BEFOREDISCONNECT) + return this.closeTunnel().then(() => { + if (this.sshConnection) { + this.sshConnection.end() + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.DISCONNECT) + } + }) + } + + /** + * Connect the SSH Connection + */ + connect(c?: SSHConnectConfig): Promise { + this.config = Object.assign(this.config, c) + ++this.__retries + + if (this.__$connectPromise) { + return this.__$connectPromise + } + + this.__$connectPromise = new Promise((resolve, reject) => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.BEFORECONNECT) + if ( + !this.config || + typeof this.config === 'function' || + !(this.config.host || this.config.sock) || + !this.config.username + ) { + reject(`Invalid SSH connection configuration host/username can't be empty`) + this.__$connectPromise = undefined + return + } + + // Start ssh server connection + this.sshConnection = new Client() + this.sshConnection + .on('ready', () => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.CONNECT) + this.__retries = 0 + this.__err = undefined + resolve(this) + }) + .on('error', (err) => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.DISCONNECT, { err: err }) + this.__err = err + }) + .on('close', () => { + this.emit(SSHConstants.CHANNEL.SSH, SSHConstants.STATUS.DISCONNECT, { err: this.__err }) + if ( + this.config.reconnect && + this.__retries <= this.config.reconnectTries! && + this.__err && + this.__err.level !== 'client-authentication' && + this.__err.code !== 'ENOTFOUND' + ) { + setTimeout(() => { + this.__$connectPromise = undefined + resolve(this.connect()) + }, this.config.reconnectDelay) + } else { + reject(this.__err) + } + }) + .connect(this.config) + }) + return this.__$connectPromise + } + + /** + * Get existing tunnel by name + */ + getTunnel(name: string) { + return this.activeTunnels[name] + } + + /** + * Add new tunnel if not exist + */ + addTunnel(SSHTunnelConfig: SSHTunnelConfig): Promise { + SSHTunnelConfig.name = + SSHTunnelConfig.name || + `${SSHTunnelConfig.remoteAddr}@${SSHTunnelConfig.remotePort || SSHTunnelConfig.remoteSocketPath}` + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.BEFORECONNECT, { SSHTunnelConfig: SSHTunnelConfig }) + if (this.getTunnel(SSHTunnelConfig.name)) { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.CONNECT, { SSHTunnelConfig: SSHTunnelConfig }) + return Promise.resolve(this.getTunnel(SSHTunnelConfig.name)) + } else { + return new Promise((resolve, reject) => { + const server: net.Server = net.createServer().on('connection', (socket) => { + void this.connect().then(() => { + if (SSHTunnelConfig.remotePort) { + this.sshConnection!.forwardOut( + '127.0.0.1', + 0, + SSHTunnelConfig.remoteAddr!, + SSHTunnelConfig.remotePort!, + (err, stream) => { + if (err) { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + err: err, + }) + return + } + stream.pipe(socket) + socket.pipe(stream) + } + ) + } else { + this.sshConnection!.openssh_forwardOutStreamLocal( + SSHTunnelConfig.remoteSocketPath!, + (err, stream) => { + if (err) { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + err: err, + }) + return + } + stream.pipe(socket) + socket.pipe(stream) + } + ) + } + }) + }) + + SSHTunnelConfig.localPort = SSHTunnelConfig.localPort || 0 + server + .on('listening', () => { + SSHTunnelConfig.localPort = (server.address() as net.AddressInfo).port + this.activeTunnels[SSHTunnelConfig.name!] = Object.assign({}, { server }, SSHTunnelConfig) + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.CONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + }) + resolve(this.activeTunnels[SSHTunnelConfig.name!]) + }) + .on('error', (err: any) => { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: SSHTunnelConfig, + err: err, + }) + server.close() + reject(err) + delete this.activeTunnels[SSHTunnelConfig.name!] + }) + .listen(SSHTunnelConfig.localPort) + }) + } + } + + /** + * Close the tunnel + */ + closeTunnel(name?: string): Promise { + if (name && this.activeTunnels[name]) { + return new Promise((resolve) => { + const tunnel = this.activeTunnels[name] + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.BEFOREDISCONNECT, { + SSHTunnelConfig: tunnel, + }) + tunnel.server.close(() => { + this.emit(SSHConstants.CHANNEL.TUNNEL, SSHConstants.STATUS.DISCONNECT, { + SSHTunnelConfig: this.activeTunnels[name], + }) + delete this.activeTunnels[name] + resolve() + }) + }) + } else if (!name) { + const tunnels = Object.keys(this.activeTunnels).map((key) => this.closeTunnel(key)) + return Promise.all(tunnels).then(() => {}) + } + + return Promise.resolve() + } +} diff --git a/packages/sagemaker-ssh-kiro/tsconfig.json b/packages/sagemaker-ssh-kiro/tsconfig.json new file mode 100644 index 00000000000..03e625ae957 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.packages.json", + "compilerOptions": { + "outDir": "dist", + "baseUrl": ".", + "rootDir": ".", + "skipLibCheck": true + }, + "exclude": ["node_modules", ".vscode-test", "dist"], + "noEmitOnError": false // allow emitting even with type errors +} diff --git a/packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts b/packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts new file mode 100644 index 00000000000..5df4f6fc1c5 --- /dev/null +++ b/packages/sagemaker-ssh-kiro/vscode.proposed.resolvers.d.ts @@ -0,0 +1,475 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + //resolvers: @alexdima + + export interface MessageOptions { + /** + * Do not render a native message box. + */ + useCustom?: boolean; + } + + export interface RemoteAuthorityResolverContext { + resolveAttempt: number; + /** + * Exec server from a recursively-resolved remote authority. If the + * remote authority includes nested authorities delimited by `@`, it is + * resolved from outer to inner authorities with ExecServer passed down + * to each resolver in the chain. + */ + execServer?: ExecServer; + } + + export class ResolvedAuthority { + readonly host: string; + readonly port: number; + readonly connectionToken: string | undefined; + + constructor(host: string, port: number, connectionToken?: string); + } + + export interface ManagedMessagePassing { + onDidReceiveMessage: Event; + onDidClose: Event; + onDidEnd: Event; + + send: (data: Uint8Array) => void; + end: () => void; + drain?: () => Thenable; + } + + export class ManagedResolvedAuthority { + readonly makeConnection: () => Thenable; + readonly connectionToken: string | undefined; + + constructor(makeConnection: () => Thenable, connectionToken?: string); + } + + export interface ResolvedOptions { + extensionHostEnv?: { [key: string]: string | null }; + + isTrusted?: boolean; + + /** + * When provided, remote server will be initialized with the extensions synced using the given user account. + */ + authenticationSessionForInitializingExtensions?: AuthenticationSession & { providerId: string }; + } + + export interface TunnelPrivacy { + themeIcon: string; + id: string; + label: string; + } + + export namespace env { + /** Quality of the application. May be undefined if running from sources. */ + export const appQuality: string | undefined; + /** Commit of the application. May be undefined if running from sources. */ + export const appCommit: string | undefined; + } + + export interface TunnelOptions { + remoteAddress: { port: number; host: string }; + // The desired local port. If this port can't be used, then another will be chosen. + localAddressPort?: number; + label?: string; + /** + * @deprecated Use privacy instead + */ + public?: boolean; + privacy?: string; + protocol?: string; + } + + export interface TunnelDescription { + remoteAddress: { port: number; host: string }; + //The complete local address(ex. localhost:1234) + localAddress: { port: number; host: string } | string; + /** + * @deprecated Use privacy instead + */ + public?: boolean; + privacy?: string; + // If protocol is not provided it is assumed to be http, regardless of the localAddress. + protocol?: string; + } + + export interface Tunnel extends TunnelDescription { + // Implementers of Tunnel should fire onDidDispose when dispose is called. + onDidDispose: Event; + dispose(): void | Thenable; + } + + /** + * Used as part of the ResolverResult if the extension has any candidate, + * published, or forwarded ports. + */ + export interface TunnelInformation { + /** + * Tunnels that are detected by the extension. The remotePort is used for display purposes. + * The localAddress should be the complete local address (ex. localhost:1234) for connecting to the port. Tunnels provided through + * detected are read-only from the forwarded ports UI. + */ + environmentTunnels?: TunnelDescription[]; + + tunnelFeatures?: { + elevation: boolean; + /** + * One of the options must have the ID "private". + */ + privacyOptions: TunnelPrivacy[]; + /** + * Defaults to true for backwards compatibility. + */ + protocol?: boolean; + }; + } + + export interface TunnelCreationOptions { + /** + * True when the local operating system will require elevation to use the requested local port. + */ + elevationRequired?: boolean; + } + + export enum CandidatePortSource { + None = 0, + Process = 1, + Output = 2, + Hybrid = 3 + } + + export type ResolverResult = (ResolvedAuthority | ManagedResolvedAuthority) & ResolvedOptions & TunnelInformation; + + export class RemoteAuthorityResolverError extends Error { + static NotAvailable(message?: string, handled?: boolean): RemoteAuthorityResolverError; + static TemporarilyNotAvailable(message?: string): RemoteAuthorityResolverError; + + constructor(message?: string); + } + + /** + * An ExecServer allows spawning processes on a remote machine. An ExecServer is provided by resolvers. It can be + * acquired by `workspace.getRemoteExecServer` or from the context when in a resolver (`RemoteAuthorityResolverContext.execServer`). + */ + export interface ExecServer { + /** + * Spawns a given subprocess with the given command and arguments. + * @param command The command to execute. + * @param args The arguments to pass to the command. + * @param options Additional options for the spawned process. + * @returns A promise that gives access to the process' stdin, stdout and stderr streams, as well as the process' exit code. + */ + spawn(command: string, args: string[], options?: ExecServerSpawnOptions): Thenable; + + /** + * Spawns an connector that allows to start a remote server. It is assumed the command starts a Code CLI. Additional + * arguments will be passed to the connector. + * @param command The command to execute. It is assumed the command spawns a Code CLI executable. + * @param args The arguments to pass to the connector + * @param options Additional options for the spawned process. + * @returns A promise that gives access to the spawned {@link RemoteServerConnector}. It also provides a stream to which standard + * log messages are written. + */ + spawnRemoteServerConnector?(command: string, args: string[], options?: ExecServerSpawnOptions): Thenable; + + /** + * Downloads the CLI executable of the desired platform and quality and pipes it to the + * provided process' stdin. + * @param buildTarget The CLI build target to download. + * @param command The command to execute. The downloaded bits will be piped to the command's stdin. + * @param args The arguments to pass to the command. + * @param options Additional options for the spawned process. + * @returns A promise that resolves when the process exits with a {@link ProcessExit} object. + */ + downloadCliExecutable?(buildTarget: CliBuild, command: string, args: string[], options?: ExecServerSpawnOptions): Thenable; + + /** + * Gets the environment where the exec server is running. + * @returns A promise that resolves to an {@link ExecEnvironment} object. + */ + env(): Thenable; + + /** + * Kills a process with the given ID. + * + * @param processId process ID to kill. + */ + kill(processId: number): Thenable; + + /** + * Connects to the given TCP host/port on the remote. + * + * @param host The hostname or IP to connect to + * @param port The port number to connect to + * @returns a duplex stream, and a promise the resolves when both sides + * have closed. + */ + tcpConnect( + host: string, + port: number, + ): Thenable<{ stream: WriteStream & ReadStream; done: Thenable }>; + + /** + * Access to the file system of the remote. + */ + readonly fs: RemoteFileSystem; + } + + export type ProcessEnv = Record; + + export interface ExecServerSpawnOptions { + readonly env?: ProcessEnv; + readonly cwd?: string; + } + + export interface SpawnedCommand { + readonly stdin: WriteStream; + readonly stdout: ReadStream; + readonly stderr: ReadStream; + readonly onExit: Thenable; + } + + export interface RemoteServerConnector { + readonly logs: ReadStream; + readonly onExit: Thenable; + /** + * Connect to a new code server, returning a stream that can be used to communicate with it. + * @param params The parameters for the code server. + * @returns A promise that resolves to a {@link ManagedMessagePassing} object that can be used with a resolver + */ + connect(params: ServeParams): Thenable; + } + + export interface ProcessExit { + readonly status: number; + readonly message?: string; + } + + export interface ReadStream { + readonly onDidReceiveMessage: Event; + readonly onEnd: Thenable; + } + + export interface WriteStream { + write(data: Uint8Array): void; + end(): void; + } + + export interface ServeParams { + readonly socketId: number; + readonly commit?: string; + readonly quality: string; + readonly extensions: string[]; + /** Whether server traffic should be compressed. */ + readonly compress?: boolean; + /** Optional explicit connection token for the server. */ + readonly connectionToken?: string; + } + + export interface CliBuild { + readonly quality: string; + /** 'LinuxAlpineX64' | 'LinuxAlpineARM64', 'LinuxX64' | 'LinuxARM64' | 'LinuxARM32' | 'DarwinX64' | 'DarwinARM64' | 'WindowsX64' | 'WindowsX86' | 'WindowsARM64' */ + readonly buildTarget: string; + readonly commit: string; + } + + export interface ExecEnvironment { + readonly env: ProcessEnv; + /** 'darwin' | 'linux' | 'win32' */ + readonly osPlatform: string; + /** uname.version or windows version number, undefined if it could not be read. */ + readonly osRelease?: string; + } + + export interface RemoteFileSystem { + /** + * Retrieve metadata about a file. + * + * @param path The path of the file to retrieve metadata about. + * @returns The file metadata about the file. + * @throws an exception when `path` doesn't exist. + */ + stat(path: string): Thenable; + + /** + * Recursively creates the given directory on the remote. + * + * @param path The path of the folder to create + * @throws an exception when `path` is a file, or other i/o operations happen + */ + mkdirp(path: string): Thenable; + + /** + * Recursively deletes the given path on the remote. + * + * @param path The path of the file or folder to delete. + * @throws if an i/o error happens during removal. It does not throw if + * the path already does not exist. + */ + rm(path: string): Thenable; + + /** + * Reads the given file from the remote. + * + * @param path The path of the file to read. + * @throws if the path doesn't exist or can't be accessed + * @returns a readable stream of the file data + */ + read(path: string): Thenable; + + /** + * Writes the given file on the remote. Truncates the file if it exists. + * + * @param path The path of the file to write. + * @throws if the path can't be accessed + * @returns a writable `stream` that accepts data, and a `done` promise that + * will resolve after `stream.end()` is called once the write is complete. + */ + write(path: string): Thenable<{ stream: WriteStream; done: Thenable }>; + + /** + * Connects to the given unix socket or named pipe on the remote. + * + * @param path The path of the unix socket or named pipe + * @throws if the path can't be accessed + * @returns a duplex stream, and a promise the resolves when both sides + * have closed. + */ + connect(path: string): Thenable<{ stream: WriteStream & ReadStream; done: Thenable }>; + + /** + * Renames the file. + * + * @param fromPath The existing file path. + * @param toPath The new file path. + * @throws if the original path doesn't exist, or the toPath can't be accessed + */ + rename(fromPath: string, toPath: string): Thenable; + + /** + * Reads the contents of a directory. + * + * @param path The path of the folder to read. + * @throws if the folder doesn't exist + * @returns a list of directory entries + */ + readdir(path: string): Thenable; + } + + export interface DirectoryEntry { + /** + * The type of the file, e.g. is a regular file, a directory, or symbolic link + * to a file. + * + * *Note:* This value might be a bitmask, e.g. `FileType.File | FileType.SymbolicLink`. + */ + type: FileType; + + /** + * Non-absolute name of the file in the directory. + */ + name: string; + } + + export interface RemoteAuthorityResolver { + /** + * Resolve the authority part of the current opened `vscode-remote://` URI. + * + * This method will be invoked once during the startup of the editor and again each time + * the editor detects a disconnection. + * + * @param authority The authority part of the current opened `vscode-remote://` URI. + * @param context A context indicating if this is the first call or a subsequent call. + */ + resolve(authority: string, context: RemoteAuthorityResolverContext): ResolverResult | Thenable; + + /** + * Resolves an exec server interface for the authority. Called if an + * authority is a midpoint in a transit to the desired remote. + * + * @param authority The authority part of the current opened `vscode-remote://` URI. + * @returns The exec server interface, as defined in a contract between extensions. + */ + resolveExecServer?(remoteAuthority: string, context: RemoteAuthorityResolverContext): ExecServer | Thenable; + + /** + * Get the canonical URI (if applicable) for a `vscode-remote://` URI. + * + * @returns The canonical URI or undefined if the uri is already canonical. + */ + getCanonicalURI?(uri: Uri): ProviderResult; + + /** + * Can be optionally implemented if the extension can forward ports better than the core. + * When not implemented, the core will use its default forwarding logic. + * When implemented, the core will use this to forward ports. + * + * To enable the "Change Local Port" action on forwarded ports, make sure to set the `localAddress` of + * the returned `Tunnel` to a `{ port: number, host: string; }` and not a string. + */ + tunnelFactory?: (tunnelOptions: TunnelOptions, tunnelCreationOptions: TunnelCreationOptions) => Thenable | undefined; + + /**p + * Provides filtering for candidate ports. + */ + showCandidatePort?: (host: string, port: number, detail: string) => Thenable; + + /** + * @deprecated Return tunnelFeatures as part of the resolver result in tunnelInformation. + */ + tunnelFeatures?: { + elevation: boolean; + public: boolean; + privacyOptions: TunnelPrivacy[]; + }; + + candidatePortSource?: CandidatePortSource; + } + + export interface ResourceLabelFormatter { + scheme: string; + authority?: string; + formatting: ResourceLabelFormatting; + } + + export interface ResourceLabelFormatting { + label: string; // myLabel:/${path} + // For historic reasons we use an or string here. Once we finalize this API we should start using enums instead and adopt it in extensions. + // eslint-disable-next-line local/vscode-dts-literal-or-types, local/vscode-dts-string-type-literals + separator: '/' | '\\' | ''; + tildify?: boolean; + normalizeDriveLetter?: boolean; + workspaceSuffix?: string; + workspaceTooltip?: string; + authorityPrefix?: string; + stripPathStartingSeparator?: boolean; + } + + export namespace workspace { + export function registerRemoteAuthorityResolver(authorityPrefix: string, resolver: RemoteAuthorityResolver): Disposable; + export function registerResourceLabelFormatter(formatter: ResourceLabelFormatter): Disposable; + export function getRemoteExecServer(authority: string): Thenable; + } + + export namespace env { + + /** + * The authority part of the current opened `vscode-remote://` URI. + * Defined by extensions, e.g. `ssh-remote+${host}` for remotes using a secure shell. + * + * *Note* that the value is `undefined` when there is no remote extension host but that the + * value is defined in all extension hosts (local and remote) in case a remote extension host + * exists. Use {@link Extension.extensionKind} to know if + * a specific extension runs remote or not. + */ + export const remoteAuthority: string | undefined; + + } +} diff --git a/packages/sagemaker-ssh-kiro/webpack.config.js b/packages/sagemaker-ssh-kiro/webpack.config.js new file mode 100644 index 00000000000..20d14ffc63f --- /dev/null +++ b/packages/sagemaker-ssh-kiro/webpack.config.js @@ -0,0 +1,40 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + * + * This file contains code originally from https://github.com/jeanp413/open-remote-ssh + * Original copyright: (c) 2022 + * Originally released under MIT license + */ + +'use strict' + +const baseConfigFactory = require('../webpack.base.config') +const webpack = require('webpack') + +module.exports = (env, argv) => { + const baseConfig = baseConfigFactory(env, argv) + + const config = { + ...baseConfig, + entry: { + extension: './src/extension.ts', + }, + externals: { + ...baseConfig.externals, + bufferutil: 'bufferutil', + 'utf-8-validate': 'utf-8-validate', + }, + plugins: [ + ...(baseConfig.plugins || []), + new webpack.IgnorePlugin({ + resourceRegExp: /crypto\/build\/Release\/sshcrypto\.node$/, + }), + new webpack.IgnorePlugin({ + resourceRegExp: /cpu-features/, + }), + ], + } + + return config +} diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index a1c37e48971..feb4d32a98d 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -57,7 +57,7 @@ }, "scripts": { "vscode:prepublish": "npm run clean && npm run buildScripts && webpack --mode production", - "buildScripts": "npm run generateNonCodeFiles && npm run copyFiles && npm run generateIcons && npm run generateSettings && npm run generateConfigurationAttributes && tsc -p ./ --noEmit", + "buildScripts": "npm run build:sagemaker-ssh-kiro && npm run generateNonCodeFiles && npm run copyFiles && npm run generateIcons && npm run generateSettings && npm run generateConfigurationAttributes && tsc -p ./ --noEmit", "generateConfigurationAttributes": "ts-node ./scripts/build/generateConfigurationAttributes.ts", "generateNonCodeFiles": "ts-node ../../scripts/generateNonCodeFiles.ts", "copyFiles": "ts-node ./scripts/build/copyFiles.ts", @@ -73,6 +73,7 @@ "testE2E": "npm run testCompile && c8 --allowExternal ts-node ../core/scripts/test/launchTest.ts e2e dist/test/e2e/index.js ../core/dist/src/testFixtures/workspaceFolder", "testInteg": "npm run testCompile && c8 --allowExternal ts-node ../core/scripts/test/launchTest.ts integration dist/test/integ/index.js ../core/dist/src/testFixtures/workspaceFolder", "package": "ts-node ../../scripts/package.ts", + "build:sagemaker-ssh-kiro": "npm run package -w sagemaker-ssh-kiro", "lint": "true", "createRelease": "ts-node ../../scripts/createRelease.ts", "newChange": "ts-node ../../scripts/newChange.ts", diff --git a/packages/toolkit/scripts/build/copyFiles.ts b/packages/toolkit/scripts/build/copyFiles.ts index 782c16ddb50..63bc9b901ad 100644 --- a/packages/toolkit/scripts/build/copyFiles.ts +++ b/packages/toolkit/scripts/build/copyFiles.ts @@ -129,9 +129,31 @@ function copy(task: CopyTask): void { throw new Error(`Copy "${src}" to "${dst}" failed: ${error instanceof Error ? error.message : error}`) } } + +function copySageMakerSshKiroExtension(): void { + const searchDir = path.resolve(projectRoot, '../../') + const destinationDir = path.resolve(outRoot, '../resources') + + fs.mkdirSync(destinationDir, { recursive: true }) + + const files = fs + .readdirSync(searchDir) + .filter((file) => file.startsWith('sagemaker-ssh-kiro') && file.endsWith('.vsix')) + + if (files.length !== 1) { + throw new Error(`Expected 1 sagemaker-ssh-kiro VSIX file but found ${files.length}`) + } + + const sourceFile = path.join(searchDir, files[0]) + const destinationFile = path.join(destinationDir, files[0]) + + fs.copyFileSync(sourceFile, destinationFile) +} + function main() { try { tasks.map(copy) + copySageMakerSshKiroExtension() } catch (error) { console.error('`copyFiles.ts` failed') console.error(error) From b245ebf35a6f4c35c25da2b42094e7d118c37d95 Mon Sep 17 00:00:00 2001 From: zulil <31738836+liuzulin@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:14:48 -0700 Subject: [PATCH 08/53] feat(smus): Add data explorer support for express domain (#2251) ## Problem Need to update data explorer to support express domain ## Solution 1. Implement federated connection strategy 2. De-couple datazoneClient from smusAuthProvider, so it can accept different credential provider --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Zulin Liu Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> --- .../connectionCredentialsProvider.ts | 13 +- .../projectRoleCredentialsProvider.ts | 4 +- .../providers/smusAuthenticationProvider.ts | 8 +- .../explorer/activation.ts | 2 +- .../nodes/federatedConnectionStrategy.ts | 332 ++++++++++++++++++ .../explorer/nodes/s3Strategy.ts | 101 +++++- .../sageMakerUnifiedStudioComputeNode.ts | 15 +- ...eMakerUnifiedStudioConnectionParentNode.ts | 4 +- .../nodes/sageMakerUnifiedStudioDataNode.ts | 125 +++++-- .../sageMakerUnifiedStudioProjectNode.ts | 14 +- .../nodes/sageMakerUnifiedStudioRootNode.ts | 5 +- .../sageMakerUnifiedStudioSpacesParentNode.ts | 6 +- .../explorer/nodes/types.ts | 22 ++ .../explorer/nodes/utils.ts | 133 ++++++- .../shared/client/datazoneClient.ts | 237 ++++++------- .../shared/client/s3Client.ts | 38 +- .../shared/telemetry.ts | 5 +- .../connectionCredentialsProvider.test.ts | 14 +- .../projectRoleCredentialsProvider.test.ts | 26 +- .../auth/smusAuthenticationProvider.test.ts | 4 +- .../explorer/activation.test.ts | 6 +- .../nodes/federatedConnectionStrategy.test.ts | 185 ++++++++++ .../sageMakerUnifiedStudioComputeNode.test.ts | 19 +- ...rUnifiedStudioConnectionParentNode.test.ts | 28 +- .../sageMakerUnifiedStudioDataNode.test.ts | 18 +- .../sageMakerUnifiedStudioProjectNode.test.ts | 10 +- .../sageMakerUnifiedStudioRootNode.test.ts | 20 +- ...MakerUnifiedStudioSpacesParentNode.test.ts | 13 +- .../shared/client/datazoneClient.test.ts | 98 +++--- 29 files changed, 1248 insertions(+), 257 deletions(-) create mode 100644 packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts index f060e6477ab..f10384f6221 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts @@ -12,6 +12,7 @@ import { DataZoneClient } from '../../shared/client/datazoneClient' import { SmusAuthenticationProvider } from './smusAuthenticationProvider' import { CredentialType } from '../../../shared/telemetry/telemetry' import { SmusCredentialExpiry, validateCredentialFields } from '../../shared/smusUtils' +import { getContext } from '../../../shared/vscode/setContext' /** * Credentials provider for SageMaker Unified Studio Connection credentials @@ -27,7 +28,8 @@ export class ConnectionCredentialsProvider implements CredentialsProvider { constructor( private readonly smusAuthProvider: SmusAuthenticationProvider, - private readonly connectionId: string + private readonly connectionId: string, + private readonly projectId: string ) {} /** @@ -131,7 +133,14 @@ export class ConnectionCredentialsProvider implements CredentialsProvider { ) try { - const datazoneClient = await DataZoneClient.getInstance(this.smusAuthProvider) + if (getContext('aws.smus.isExpressMode') && this.projectId) { + return (await this.smusAuthProvider.getProjectCredentialProvider(this.projectId)).getCredentials() + } + const datazoneClient = DataZoneClient.createWithCredentials( + this.smusAuthProvider.getDomainRegion(), + this.smusAuthProvider.getDomainId(), + await this.smusAuthProvider.getDerCredentialsProvider() + ) const getConnectionResponse = await datazoneClient.getConnection({ domainIdentifier: this.smusAuthProvider.getDomainId(), identifier: this.connectionId, diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts index 5eb42e1fd5f..44e87131214 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts @@ -8,11 +8,11 @@ import { ToolkitError } from '../../../shared/errors' import * as AWS from '@aws-sdk/types' import { CredentialsId, CredentialsProvider, CredentialsProviderType } from '../../../auth/providers/credentials' -import { DataZoneClient } from '../../shared/client/datazoneClient' import { SmusAuthenticationProvider } from './smusAuthenticationProvider' import { CredentialType } from '../../../shared/telemetry/telemetry' import { SmusCredentialExpiry, validateCredentialFields } from '../../shared/smusUtils' import { loadMappings, saveMappings } from '../../../awsService/sagemaker/credentialMapping' +import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' /** * Credentials provider for SageMaker Unified Studio Project Role credentials @@ -123,7 +123,7 @@ export class ProjectRoleCredentialsProvider implements CredentialsProvider { this.logger.debug(`SMUS Project: Fetching project credentials from API for project ${this.projectId}`) try { - const dataZoneClient = await DataZoneClient.getInstance(this.smusAuthProvider) + const dataZoneClient = await createDZClientBaseOnDomainMode(this.smusAuthProvider) const response = await dataZoneClient.getProjectDefaultEnvironmentCreds(this.projectId) this.logger.debug( diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index 2fa53a44bd4..eb95303d3b0 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -36,8 +36,9 @@ import globals from '../../../shared/extensionGlobals' import { fromIni } from '@aws-sdk/credential-providers' import { randomUUID } from '../../../shared/crypto' import { DefaultStsClient } from '../../../shared/clients/stsClient' -import { DataZoneClient } from '../../shared/client/datazoneClient' import { DataZoneDomainPreferencesClient } from '../../shared/client/datazoneDomainPreferencesClient' +import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' +import { DataZoneClient } from '../../shared/client/datazoneClient' /** * Sets the context variable for SageMaker Unified Studio connection state @@ -779,7 +780,7 @@ export class SmusAuthenticationProvider { logger.debug('SMUS: Creating new connection provider') // Create a new connection provider and cache it - const connectionProvider = new ConnectionCredentialsProvider(this, connectionId) + const connectionProvider = new ConnectionCredentialsProvider(this, connectionId, projectId) this.connectionCredentialProvidersCache.set(cacheKey, connectionProvider) logger.debug('SMUS: Cached new connection provider') @@ -943,7 +944,7 @@ export class SmusAuthenticationProvider { const projectCreds = await projectCredProvider.getCredentials() // Get project region from tooling environment - const dzClient = await DataZoneClient.getInstance(this) + const dzClient = await createDZClientBaseOnDomainMode(this) const toolingEnv = await dzClient.getToolingEnvironment(projectId) const projectRegion = toolingEnv.awsAccountRegion @@ -1152,6 +1153,7 @@ export class SmusAuthenticationProvider { // Clear cached project account IDs this.cachedProjectAccountIds.clear() + DataZoneClient.dispose() DataZoneDomainPreferencesClient.dispose() this.logger.debug('SMUS Auth: Successfully disposed authentication provider') diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts index 243a6b53a01..f3edd5be90e 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts @@ -12,7 +12,6 @@ import { SageMakerUnifiedStudioRootNode, selectSMUSProject, } from './nodes/sageMakerUnifiedStudioRootNode' -import { DataZoneClient } from '../shared/client/datazoneClient' import { openRemoteConnect, stopSpace } from '../../awsService/sagemaker/commands' import { SagemakerUnifiedStudioSpaceNode } from './nodes/sageMakerUnifiedStudioSpaceNode' import { SageMakerUnifiedStudioProjectNode } from './nodes/sageMakerUnifiedStudioProjectNode' @@ -22,6 +21,7 @@ import { setupUserActivityMonitoring } from '../../awsService/sagemaker/sagemake import { telemetry } from '../../shared/telemetry/telemetry' import { isSageMaker } from '../../shared/extensionUtilities' import { recordSpaceTelemetry } from '../shared/telemetry' +import { DataZoneClient } from '../shared/client/datazoneClient' export async function activate(extensionContext: vscode.ExtensionContext): Promise { // Initialize the SMUS authentication provider diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts new file mode 100644 index 00000000000..a42957cdf75 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts @@ -0,0 +1,332 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' +import { getLogger } from '../../../shared/logger/logger' +import { DataZoneConnection } from '../../shared/client/datazoneClient' +import { GlueClient, ListEntitiesCommand, DescribeEntityCommand, Entity, Field } from '@aws-sdk/client-glue' +import { ConnectionCredentialsProvider } from '../../auth/providers/connectionCredentialsProvider' +import { getIcon } from '../../../shared/icons' +import { createPlaceholderItem } from '../../../shared/treeview/utils' +import { createErrorItem, createColumnTreeItem } from './utils' +import { NO_DATA_FOUND_MESSAGE, NodeType } from './types' + +/** + * Creates a federated connection node + */ +export async function createFederatedConnectionNode( + connection: DataZoneConnection, + connectionCredentialsProvider: ConnectionCredentialsProvider, + region: string +): Promise { + const logger = getLogger() + + // Check for error message in glue properties + // Create error node directly in this case + const connectionError = connection.props?.glueProperties?.errorMessage + if (connectionError) { + return createErrorItem(connectionError, 'glue-error', connection.connectionId) + } + + return { + id: `federated-${connection.connectionId}`, + resource: connection, + getTreeItem: () => { + const item = new vscode.TreeItem(connection.name, vscode.TreeItemCollapsibleState.Collapsed) + item.contextValue = 'federatedConnection' + item.iconPath = getIcon('aws-sagemakerunifiedstudio-catalog') + item.tooltip = `Federated Connection: ${connection.name}` + return item + }, + getChildren: async () => { + try { + return await getFederatedEntities(connection, connectionCredentialsProvider, region) + } catch (err) { + logger.error(`Failed to get federated entities: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [ + createErrorItem(`Failed to load entities - ${errorMessage}`, 'entities', connection.connectionId), + ] + } + }, + getParent: () => undefined, + } +} + +/** + * Gets federated entities from Glue API + */ +async function getFederatedEntities( + connection: DataZoneConnection, + connectionCredentialsProvider: ConnectionCredentialsProvider, + region: string +): Promise { + const awsCredentialProvider = async () => { + const credentials = await connectionCredentialsProvider.getCredentials() + return { + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + sessionToken: credentials.sessionToken, + expiration: credentials.expiration, + } + } + const glueClient = new GlueClient({ + region: region, + credentials: awsCredentialProvider, + }) + + const glueConnectionName = connection?.glueConnectionName + if (!glueConnectionName) { + return [createErrorItem('No Glue connection name found', 'glue-connection', connection.connectionId)] + } + + const allEntities: Entity[] = [] + let nextToken: string | undefined + + do { + const response = await glueClient.send( + new ListEntitiesCommand({ + ConnectionName: glueConnectionName, + NextToken: nextToken, + }) + ) + + if (response.Entities) { + allEntities.push(...response.Entities) + } + nextToken = response.NextToken + } while (nextToken) + + if (allEntities.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE)] + } + + const entityNodes: TreeNode[] = [] + const tableNodes: TreeNode[] = [] + + for (const entity of allEntities) { + const nodeType = getGlueNodeType(entity.Category) + const isTable = nodeType === NodeType.GLUE_TABLE + + const entityNode = createGlueEntityNode(entity, connection, glueClient, glueConnectionName) + + if (isTable) { + tableNodes.push(entityNode) + } else { + entityNodes.push(entityNode) + } + } + + // Always group tables under a "Tables" container + if (tableNodes.length > 0) { + const tablesContainer = createTablesContainer(tableNodes, connection.connectionId) + return [...entityNodes, tablesContainer] + } + + return entityNodes +} + +/** + * Creates a Glue entity node + */ +function createGlueEntityNode( + entity: Entity, + connection: DataZoneConnection, + glueClient: GlueClient, + glueConnectionName: string +): TreeNode { + const logger = getLogger() + const nodeType = getGlueNodeType(entity.Category) + const isTable = nodeType === NodeType.GLUE_TABLE + + return { + id: `${connection.connectionId}-${entity.EntityName}`, + resource: entity, + getTreeItem: () => { + const item = new vscode.TreeItem( + entity.Label || entity.EntityName || 'Unknown', + entity.IsParentEntity || (isTable && !entity.IsParentEntity) + ? vscode.TreeItemCollapsibleState.Collapsed + : vscode.TreeItemCollapsibleState.None + ) + item.contextValue = nodeType + item.iconPath = getGlueEntityIcon(nodeType) + item.tooltip = `${entity.Category}: ${entity.Label || entity.EntityName}` + return item + }, + getChildren: async () => { + try { + if (entity.IsParentEntity) { + return await getChildEntities(entity, connection, glueClient, glueConnectionName) + } else if (isTable) { + return await getTableColumns(entity, glueClient, glueConnectionName) + } + return [] + } catch (err) { + logger.error(`Failed to get children for entity ${entity.EntityName}: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [ + createErrorItem( + `Failed to load children - ${errorMessage}`, + 'entity-children', + entity.EntityName || 'unknown' + ), + ] + } + }, + getParent: () => undefined, + } +} + +/** + * Gets child entities for parent entities + */ +async function getChildEntities( + parentEntity: Entity, + connection: DataZoneConnection, + glueClient: GlueClient, + glueConnectionName: string +): Promise { + const allEntities: Entity[] = [] + let nextToken: string | undefined + + do { + const response = await glueClient.send( + new ListEntitiesCommand({ + ConnectionName: glueConnectionName, + ParentEntityName: parentEntity.EntityName, + NextToken: nextToken, + }) + ) + + if (response.Entities) { + allEntities.push(...response.Entities) + } + nextToken = response.NextToken + } while (nextToken) + + if (allEntities.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE)] + } + + const entityNodes: TreeNode[] = [] + const tableNodes: TreeNode[] = [] + + for (const entity of allEntities) { + const nodeType = getGlueNodeType(entity.Category) + const isTable = nodeType === NodeType.GLUE_TABLE + const entityNode = createGlueEntityNode(entity, connection, glueClient, glueConnectionName) + + if (isTable) { + tableNodes.push(entityNode) + } else { + entityNodes.push(entityNode) + } + } + + // Always group tables under a "Tables" container if there are any + if (tableNodes.length > 0) { + const tablesContainer = createTablesContainer( + tableNodes, + `${connection.connectionId}-${parentEntity.EntityName}` + ) + return [...entityNodes, tablesContainer] + } + + return entityNodes +} + +/** + * Gets table columns using DescribeEntity + */ +async function getTableColumns( + entity: Entity, + glueClient: GlueClient, + glueConnectionName: string +): Promise { + const response = await glueClient.send( + new DescribeEntityCommand({ + ConnectionName: glueConnectionName, + EntityName: entity.EntityName, + }) + ) + + if (!response.Fields || response.Fields.length === 0) { + return [createPlaceholderItem('No columns found')] + } + + return response.Fields.map((field) => createColumnNode(field, entity.EntityName || 'unknown')) +} + +/** + * Creates a column node + */ +function createColumnNode(field: Field, tableName: string): TreeNode { + return { + id: `${tableName}-${field.FieldName}`, + resource: field, + getTreeItem: () => { + return createColumnTreeItem( + field.Label || field.FieldName || 'Unknown', + field.FieldType || 'unknown', + NodeType.REDSHIFT_COLUMN + ) + }, + getChildren: async () => [], + getParent: () => undefined, + } +} + +/** + * Creates a tables container node + */ +function createTablesContainer(tableNodes: TreeNode[], connectionId: string): TreeNode { + return { + id: `${connectionId}-tables`, + resource: {}, + getTreeItem: () => { + const item = new vscode.TreeItem('Tables', vscode.TreeItemCollapsibleState.Collapsed) + item.contextValue = NodeType.GLUE_TABLE + item.iconPath = new vscode.ThemeIcon('table') + return item + }, + getChildren: async () => tableNodes, + getParent: () => undefined, + } +} + +/** + * Maps Glue entity category to node type + */ +function getGlueNodeType(category?: string): NodeType { + const lowerCategory = category?.toLowerCase() + if (lowerCategory?.includes('schema')) { + return NodeType.GLUE_DATABASE + } else if (lowerCategory?.includes('table')) { + return NodeType.GLUE_TABLE + } else if (lowerCategory?.includes('database')) { + return NodeType.GLUE_DATABASE + } + return NodeType.GLUE_CATALOG +} + +/** + * Gets icon for Glue entity node type + */ +function getGlueEntityIcon(nodeType: NodeType): vscode.ThemeIcon | any { + switch (nodeType) { + case NodeType.GLUE_DATABASE: + return new vscode.ThemeIcon('database') + case NodeType.GLUE_TABLE: + return getIcon('aws-redshift-table') + case NodeType.GLUE_CATALOG: + return getIcon('aws-sagemakerunifiedstudio-catalog') + default: + return getIcon('vscode-circle-outline') + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts index 4106a0b4889..387c4f972b3 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts @@ -123,6 +123,9 @@ export function createS3ConnectionNode( return createErrorItem(errorMessage, 'connection', connection.connectionId) as S3Node } + // Handle case where s3Uri is "s3://" (all buckets access) + const isAllBucketsAccess = !s3Info.bucket + // Get S3 client from store const clientStore = ConnectionClientStore.getInstance() const s3Client = clientStore.getS3Client(connection.connectionId, region, connectionCredentialsProvider) @@ -146,7 +149,90 @@ export function createS3ConnectionNode( return telemetry.smus_renderS3Node.run(async (span) => { await recordDataConnectionTelemetry(span, connection, connectionCredentialsProvider) try { - if (isDefaultConnection && s3Info.prefix) { + if (isAllBucketsAccess) { + // For all buckets access (s3://), list all accessible buckets + try { + const buckets = await s3Client.listBuckets() + if (buckets.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE) as S3Node] + } + + return buckets.map((bucket) => { + return new S3Node( + { + id: bucket.Name || 'unknown-bucket', + nodeType: NodeType.S3_BUCKET, + connectionType: ConnectionType.S3, + value: { bucket: bucket.Name }, + path: { + connection: connection.name, + bucket: bucket.Name, + }, + parent: node, + }, + async (bucketNode) => { + try { + const allPaths = [] + let nextToken: string | undefined + + do { + const result = await s3Client.listPaths( + bucket.Name || '', + undefined, + nextToken + ) + allPaths.push(...result.paths) + nextToken = result.nextToken + } while (nextToken) + + if (allPaths.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE) as S3Node] + } + + return allPaths.map((path) => { + const nodeId = `${path.bucket}-${path.prefix || 'root'}` + + return new S3Node( + { + id: nodeId, + nodeType: path.isFolder ? NodeType.S3_FOLDER : NodeType.S3_FILE, + connectionType: ConnectionType.S3, + value: path, + path: { + connection: connection.name, + bucket: path.bucket, + key: path.prefix, + label: path.displayName, + }, + parent: bucketNode, + }, + path.isFolder + ? createFolderChildrenProvider(s3Client, path) + : undefined + ) + }) + } catch (err) { + logger.error(`Failed to list bucket contents: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [ + createErrorItem( + errorMessage, + 'bucket-contents-all-access', + bucketNode.id + ) as S3Node, + ] + } + } + ) + }) + } catch (err) { + logger.error(`Failed to list buckets: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [createErrorItem(errorMessage, 'list-buckets', node.id) as S3Node] + } + } else if (isDefaultConnection && s3Info.prefix) { // For default connections, show the full path as the first node const fullPath = `${s3Info.bucket}/${s3Info.prefix}` return [ @@ -382,11 +468,22 @@ function parseS3Uri(connection: DataZoneConnection): { bucket: string; prefix?: return undefined } + // Handle case where s3Uri is just "s3://" (all buckets access) + if (s3Uri === 's3://') { + return { bucket: '', prefix: undefined } + } + // Parse S3 URI: s3://bucket-name/prefix/path/ const uriWithoutPrefix = s3Uri.replace('s3://', '') + + // Handle empty URI after removing prefix + if (!uriWithoutPrefix) { + return { bucket: '', prefix: undefined } + } + // Since the URI ends with a slash, the last item will be an empty string, so ignore it in the parts. const parts = uriWithoutPrefix.split('/').slice(0, -1) - const bucket = parts[0] + const bucket = parts[0] || '' // If parts only contains 1 item, then only a bucket was provided, and the key is empty. const prefix = parts.length > 1 ? parts.slice(1).join('/') + '/' : undefined diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts index 01293e7e523..d31bfdb33e3 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts @@ -12,6 +12,7 @@ import { SagemakerClient } from '../../../shared/clients/sagemaker' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { SageMakerUnifiedStudioConnectionParentNode } from './sageMakerUnifiedStudioConnectionParentNode' import { ConnectionType } from '@aws-sdk/client-datazone' +import { getContext } from '../../../shared/vscode/setContext' export class SageMakerUnifiedStudioComputeNode implements TreeNode { public readonly id = 'smusComputeNode' @@ -37,12 +38,14 @@ export class SageMakerUnifiedStudioComputeNode implements TreeNode { const projectId = this.parent.getProject()?.id if (projectId) { - childrenNodes.push( - new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.REDSHIFT, 'Data warehouse') - ) - childrenNodes.push( - new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.SPARK, 'Data processing') - ) + if (!getContext('aws.smus.isExpressMode')) { + childrenNodes.push( + new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.REDSHIFT, 'Data warehouse') + ) + childrenNodes.push( + new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.SPARK, 'Data processing') + ) + } this.spacesNode = new SageMakerUnifiedStudioSpacesParentNode( this, projectId, diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts index a04377f0133..3bb7fa80222 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts @@ -8,7 +8,7 @@ import { SageMakerUnifiedStudioComputeNode } from './sageMakerUnifiedStudioCompu import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { ListConnectionsCommandOutput, ConnectionType } from '@aws-sdk/client-datazone' import { SageMakerUnifiedStudioConnectionNode } from './sageMakerUnifiedStudioConnectionNode' -import { DataZoneClient } from '../../shared/client/datazoneClient' +import { createDZClientBaseOnDomainMode } from './utils' // eslint-disable-next-line id-length export class SageMakerUnifiedStudioConnectionParentNode implements TreeNode { @@ -31,7 +31,7 @@ export class SageMakerUnifiedStudioConnectionParentNode implements TreeNode { } public async getChildren(): Promise { - const client = await DataZoneClient.getInstance(this.parent.authProvider) + const client = await createDZClientBaseOnDomainMode(this.parent.authProvider) this.connections = await client.fetchConnections( this.parent.parent.project?.domainId, this.parent.parent.project?.id, diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts index 4294a3e42f4..7b900f97792 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts @@ -8,15 +8,23 @@ import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { getIcon } from '../../../shared/icons' import { getLogger } from '../../../shared/logger/logger' -import { DataZoneClient, DataZoneConnection, DataZoneProject } from '../../shared/client/datazoneClient' +import { DataZoneConnection, DataZoneProject } from '../../shared/client/datazoneClient' import { createS3ConnectionNode, createS3AccessGrantNodes } from './s3Strategy' import { createRedshiftConnectionNode } from './redshiftStrategy' import { createLakehouseConnectionNode } from './lakehouseStrategy' import { SageMakerUnifiedStudioProjectNode } from './sageMakerUnifiedStudioProjectNode' import { isFederatedConnection, createErrorItem } from './utils' import { createPlaceholderItem } from '../../../shared/treeview/utils' -import { ConnectionType, NO_DATA_FOUND_MESSAGE } from './types' +import { + ConnectionType, + DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP, + NO_DATA_FOUND_MESSAGE, + S3_PROJECT_NON_GIT_PROJECT_REPOSITORY_LOCATION_NAME_REGEXP, +} from './types' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' +import { createFederatedConnectionNode } from './federatedConnectionStrategy' +import { createDZClientForProject } from './utils' +import { getContext } from '../../../shared/vscode/setContext' /** * Tree node representing a Data folder that contains S3 and Redshift connections @@ -57,7 +65,8 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { return [createErrorItem(errorMessage, 'project', this.id)] } - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientForProject(this.authProvider, project.id) + const connections = await datazoneClient.listConnections(project.domainId, undefined, project.id) this.logger.info(`Found ${connections.length} connections for project ${project.id}`) @@ -105,15 +114,23 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { } // Add Redshift nodes second - for (const connection of redshiftConnections) { - if (connection.name.startsWith('project.lakehouse')) { - continue + if (!getContext('aws.smus.isExpressMode')) { + for (const connection of redshiftConnections) { + if (connection.name.startsWith('project.lakehouse')) { + continue + } + if (isFederatedConnection(connection)) { + continue + } + const node = await this.createRedshiftNode(project, connection, region) + dataNodes.push(node) } - if (isFederatedConnection(connection)) { - continue + } else { + const federatedConnections = connections.filter((conn) => isFederatedConnection(conn)) + if (federatedConnections.length > 0) { + const connectionsNode = this.createConnectionsParentNode(project, federatedConnections, region) + dataNodes.push(connectionsNode) } - const node = await this.createRedshiftNode(project, connection, region) - dataNodes.push(node) } // Add S3 Bucket parent node last @@ -132,30 +149,23 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { region: string ): Promise { try { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) - const getConnectionResponse = await datazoneClient.getConnection({ - domainIdentifier: project.domainId, - identifier: connection.connectionId, - withSecret: true, - }) - const connectionCredentialsProvider = await this.authProvider.getConnectionCredentialsProvider( connection.connectionId, project.id, - getConnectionResponse.location?.awsRegion || region + connection.location?.awsRegion || region ) const s3ConnectionNode = createS3ConnectionNode( connection, connectionCredentialsProvider, - getConnectionResponse.location?.awsRegion || region + connection.location?.awsRegion || region ) const accessGrantNodes = await createS3AccessGrantNodes( connection, connectionCredentialsProvider, - getConnectionResponse.location?.awsRegion || region, - getConnectionResponse.location?.awsAccountId + connection.location?.awsRegion || region, + connection.location?.awsAccountId ) return [s3ConnectionNode, ...accessGrantNodes] @@ -173,7 +183,7 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { region: string ): Promise { try { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientForProject(this.authProvider, project.id) const getConnectionResponse = await datazoneClient.getConnection({ domainIdentifier: project.domainId, identifier: connection.connectionId, @@ -201,17 +211,10 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { region: string ): Promise { try { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) - const getConnectionResponse = await datazoneClient.getConnection({ - domainIdentifier: project.domainId, - identifier: connection.connectionId, - withSecret: true, - }) - const connectionCredentialsProvider = await this.authProvider.getConnectionCredentialsProvider( connection.connectionId, project.id, - getConnectionResponse.location?.awsRegion || region + connection.location?.awsRegion || region ) return createLakehouseConnectionNode(connection, connectionCredentialsProvider, region) @@ -237,8 +240,26 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { return item }, getChildren: async () => { + // Filter connections inside the bucket parent node + const defaultS3Connection = s3Connections.find((conn) => + DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP.test(conn.name) + ) + const otherS3Connections = s3Connections.filter( + (conn) => + !DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP.test(conn.name) && + !S3_PROJECT_NON_GIT_PROJECT_REPOSITORY_LOCATION_NAME_REGEXP.test(conn.name) + ) + const s3Nodes: TreeNode[] = [] - for (const connection of s3Connections) { + + // Add default connections first + if (defaultS3Connection) { + const defaultS3Node = await this.createS3Node(project, defaultS3Connection, region) + s3Nodes.push(...defaultS3Node) + } + + // Add other connections + for (const connection of otherS3Connections) { const nodes = await this.createS3Node(project, connection, region) s3Nodes.push(...nodes) } @@ -247,4 +268,46 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { getParent: () => this, } } + + private createConnectionsParentNode( + project: DataZoneProject, + federatedConnections: DataZoneConnection[], + region: string + ): TreeNode { + return { + id: 'connections-parent', + resource: {}, + getTreeItem: () => { + const item = new vscode.TreeItem('Connections', vscode.TreeItemCollapsibleState.Collapsed) + item.contextValue = 'connectionsFolder' + return item + }, + getChildren: async () => { + const nodes: TreeNode[] = [] + for (const connection of federatedConnections) { + try { + const connectionCredentialsProvider = await this.authProvider.getConnectionCredentialsProvider( + connection.connectionId, + project.id, + connection.location?.awsRegion || region + ) + const node = await createFederatedConnectionNode( + connection, + connectionCredentialsProvider, + region + ) + nodes.push(node) + } catch (err) { + const errorMessage = `Failed to create federated connection - ${(err as Error).message}` + this.logger.error( + `Failed to create federated connection ${connection.name}: ${(err as Error).message}` + ) + nodes.push(createErrorItem(errorMessage, `federated-${connection.connectionId}`, this.id)) + } + } + return nodes + }, + getParent: () => this, + } + } } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts index 912693906e6..b37f1769be6 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts @@ -19,6 +19,8 @@ import { getResourceMetadata } from '../../shared/utils/resourceMetadataUtils' import { getContext } from '../../../shared/vscode/setContext' import { ToolkitError } from '../../../shared/errors' import { SmusErrorCodes } from '../../shared/smusUtils' +import { SmusIamConnection } from '../../auth/model' +import { createDZClientBaseOnDomainMode } from './utils' /** * Tree node representing a SageMaker Unified Studio project @@ -121,7 +123,7 @@ export class SageMakerUnifiedStudioProjectNode implements TreeNode { return [dataNode] } - const dzClient = await DataZoneClient.getInstance(this.authProvider) + const dzClient = await createDZClientBaseOnDomainMode(this.authProvider) if (!this.project?.id) { throw new Error('Project ID is required') } @@ -214,7 +216,7 @@ export class SageMakerUnifiedStudioProjectNode implements TreeNode { } try { - const dzClient = await DataZoneClient.getInstance(this.authProvider) + const dzClient = await createDZClientBaseOnDomainMode(this.authProvider) const projectDetails = await dzClient.getProject(this.project.id) if (projectDetails && projectDetails.name) { @@ -235,7 +237,13 @@ export class SageMakerUnifiedStudioProjectNode implements TreeNode { } let awsCredentialProvider if (getContext('aws.smus.isExpressMode')) { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = DataZoneClient.createWithCredentials( + this.authProvider.getDomainRegion(), + this.authProvider.getDomainId(), + await this.authProvider.getCredentialsProviderForIamProfile( + (this.authProvider.activeConnection as SmusIamConnection).profileName + ) + ) const projectId = this.project.id awsCredentialProvider = async (): Promise => { const creds = await datazoneClient.getProjectDefaultEnvironmentCreds(projectId) diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index 62eb14a0663..46626e8665a 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { getIcon } from '../../../shared/icons' import { getLogger } from '../../../shared/logger/logger' -import { DataZoneClient, DataZoneProject } from '../../shared/client/datazoneClient' +import { DataZoneProject } from '../../shared/client/datazoneClient' import { Commands } from '../../../shared/vscode/commands2' import { telemetry } from '../../../shared/telemetry/telemetry' import { createQuickPick } from '../../../shared/ui/pickerPrompter' @@ -20,6 +20,7 @@ import { SmusAuthenticationMethod } from '../../auth/ui/authenticationMethodSele import { SmusAuthenticationOrchestrator } from '../../auth/authenticationOrchestrator' import { isSmusSsoConnection } from '../../auth/model' import { getContext } from '../../../shared/vscode/setContext' +import { createDZClientBaseOnDomainMode } from './utils' const contextValueSmusRoot = 'sageMakerUnifiedStudioRoot' const contextValueSmusLogin = 'sageMakerUnifiedStudioLogin' @@ -459,7 +460,7 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj return } - const client = await DataZoneClient.getInstance(authProvider) + const client = await createDZClientBaseOnDomainMode(authProvider) logger.debug('DataZone client instance obtained successfully') const allProjects = await client.fetchAllProjects() diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts index cf69bcafde2..f784a1ce99a 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts @@ -6,7 +6,6 @@ import * as vscode from 'vscode' import { SageMakerUnifiedStudioComputeNode } from './sageMakerUnifiedStudioComputeNode' import { updateInPlace } from '../../../shared/utilities/collectionUtils' -import { DataZoneClient } from '../../shared/client/datazoneClient' import { DescribeDomainResponse } from '@amzn/sagemaker-client' import { getDomainUserProfileKey } from '../../../awsService/sagemaker/utils' import { getLogger } from '../../../shared/logger/logger' @@ -19,6 +18,7 @@ import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticat import { SmusUtils } from '../../shared/smusUtils' import { getIcon } from '../../../shared/icons' import { getContext } from '../../../shared/vscode/setContext' +import { createDZClientBaseOnDomainMode } from './utils' export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { public readonly id = 'smusSpacesParentNode' @@ -142,7 +142,7 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { } this.logger.debug('SMUS: Getting DataZone client instance') - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientBaseOnDomainMode(this.authProvider) if (!datazoneClient) { throw new Error('DataZone client is not initialized') } @@ -179,7 +179,7 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { } private async updateChildren(): Promise { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientBaseOnDomainMode(this.authProvider) let userProfileId if (getContext('aws.smus.isExpressMode')) { diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts index a94d25fccc4..73da925a8f7 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts @@ -17,6 +17,9 @@ export const DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP = /^(project\.default export const DATA_DEFAULT_ATHENA_CONNECTION_NAME_REGEXP = /^(project\.athena)|(default\.sql)$/ // eslint-disable-next-line @typescript-eslint/naming-convention export const DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP = /^(project\.s3_default_folder)|(default\.s3)$/ +// eslint-disable-next-line @typescript-eslint/naming-convention, id-length +export const S3_PROJECT_NON_GIT_PROJECT_REPOSITORY_LOCATION_NAME_REGEXP = + /^(project\.non_git_project_repository_location)|(default\.s3_shared)$/ // Database object types export enum DatabaseObjects { @@ -205,3 +208,22 @@ export const LEAF_NODE_TYPES = [ // eslint-disable-next-line @typescript-eslint/naming-convention export const NO_DATA_FOUND_MESSAGE = '[No data found]' + +/** + * Glue connection types + */ +export const glueConnectionTypes = [ + 'BIGQUERY', + 'DOCUMENTDB', + 'DYNAMODB', + 'MYSQL', + 'OPENSEARCH', + 'ORACLE', + 'POSTGRESQL', + 'REDSHIFT', + 'SAPHANA', + 'SNOWFLAKE', + 'SQLSERVER', + 'TERADATA', + 'VERTICA', +] diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts index 10b52f83728..4aeba1b5602 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts @@ -17,8 +17,13 @@ import { DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP, redshiftColumnTypes, lakeHouseColumnTypes, + glueConnectionTypes, } from './types' -import { DataZoneConnection } from '../../shared/client/datazoneClient' +import { DataZoneClient, DataZoneConnection } from '../../shared/client/datazoneClient' +import { getContext } from '../../../shared/vscode/setContext' +import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' +import { SmusIamConnection } from '../../auth/model' +import { ConnectionStatus } from '@aws-sdk/client-datazone' /** * Gets the label for a node based on its data @@ -41,6 +46,9 @@ export function getLabel(data: { data.value?.connection?.type === ConnectionType.LAKEHOUSE && DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP.test(data.value?.connection?.name) ) { + if (getContext('aws.smus.isExpressMode')) { + return 'Catalogs' + } return 'Lakehouse' } const formattedType = data.value?.connection?.type?.replace(/([A-Z]+(?:_[A-Z]+)*)/g, (match: string) => { @@ -224,6 +232,14 @@ function getColumnIcon(columnType: string): vscode.ThemeIcon | IconPath { return getIcon('vscode-calendar') } + // Check if it's a boolean type + if ( + lakeHouseColumnTypes.BOOLEAN.some((type) => upperType.includes(type)) || + redshiftColumnTypes.BOOLEAN.some((type) => upperType.includes(type)) + ) { + return getIcon('vscode-symbol-boolean') + } + // Default icon for unknown types return new vscode.ThemeIcon('symbol-field') } @@ -368,6 +384,69 @@ export function getRedshiftTypeFromHost(host?: string): RedshiftType | undefined } } +/** + * This function searches for property keys that end with "Properties" (like "snowflakeProperties", + * "redshiftProperties", "athenaProperties") and returns the actual property object, not just the key name. + * It only works for connections that have a glueConnectionName, indicating they are federated connections. + * + * @param connection - The DataZone connection object to search + * @returns The property object (not the key name) if found, undefined otherwise + * + * @example + * ```typescript + * // Redshift connection + * const redshiftConnection = { + * glueConnectionName: 'my-redshift-glue-conn', + * props: { + * redshiftProperties: { + * status: 'FAILED', + * errorMessage: 'Connection timeout' + * } + * } + * } + * const result = getGluePropertiesKey(redshiftConnection) + * // Returns: { status: 'FAILED', errorMessage: 'Connection timeout' } + */ +export function getGluePropertiesKey(connection: DataZoneConnection) { + if (!connection?.props) { + return undefined + } + if (!connection.glueConnectionName) { + return undefined + } + // Check for other properties that might contain glue connection info + const propertiesKey = Object.keys(connection.props).find( + (key) => + key.endsWith('Properties') && + typeof connection.props![key] === 'object' && + !Array.isArray(connection.props![key]) + ) + + return propertiesKey ? connection.props[propertiesKey] : undefined +} + +/** + * This function handles the refactor where connections moved from a single `glueProperties` object to + * connector-specific property bags (like `snowflakeProperties`, `redshiftProperties`, `athenaProperties`). + * It first checks for the legacy `glueProperties` field, then falls back to connector-specific properties. + * + * @param connection - The DataZone connection object to extract properties from + * @returns Object with optional status and errorMessage fields, or undefined if no properties found + */ +export function getGlueProperties(connection?: DataZoneConnection) { + if (!connection?.props) { + return undefined + } + // Check for direct glueProperties + if ('glueProperties' in connection.props) { + return connection.props.glueProperties + } + + return connection?.props?.[getGluePropertiesKey(connection)!] as + | { status?: ConnectionStatus; errorMessage?: string } + | undefined +} + /** * Determines if a connection is a federated connection by checking its type. * A connection is considered federated if it's either: @@ -379,7 +458,55 @@ export function getRedshiftTypeFromHost(host?: string): RedshiftType | undefined */ export function isFederatedConnection(connection?: DataZoneConnection): boolean { if (connection?.type === ConnectionType.REDSHIFT) { - return !!connection?.props?.glueProperties + return !!getGlueProperties(connection) } - return false + + // Check if connection type exists in GlueConnectionType enum values + return glueConnectionTypes.includes(connection?.type || '') +} + +/** + * Creates a DataZoneClient with appropriate credentials provider based on domain mode + * If domain mode is express mode, use the credential profile credential provider + * If domain mode is not express mode, use the DER credential provider + * @param smusAuthProvider The SMUS authentication provider + * @returns Promise resolving to DataZoneClient instance + */ +export async function createDZClientBaseOnDomainMode( + smusAuthProvider: SmusAuthenticationProvider +): Promise { + const credentialsProvider = getContext('aws.smus.isExpressMode') + ? await smusAuthProvider.getCredentialsProviderForIamProfile( + (smusAuthProvider.activeConnection as SmusIamConnection).profileName + ) + : await smusAuthProvider.getDerCredentialsProvider() + + return DataZoneClient.createWithCredentials( + smusAuthProvider.getDomainRegion(), + smusAuthProvider.getDomainId(), + credentialsProvider + ) +} + +/** + * Creates a DataZoneClient with appropriate credentials provider for a specific project + * If domain mode is express mode, use the project credential provider + * If domain mode is not express mode, use the DER credential provider + * @param smusAuthProvider The SMUS authentication provider + * @param projectId The project ID for project-specific credentials + * @returns Promise resolving to DataZoneClient instance + */ +export async function createDZClientForProject( + smusAuthProvider: SmusAuthenticationProvider, + projectId: string +): Promise { + const credentialsProvider = getContext('aws.smus.isExpressMode') + ? await smusAuthProvider.getProjectCredentialProvider(projectId) + : await smusAuthProvider.getDerCredentialsProvider() + + return DataZoneClient.createWithCredentials( + smusAuthProvider.getDomainRegion(), + smusAuthProvider.getDomainId(), + credentialsProvider + ) } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts index 6dcbf41e381..c29b0a5fb07 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts @@ -18,11 +18,10 @@ import { GetEnvironmentCommandOutput, } from '@aws-sdk/client-datazone' import { getLogger } from '../../../shared/logger/logger' -import type { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { DefaultStsClient } from '../../../shared/clients/stsClient' import { getContext } from '../../../shared/vscode/setContext' +import { CredentialsProvider } from '../../../auth/providers/credentials' import { SmusUtils } from '../smusUtils' -import { SmusIamConnection } from '../../auth/model' /** * Represents a DataZone domain @@ -98,6 +97,10 @@ export interface DataZoneConnection { awsAccountId?: string iamConnectionId?: string } + /** + * Glue connection name + */ + glueConnectionName?: string } // Constants for DataZone environment configuration @@ -105,14 +108,64 @@ const toolingBlueprintName = 'Tooling' const sageMakerProviderName = 'Amazon SageMaker' /** - * Client for interacting with AWS DataZone API with DER credential support + * Client for interacting with AWS DataZone API * - * This client integrates with SmusAuthenticationProvider to provide authenticated - * DataZone operations using Domain Execution Role (DER) credentials. - * - * One instance per connection/domainId is maintained to avoid duplication. + * This client can be used with different credential providers */ export class DataZoneClient { + private datazoneClient: DataZone | undefined + private static instances = new Map() + private readonly logger = getLogger() + + private constructor( + private readonly region: string, + private readonly domainId: string, + private readonly credentialsProvider?: CredentialsProvider + ) {} + + /** + * Creates a new DataZoneClient instance with specific credentials + * @param region AWS region + * @param domainId DataZone domain ID + * @param credentialsProvider Credentials provider + * @returns DataZoneClient instance with credentials + */ + public static createWithCredentials( + region: string, + domainId: string, + credentialsProvider: CredentialsProvider + ): DataZoneClient { + const instanceKey = credentialsProvider.getHashCode() + + if (DataZoneClient.instances.has(instanceKey)) { + const existingInstance = DataZoneClient.instances.get(instanceKey)! + getLogger().debug(`DataZoneClient: Using existing instance, instance key is ${instanceKey}`) + return existingInstance + } + + // Create new instance + getLogger().debug(`DataZoneClient: Creating new instance with instance key ${instanceKey}`) + const instance = new DataZoneClient(region, domainId, credentialsProvider) + DataZoneClient.instances.set(instanceKey, instance) + + return instance + } + + /** + * Disposes all cached DataZoneClient instances + */ + public static dispose(): void { + const logger = getLogger() + getLogger().debug('DataZoneClient: Disposing all cached instances') + + for (const [key, instance] of DataZoneClient.instances.entries()) { + instance.datazoneClient = undefined + logger.debug(`DataZoneClient: Disposed instance for: ${key}`) + } + + DataZoneClient.instances.clear() + } + /** * Parse a Redshift connection info object from JDBC URL * @param jdbcURL Example JDBC URL: jdbc:redshift://redshift-serverless-workgroup-3zzw0fjmccdixz.123456789012.us-east-1.redshift-serverless.amazonaws.com:5439/dev @@ -156,73 +209,6 @@ export class DataZoneClient { } } - private datazoneClient: DataZone | undefined - private static instances = new Map() - private readonly logger = getLogger() - - private constructor( - private readonly authProvider: SmusAuthenticationProvider, - private readonly domainId: string, - private readonly region: string - ) {} - - /** - * Gets an authenticated DataZoneClient instance using DER credentials - * One instance per connection/domainId is maintained - * @param authProvider The SMUS authentication provider - * @returns Promise resolving to authenticated DataZoneClient instance - */ - public static async getInstance(authProvider: SmusAuthenticationProvider): Promise { - const logger = getLogger() - - if (!authProvider.isConnected()) { - throw new Error('SMUS authentication provider is not connected') - } - - const region = authProvider.getDomainRegion() - const instanceKey = `${authProvider.getDomainId()}:${region}` - - logger.debug(`DataZoneClient: Getting instance for domain: ${instanceKey}`) - - // Check if we already have an instance for this domain/region - if (DataZoneClient.instances.has(instanceKey)) { - const existingInstance = DataZoneClient.instances.get(instanceKey)! - logger.debug('DataZoneClient: Using existing instance') - return existingInstance - } - - // Create new instance - logger.debug('DataZoneClient: Creating new instance') - const instance = new DataZoneClient(authProvider, authProvider.getDomainId(), region) - DataZoneClient.instances.set(instanceKey, instance) - - // Set up cleanup when connection changes - const disposable = authProvider.onDidChangeActiveConnection(() => { - logger.debug(`DataZoneClient: Connection changed, cleaning up instance for: ${instanceKey}`) - DataZoneClient.instances.delete(instanceKey) - instance.datazoneClient = undefined - disposable.dispose() - }) - - logger.info(`DataZoneClient: Created instance for domain ${authProvider.getDomainId()}`) - return instance - } - - /** - * Disposes all instances and cleans up resources - */ - public static dispose(): void { - const logger = getLogger() - logger.debug('DataZoneClient: Disposing all instances') - - for (const [key, instance] of DataZoneClient.instances.entries()) { - instance.datazoneClient = undefined - logger.debug(`DataZoneClient: Disposed instance for: ${key}`) - } - - DataZoneClient.instances.clear() - } - /** * Gets the DataZone domain ID * @returns DataZone domain ID @@ -298,35 +284,25 @@ export class DataZoneClient { private async getDataZoneClient(): Promise { if (!this.datazoneClient) { try { - const credentialsProvider = async () => { - let credentials - if (getContext('aws.smus.isExpressMode')) { - this.logger.info( - 'DataZoneClient: Creating authenticated DataZone client with Iam profile credentials' - ) - const activeConnection = this.authProvider.activeConnection! - credentials = await ( - await this.authProvider.getCredentialsProviderForIamProfile( - (activeConnection as SmusIamConnection).profileName - ) - ).getCredentials() - } else { - this.logger.debug('DataZoneClient: Creating authenticated DataZone client with DER credentials') - credentials = await (await this.authProvider.getDerCredentialsProvider()).getCredentials() - } - return { - accessKeyId: credentials.accessKeyId, - secretAccessKey: credentials.secretAccessKey, - sessionToken: credentials.sessionToken, - expiration: credentials.expiration, + if (this.credentialsProvider) { + const awsCredentialProvider = async () => { + const credentials = await this.credentialsProvider!.getCredentials() + return { + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + sessionToken: credentials.sessionToken, + expiration: credentials.expiration, + } } + this.datazoneClient = new DataZone({ + region: this.region, + credentials: awsCredentialProvider, + }) + } else { + throw new Error('No credentials provider provided') } - this.datazoneClient = new DataZone({ - region: this.region, - credentials: credentialsProvider, - }) - this.logger.debug('DataZoneClient: Successfully created authenticated DataZone client') + this.logger.info('DataZoneClient: Successfully created authenticated DataZone client') } catch (err) { this.logger.error('DataZoneClient: Failed to create DataZone client: %s', err as Error) throw err @@ -560,6 +536,22 @@ export class DataZoneClient { return undefined } + /** + * Parses glueConnectionName from physical endpoints + * @param physicalEndpoints Array of physical endpoints + * @returns glueConnectionName or undefined + */ + // eslint-disable-next-line id-length + private parseGlueConnectionNameFromPhysicalEndpoints( + physicalEndpoints?: PhysicalEndpoint[] + ): DataZoneConnection['glueConnectionName'] { + if (physicalEndpoints && physicalEndpoints.length > 0) { + const physicalEndpoint = physicalEndpoints[0] + return physicalEndpoint.glueConnectionName + } + return undefined + } + /** * Gets a specific connection by ID * @param params Parameters for getting a connection @@ -590,6 +582,8 @@ export class DataZoneClient { // Parse location from physical endpoints const location = this.parseLocationFromPhysicalEndpoints(response.physicalEndpoints) + const glueConnectionName = this.parseGlueConnectionNameFromPhysicalEndpoints(response.physicalEndpoints) + // Return as DataZoneConnection, currently only required fields are added // Can always include new fields in DataZoneConnection when needed const connection: DataZoneConnection = { @@ -602,6 +596,7 @@ export class DataZoneClient { props: response.props || {}, connectionCredentials: response.connectionCredentials, location, + glueConnectionName, } return connection @@ -663,6 +658,10 @@ export class DataZoneClient { // Parse location from physical endpoints const location = this.parseLocationFromPhysicalEndpoints(connection.physicalEndpoints) + const glueConnectionName = this.parseGlueConnectionNameFromPhysicalEndpoints( + connection.physicalEndpoints + ) + return { connectionId: connection.connectionId || '', name: connection.name || '', @@ -673,6 +672,7 @@ export class DataZoneClient { projectId, props: connection.props || {}, location, + glueConnectionName, } }) allConnections = [...allConnections, ...connections] @@ -757,7 +757,6 @@ export class DataZoneClient { /** * Gets environment details - * @param domainId The DataZone domain identifier * @param environmentId The environment identifier * @returns Promise resolving to environment details */ @@ -789,43 +788,31 @@ export class DataZoneClient { * @returns The tooling environment details */ public async getToolingEnvironment(projectId: string): Promise { - const logger = getLogger() - - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) - if (!datazoneClient) { - throw new Error('DataZone client is not initialized') - } - - const toolingEnvId = await datazoneClient - .getToolingEnvironmentId(datazoneClient.getDomainId(), projectId) - .catch((err) => { - logger.error('Failed to get tooling environment ID for project %s', projectId) - throw new Error(`Failed to get tooling environment ID: ${err.message}`) - }) - + const toolingEnvId = await this.getToolingEnvironmentId(this.getDomainId(), projectId) if (!toolingEnvId) { throw new Error('No default environment found for project') } - - return await datazoneClient.getEnvironmentDetails(toolingEnvId) + return await this.getEnvironmentDetails(toolingEnvId) } public async getUserId(): Promise { - const derCredProvider = await this.authProvider.getDerCredentialsProvider() - this.logger.debug(`Calling STS GetCallerIdentity using DER credentials of ${this.getDomainId()}`) - const stsClient = new DefaultStsClient(this.getRegion(), await derCredProvider.getCredentials()) + if (!this.credentialsProvider) { + throw new Error('Credentials provider is required for getUserId') + } + const callerCredentials = await this.credentialsProvider.getCredentials() + const stsClient = new DefaultStsClient(this.getRegion(), callerCredentials) const callerIdentity = await stsClient.getCallerIdentity() this.logger.debug(`Retrieved caller identity, UserId: ${callerIdentity.UserId}`) return callerIdentity.UserId } public async getUserProfileId(): Promise { - const activeConnection = this.authProvider.activeConnection! - const smusConnections = (this.authProvider.secondaryAuth.state.get('smus.connections') as any) || {} - const profileName = smusConnections[activeConnection.id].profileName - const credentialsProvider = await this.authProvider.getCredentialsProviderForIamProfile(profileName) + if (!this.credentialsProvider) { + throw new Error('Credentials provider is required for getUserId') + } + const callerCredentials = await this.credentialsProvider.getCredentials() - const stsClient = new DefaultStsClient(this.getRegion(), await credentialsProvider.getCredentials()) + const stsClient = new DefaultStsClient(this.getRegion(), callerCredentials) const callerIdentity = await stsClient.getCallerIdentity() this.logger.debug(`Retrieved caller identity, Arn: ${callerIdentity.Arn}`) diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts index d86c3904a07..43fbb0a2ff0 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { S3 } from '@aws-sdk/client-s3' +import { S3, ListBucketsCommand } from '@aws-sdk/client-s3' import { getLogger } from '../../../shared/logger/logger' import { ConnectionCredentialsProvider } from '../../auth/providers/connectionCredentialsProvider' @@ -45,7 +45,7 @@ export class S3Client { continuationToken?: string ): Promise<{ paths: S3Path[]; nextToken?: string }> { try { - this.logger.info(`S3Client: Listing paths in bucket ${bucket} with prefix ${prefix || 'root'}`) + this.logger.info(`S3Client: Listing paths in bucket ${bucket} with prefix ${prefix}`) const s3Client = await this.getS3Client() @@ -116,6 +116,40 @@ export class S3Client { } } + /** + * Lists all S3 buckets accessible to the current credentials + * @returns Array of bucket objects + */ + public async listBuckets(): Promise> { + try { + this.logger.debug('S3Client: Listing all accessible buckets') + + const s3Client = await this.getS3Client() + const allBuckets: Array<{ Name?: string; CreationDate?: Date }> = [] + let continuationToken: string | undefined + + do { + const response = await s3Client.send( + new ListBucketsCommand({ + ContinuationToken: continuationToken, + BucketRegion: this.region, + }) + ) + + if (response.Buckets) { + allBuckets.push(...response.Buckets) + } + continuationToken = response.ContinuationToken + } while (continuationToken) + + this.logger.debug(`S3Client: Found ${allBuckets.length} accessible buckets`) + return allBuckets + } catch (err) { + this.logger.error('S3Client: Failed to list buckets: %s', err as Error) + throw err + } + } + /** * Gets the S3 client, initializing it if necessary */ diff --git a/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts b/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts index d2963965750..2bdcd3014d9 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts @@ -18,7 +18,8 @@ import { SmusAuthenticationProvider } from '../auth/providers/smusAuthentication import { getLogger } from '../../shared/logger/logger' import { getContext } from '../../shared/vscode/setContext' import { ConnectionCredentialsProvider } from '../auth/providers/connectionCredentialsProvider' -import { DataZoneConnection, DataZoneClient } from './client/datazoneClient' +import { DataZoneConnection } from './client/datazoneClient' +import { createDZClientBaseOnDomainMode } from '../explorer/nodes/utils' /** * Records space telemetry @@ -43,7 +44,7 @@ export async function recordSpaceTelemetry( projectAccountId = await authProvider.getProjectAccountId(projectId) // Get project region from tooling environment - const dzClient = await DataZoneClient.getInstance(authProvider) + const dzClient = await createDZClientBaseOnDomainMode(authProvider) const toolingEnv = await dzClient.getToolingEnvironment(projectId) projectRegion = toolingEnv.awsAccountRegion } diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts index 951e391d181..8d14d21ba57 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts @@ -16,6 +16,7 @@ describe('ConnectionCredentialsProvider', function () { let connectionProvider: ConnectionCredentialsProvider let dataZoneClientStub: sinon.SinonStub + const testProjectId = 'proj-123456' const testConnectionId = 'conn-123456' const testDomainId = 'dzd_testdomain' const testRegion = 'us-east-2' @@ -42,6 +43,13 @@ describe('ConnectionCredentialsProvider', function () { isConnected: sinon.stub().returns(true), getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns(testRegion), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), activeConnection: { ssoRegion: testRegion, }, @@ -52,10 +60,10 @@ describe('ConnectionCredentialsProvider', function () { getConnection: sinon.stub().resolves(mockGetConnectionResponse), } as any - // Stub DataZoneClient.getInstance - dataZoneClientStub = sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + // Stub DataZoneClient.createWithCredentials + dataZoneClientStub = sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) - connectionProvider = new ConnectionCredentialsProvider(mockAuthProvider as any, testConnectionId) + connectionProvider = new ConnectionCredentialsProvider(mockAuthProvider as any, testConnectionId, testProjectId) }) afterEach(function () { diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts index 6dd206593f8..bef7cc1885d 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts @@ -36,6 +36,25 @@ describe('ProjectRoleCredentialsProvider', function () { getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns(testRegion), isConnected: sinon.stub().returns(true), + activeConnection: { + profileName: 'test-profile', + domainId: testDomainId, + ssoRegion: testRegion, + }, + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + getCredentialsProviderForIamProfile: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'profile-key', + secretAccessKey: 'profile-secret', + sessionToken: 'profile-token', + }), + }), } as any // Mock DataZone client @@ -43,8 +62,7 @@ describe('ProjectRoleCredentialsProvider', function () { getProjectDefaultEnvironmentCreds: sinon.stub().resolves(mockGetEnvironmentCredentialsResponse), } as any - // Stub DataZoneClient.getInstance - dataZoneClientStub = sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + dataZoneClientStub = sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) projectProvider = new ProjectRoleCredentialsProvider(mockSmusAuthProvider, testProjectId) }) @@ -111,8 +129,8 @@ describe('ProjectRoleCredentialsProvider', function () { it('should fetch and cache project credentials', async function () { const credentials = await projectProvider.getCredentials() - // Verify DataZone client getInstance was called - assert.ok(dataZoneClientStub.calledWith(mockSmusAuthProvider)) + // Verify DataZone client createWithCredentials was called with correct parameters + assert.ok(dataZoneClientStub.calledWith(testRegion, testDomainId, sinon.match.any)) // Verify getProjectDefaultEnvironmentCreds was called assert.ok(mockDataZoneClient.getProjectDefaultEnvironmentCreds.called) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 466e7bf8386..86c503f0627 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -103,7 +103,7 @@ describe('SmusAuthenticationProvider', function () { } as any // Stub static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) extractDomainInfoStub = sinon .stub(SmusUtils, 'extractDomainInfoFromUrl') .returns({ domainId: testDomainId, region: testRegion }) @@ -698,7 +698,7 @@ describe('SmusAuthenticationProvider', function () { assert.strictEqual(smusAuthProvider['cachedProjectAccountIds'].get(testProjectId), testAccountId) assert.ok(getProjectCredentialProviderStub.calledWith(testProjectId)) assert.ok(mockProjectCredentialsProvider.getCredentials.called) - assert.ok((DataZoneClient.getInstance as sinon.SinonStub).called) + assert.ok((DataZoneClient.createWithCredentials as sinon.SinonStub).called) assert.ok(mockDataZoneClientForProject.getToolingEnvironment.calledWith(testProjectId)) assert.ok(mockStsClient.getCallerIdentity.called) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts index 982aa481bd3..6f2b22190f3 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts @@ -11,7 +11,6 @@ import { SmusAuthenticationProvider, setSmusConnectedContext, } from '../../../sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider' -import { DataZoneClient } from '../../../sagemakerunifiedstudio/shared/client/datazoneClient' import { ResourceTreeDataProvider } from '../../../shared/treeview/resourceTreeDataProvider' import { SageMakerUnifiedStudioRootNode } from '../../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode' import { getLogger } from '../../../shared/logger/logger' @@ -19,6 +18,7 @@ import { getTestWindow } from '../../shared/vscode/window' import { SeverityLevel } from '../../shared/vscode/message' import * as extensionUtilities from '../../../shared/extensionUtilities' import { createMockSpaceNode } from '../testUtils' +import { DataZoneClient } from '../../../sagemakerunifiedstudio/shared/client/datazoneClient' describe('SMUS Explorer Activation', function () { let mockExtensionContext: vscode.ExtensionContext @@ -69,7 +69,7 @@ describe('SMUS Explorer Activation', function () { // Stub SmusAuthenticationProvider sinon.stub(SmusAuthenticationProvider, 'fromContext').returns(mockSmusAuthProvider as any) - // Stub DataZoneClient + // Stub DataZoneClient.dispose dataZoneDisposeStub = sinon.stub(DataZoneClient, 'dispose') // Stub SageMakerUnifiedStudioRootNode constructor @@ -151,7 +151,7 @@ describe('SMUS Explorer Activation', function () { it('should register DataZone client disposal', async function () { await activate(mockExtensionContext) - // Find the DataZone dispose subscription - it should be the last one added + // Find the DataZone dispose subscription const subscriptions = mockExtensionContext.subscriptions assert.ok(subscriptions.length > 0) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts new file mode 100644 index 00000000000..9aadf68d443 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts @@ -0,0 +1,185 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import * as sinon from 'sinon' +import * as vscode from 'vscode' +import { createFederatedConnectionNode } from '../../../../sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy' +import { GlueClient, ListEntitiesCommand, DescribeEntityCommand } from '@aws-sdk/client-glue' +import { ConnectionCredentialsProvider } from '../../../../sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider' + +describe('FederatedConnectionStrategy', function () { + let sandbox: sinon.SinonSandbox + let mockGlueClient: sinon.SinonStubbedInstance + let mockCredentialsProvider: ConnectionCredentialsProvider + + const mockConnection = { + connectionId: 'federated-conn-123', + name: 'test-federated-connection', + glueConnectionName: 'test-glue-connection', + } + + beforeEach(function () { + sandbox = sinon.createSandbox() + + mockCredentialsProvider = { + getCredentials: sandbox.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + }), + logger: {} as any, + smusAuthProvider: {} as any, + connectionId: 'test-connection', + projectId: 'test-project', + } as any + + mockGlueClient = sandbox.createStubInstance(GlueClient) + sandbox.stub(GlueClient.prototype, 'send').callsFake(mockGlueClient.send) + }) + + afterEach(function () { + sandbox.restore() + }) + + describe('createFederatedConnectionNode', function () { + it('should create connection node with correct properties', async function () { + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + assert.strictEqual(node.id, 'federated-federated-conn-123') + assert.strictEqual(node.resource, mockConnection) + + const treeItem = await node.getTreeItem() + assert.strictEqual(treeItem.label, 'test-federated-connection') + assert.strictEqual(treeItem.contextValue, 'federatedConnection') + assert.strictEqual(treeItem.collapsibleState, vscode.TreeItemCollapsibleState.Collapsed) + }) + + it('should return error when no glue connection name', async function () { + const connectionWithoutGlue = { ...mockConnection, glueConnectionName: undefined } + + const node = await createFederatedConnectionNode( + connectionWithoutGlue as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + assert.ok(children[0].id.includes('error')) + }) + + it('should return placeholder when no entities found', async function () { + mockGlueClient.send.resolves({ Entities: [] }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + assert.strictEqual(children[0].resource, '[No data found]') + }) + + it('should group tables under Tables container', async function () { + mockGlueClient.send.resolves({ + Entities: [ + { EntityName: 'table1', Category: 'TABLE', Label: 'Table 1' }, + { EntityName: 'table2', Category: 'TABLE', Label: 'Table 2' }, + ], + }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + + const tablesContainer = children[0] + assert.ok(tablesContainer.id.includes('tables')) + + const tableChildren = await tablesContainer.getChildren!() + assert.strictEqual(tableChildren.length, 2) + }) + + it('should handle mixed entity types correctly', async function () { + mockGlueClient.send.resolves({ + Entities: [ + { EntityName: 'schema1', Category: 'SCHEMA', Label: 'Schema 1' }, + { EntityName: 'table1', Category: 'TABLE', Label: 'Table 1' }, + ], + }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 2) // schema + tables container + }) + + it('should handle table columns', async function () { + const mockEntity = { EntityName: 'test-table', Category: 'TABLE' } + + mockGlueClient.send.callsFake((command) => { + if (command instanceof DescribeEntityCommand) { + return Promise.resolve({ + Fields: [ + { FieldName: 'col1', FieldType: 'string', Label: 'Column 1' }, + { FieldName: 'col2', FieldType: 'int', Label: 'Column 2' }, + ], + }) + } + if (command instanceof ListEntitiesCommand) { + return Promise.resolve({ + Entities: [mockEntity], + }) + } + return Promise.resolve({}) + }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + const tablesContainer = children[0] + const tableNodes = await tablesContainer.getChildren!() + const tableNode = tableNodes[0] + + const columns = await tableNode.getChildren!() + assert.strictEqual(columns.length, 2) + + const columnTreeItem = await columns[0].getTreeItem() + assert.strictEqual(columnTreeItem.description, 'string') + }) + + it('should handle API errors gracefully', async function () { + mockGlueClient.send.rejects(new Error('API Error')) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + assert.ok(children[0].id.includes('error')) + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts index fc74eeab435..137df4fafaf 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts @@ -11,6 +11,7 @@ import { SageMakerUnifiedStudioProjectNode } from '../../../../sagemakerunifieds import { SageMakerUnifiedStudioSpacesParentNode } from '../../../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode' import { SagemakerClient } from '../../../../shared/clients/sagemaker' import { SmusAuthenticationProvider } from '../../../../sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider' +import * as setContext from '../../../../shared/vscode/setContext' describe('SageMakerUnifiedStudioComputeNode', function () { let computeNode: SageMakerUnifiedStudioComputeNode @@ -71,10 +72,13 @@ describe('SageMakerUnifiedStudioComputeNode', function () { assert.deepStrictEqual(children, []) }) - it('returns connection nodes and spaces node when project is selected', async function () { + it('returns connection nodes and spaces node when project is selected (non-express mode)', async function () { const mockProject = { id: 'project-123', name: 'Test Project' } ;(mockParent.getProject as sinon.SinonStub).returns(mockProject) + // Mock express mode to be false + sinon.stub(setContext, 'getContext').returns(false) + const children = await computeNode.getChildren() assert.strictEqual(children.length, 3) @@ -82,6 +86,19 @@ describe('SageMakerUnifiedStudioComputeNode', function () { assert.strictEqual(children[1].id, 'Data processing') assert.ok(children[2] instanceof SageMakerUnifiedStudioSpacesParentNode) }) + + it('returns only spaces node when project is selected (express mode)', async function () { + const mockProject = { id: 'project-123', name: 'Test Project' } + ;(mockParent.getProject as sinon.SinonStub).returns(mockProject) + + // Mock express mode to be true + sinon.stub(setContext, 'getContext').returns(true) + + const children = await computeNode.getChildren() + + assert.strictEqual(children.length, 1) + assert.ok(children[0] instanceof SageMakerUnifiedStudioSpacesParentNode) + }) }) describe('getParent', function () { diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts index 686c85a0055..18778c52664 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts @@ -50,14 +50,24 @@ describe('SageMakerUnifiedStudioConnectionParentNode', function () { } as any mockComputeNode = { - authProvider: {} as any, + authProvider: { + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + getDomainId: sinon.stub().returns('domain-123'), + getDomainRegion: sinon.stub().returns('us-east-1'), + } as any, parent: { project: mockProject, } as any, } as any // Stub static methods - sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').resolves(mockDataZoneClient as any) sinon.stub(getLogger(), 'debug') connectionParentNode = new SageMakerUnifiedStudioConnectionParentNode( @@ -135,7 +145,17 @@ describe('SageMakerUnifiedStudioConnectionParentNode', function () { it('handles missing project information gracefully', async function () { const nodeWithoutProject = new SageMakerUnifiedStudioConnectionParentNode( { - authProvider: {} as any, + authProvider: { + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + getDomainId: sinon.stub().returns('domain-123'), + getDomainRegion: sinon.stub().returns('us-east-1'), + } as any, parent: { project: undefined, } as any, @@ -164,7 +184,7 @@ describe('SageMakerUnifiedStudioConnectionParentNode', function () { describe('error handling', function () { it('handles DataZoneClient.getInstance error', async function () { sinon.restore() - sinon.stub(DataZoneClient, 'getInstance').rejects(new Error('Client error')) + sinon.stub(DataZoneClient, 'createWithCredentials').rejects(new Error('Client error')) sinon.stub(getLogger(), 'debug') try { diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts index 991e5955989..171564c61c3 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts @@ -13,6 +13,7 @@ import { SmusAuthenticationProvider } from '../../../../sagemakerunifiedstudio/a import * as s3Strategy from '../../../../sagemakerunifiedstudio/explorer/nodes/s3Strategy' import * as redshiftStrategy from '../../../../sagemakerunifiedstudio/explorer/nodes/redshiftStrategy' import * as lakehouseStrategy from '../../../../sagemakerunifiedstudio/explorer/nodes/lakehouseStrategy' +import * as setContext from '../../../../shared/vscode/setContext' describe('SageMakerUnifiedStudioDataNode', function () { let sandbox: sinon.SinonSandbox @@ -50,6 +51,14 @@ describe('SageMakerUnifiedStudioDataNode', function () { getProjectCredentialProvider: sandbox.stub().resolves(mockProjectCredentialProvider), getConnectionCredentialsProvider: sandbox.stub().resolves(mockProjectCredentialProvider), getDomainRegion: sandbox.stub().returns('us-east-1'), + getDomainId: sandbox.stub().returns('domain-123'), + getDerCredentialsProvider: sandbox.stub().resolves({ + getCredentials: sandbox.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any mockDataZoneClient = { @@ -60,7 +69,7 @@ describe('SageMakerUnifiedStudioDataNode', function () { getRegion: sandbox.stub().returns('us-east-1'), } as any - sandbox.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sandbox.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) sandbox.stub(SmusAuthenticationProvider, 'fromContext').returns(mockAuthProvider as any) sandbox.stub(s3Strategy, 'createS3ConnectionNode').returns({ id: 's3-node', @@ -161,6 +170,9 @@ describe('SageMakerUnifiedStudioDataNode', function () { { connectionId: 'redshift-conn', type: 'REDSHIFT', name: 'redshift-connection' }, ] + // Mock express mode to be false so Redshift connections are included + sandbox.stub(setContext, 'getContext').returns(false) + mockDataZoneClient.listConnections.resolves(mockConnections as any) mockDataZoneClient.getConnection .onFirstCall() @@ -209,7 +221,6 @@ describe('SageMakerUnifiedStudioDataNode', function () { const mockConnections = [{ connectionId: 's3-conn', type: 'S3', name: 's3-connection' }] mockDataZoneClient.listConnections.resolves(mockConnections as any) - mockDataZoneClient.getConnection.rejects(new Error('Connection error')) const children = await dataNode.getChildren() @@ -217,6 +228,9 @@ describe('SageMakerUnifiedStudioDataNode', function () { assert.strictEqual(children.length, 1) assert.strictEqual(children[0].id, 'bucket-parent') + // Mock connection credentials provider to reject when bucket is expanded + mockAuthProvider.getConnectionCredentialsProvider.rejects(new Error('Connection error')) + // Error should occur when expanding the Bucket node const bucketChildren = await children[0].getChildren!() assert.strictEqual(bucketChildren.length, 1) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts index 2fd8317fe06..908e869dff7 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts @@ -38,6 +38,14 @@ describe('SageMakerUnifiedStudioProjectNode', function () { getProjectCredentialProvider: sinon.stub(), getDomainRegion: sinon.stub().returns('us-west-2'), getDomainAccountId: sinon.stub().resolves('123456789012'), + getDomainId: sinon.stub().returns('test-domain'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any // Create mock extension context @@ -63,7 +71,7 @@ describe('SageMakerUnifiedStudioProjectNode', function () { } as any // Stub DataZoneClient static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) // Stub SagemakerClient constructor sinon.stub(SagemakerClient.prototype, 'dispose') diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts index 4c0cad57366..1b9ca657d34 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts @@ -81,7 +81,7 @@ describe('SmusRootNode', function () { } as any // Stub DataZoneClient static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) }) afterEach(function () { @@ -271,7 +271,7 @@ describe('SelectSMUSProject', function () { } as any // Stub DataZoneClient static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) // Stub SmusAuthenticationProvider sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ @@ -281,6 +281,13 @@ describe('SelectSMUSProject', function () { getDomainAccountId: sinon.stub().resolves('123456789012'), getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns('us-west-2'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any) // Stub quickPick - return the project directly (not wrapped in an item) @@ -458,12 +465,19 @@ describe('selectSMUSProject - Additional Tests', function () { setProject: sinon.stub(), } as any - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ activeConnection: { domainId: testDomainId, ssoRegion: 'us-west-2' }, getDomainAccountId: sinon.stub().resolves('123456789012'), getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns('us-west-2'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any) const mockQuickPick = { diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts index 31481e70953..bac76fa094c 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts @@ -30,6 +30,15 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { } as any mockAuthProvider = { activeConnection: { domainId: 'test-domain', ssoRegion: 'us-west-2' }, + getDomainId: sinon.stub().returns('test-domain'), + getDomainRegion: sinon.stub().returns('us-west-2'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any mockSagemakerClient = sinon.createStubInstance(SagemakerClient) mockSagemakerClient.fetchSpaceAppsAndDomains.resolves([new Map(), new Map()]) @@ -44,7 +53,7 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { getToolingEnvironment: sinon.stub(), } as any - sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').resolves(mockDataZoneClient as any) sinon.stub(getLogger(), 'debug') sinon.stub(getLogger(), 'error') sinon.stub(SmusUtils, 'extractSSOIdFromUserId').returns('user-12345') @@ -154,7 +163,7 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { }) it('throws error when DataZone client not initialized', async function () { - ;(DataZoneClient.getInstance as sinon.SinonStub).resolves(undefined) + ;(DataZoneClient.createWithCredentials as sinon.SinonStub).resolves(undefined) await assert.rejects( async () => await spacesNode.getSageMakerDomainId(), diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts index 988f360eaf7..bc756ed17ea 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts @@ -46,40 +46,50 @@ describe('DataZoneClient', () => { getCredentialsProviderForIamProfile: sinon.stub(), } as any - // Set up the DataZoneClient using getInstance since constructor is private - DataZoneClient.dispose() - dataZoneClient = await DataZoneClient.getInstance(mockAuthProvider) + // Create mock credentials provider + const mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + getCredentialsId: () => ({ credentialSource: 'temp' as const, credentialTypeId: 'test' }), + getProviderType: () => 'temp' as const, + getTelemetryType: () => 'other' as any, + getDefaultRegion: () => testRegion, + getHashCode: () => 'test-hash', + canAutoConnect: () => Promise.resolve(false), + isAvailable: () => Promise.resolve(true), + } + + // Set up the DataZoneClient using createWithCredentials + dataZoneClient = DataZoneClient.createWithCredentials(testRegion, testDomainId, mockCredentialsProvider) }) afterEach(() => { sinon.restore() }) - describe('getInstance', () => { - it('should return singleton instance', async () => { - const instance1 = await DataZoneClient.getInstance(mockAuthProvider) - const instance2 = await DataZoneClient.getInstance(mockAuthProvider) - - assert.strictEqual(instance1, instance2) - }) - - it('should create new instance after dispose', async () => { - const instance1 = await DataZoneClient.getInstance(mockAuthProvider) - DataZoneClient.dispose() - const instance2 = await DataZoneClient.getInstance(mockAuthProvider) - - assert.notStrictEqual(instance1, instance2) - }) - }) - - describe('dispose', () => { - it('should clear singleton instance', async () => { - const instance = await DataZoneClient.getInstance(mockAuthProvider) - DataZoneClient.dispose() + describe('createWithCredentials', () => { + it('should create new instance with credentials', () => { + const mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + }), + getCredentialsId: () => ({ credentialSource: 'temp' as const, credentialTypeId: 'test' }), + getProviderType: () => 'temp' as const, + getTelemetryType: () => 'other' as any, + getDefaultRegion: () => testRegion, + getHashCode: () => 'test-hash', + canAutoConnect: () => Promise.resolve(false), + isAvailable: () => Promise.resolve(true), + } - // Should create new instance after dispose - const newInstance = await DataZoneClient.getInstance(mockAuthProvider) - assert.notStrictEqual(instance, newInstance) + const instance = DataZoneClient.createWithCredentials(testRegion, testDomainId, mockCredentialsProvider) + assert.ok(instance) + assert.strictEqual(instance.getRegion(), testRegion) + assert.strictEqual(instance.getDomainId(), testDomainId) }) }) @@ -164,6 +174,9 @@ describe('DataZoneClient', () => { getEnvironmentCredentials: sinon.stub().resolves(mockCredentials), } + // Mock getToolingBlueprintName to return 'Tooling' + sinon.stub(dataZoneClient as any, 'getToolingBlueprintName').returns('Tooling') + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) const result = await dataZoneClient.getProjectDefaultEnvironmentCreds('project-1') @@ -228,9 +241,7 @@ describe('DataZoneClient', () => { describe('fetchAllProjects', function () { it('fetches all projects by handling pagination', async function () { - const client = await DataZoneClient.getInstance(mockAuthProvider) - - // Create a stub for listProjects that returns paginated results + // Create a stub for listProjects that returns paginated resultssults const listProjectsStub = sinon.stub() // First call returns first page with nextToken @@ -260,10 +271,10 @@ describe('DataZoneClient', () => { }) // Replace the listProjects method with our stub - client.listProjects = listProjectsStub + dataZoneClient.listProjects = listProjectsStub // Call fetchAllProjects - const result = await client.fetchAllProjects() + const result = await dataZoneClient.fetchAllProjects() // Verify results assert.strictEqual(result.length, 2) @@ -283,8 +294,6 @@ describe('DataZoneClient', () => { }) it('returns empty array when no projects found', async function () { - const client = await DataZoneClient.getInstance(mockAuthProvider) - // Create a stub for listProjects that returns empty results const listProjectsStub = sinon.stub().resolves({ projects: [], @@ -292,10 +301,10 @@ describe('DataZoneClient', () => { }) // Replace the listProjects method with our stub - client.listProjects = listProjectsStub + dataZoneClient.listProjects = listProjectsStub // Call fetchAllProjects - const result = await client.fetchAllProjects() + const result = await dataZoneClient.fetchAllProjects() // Verify results assert.strictEqual(result.length, 0) @@ -303,16 +312,14 @@ describe('DataZoneClient', () => { }) it('handles errors gracefully', async function () { - const client = await DataZoneClient.getInstance(mockAuthProvider) - // Create a stub for listProjects that throws an error const listProjectsStub = sinon.stub().rejects(new Error('API error')) // Replace the listProjects method with our stub - client.listProjects = listProjectsStub + dataZoneClient.listProjects = listProjectsStub // Call fetchAllProjects and expect it to throw - await assert.rejects(() => client.fetchAllProjects(), /API error/) + await assert.rejects(() => dataZoneClient.fetchAllProjects(), /API error/) }) }) @@ -327,6 +334,9 @@ describe('DataZoneClient', () => { }), } + // Mock getToolingBlueprintName to return 'Tooling' + sinon.stub(dataZoneClient as any, 'getToolingBlueprintName').returns('Tooling') + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) const result = await dataZoneClient.getToolingEnvironmentId('domain-1', 'project-1') @@ -387,6 +397,9 @@ describe('DataZoneClient', () => { getEnvironment: sinon.stub().resolves(mockEnvironment), } + // Mock getToolingBlueprintName to return 'Tooling' + sinon.stub(dataZoneClient as any, 'getToolingBlueprintName').returns('Tooling') + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) const result = await dataZoneClient.getToolingEnvironment('project-123') @@ -408,7 +421,7 @@ describe('DataZoneClient', () => { await assert.rejects( () => dataZoneClient.getToolingEnvironment('project-123'), - /Failed to get tooling environment ID: No default Tooling environment found for project/ + /No default Tooling environment found for project/ ) }) @@ -518,7 +531,7 @@ describe('DataZoneClient', () => { stsClientStub = sinon.stub(DefaultStsClient.prototype, 'getCallerIdentity') // Stub SmusUtils method - convertAssumedRoleArnStub = sinon.stub(SmusUtils, 'convertAssumedRoleArnToIamRoleArn') + convertAssumedRoleArnStub = sinon.stub(SmusUtils as any, 'convertAssumedRoleArnToIamRoleArn') }) afterEach(() => { @@ -552,7 +565,6 @@ describe('DataZoneClient', () => { assert.strictEqual(result, mockUserProfileId) // Verify the flow - assert.ok(mockAuthProvider.getCredentialsProviderForIamProfile.calledWith('test-profile')) assert.ok(stsClientStub.calledOnce) assert.ok(convertAssumedRoleArnStub.calledWith(mockStsResponse.Arn)) assert.ok( From 96e637604e3178e9f2a65832d83d50afd17fd2cc Mon Sep 17 00:00:00 2001 From: Bhargav Date: Wed, 15 Oct 2025 15:55:48 -0700 Subject: [PATCH 09/53] =?UTF-8?q?fix(smus):=20Fix=20cred=20provider=20in?= =?UTF-8?q?=20Space=20environment=20to=20handle=20express=20d=E2=80=A6=20(?= =?UTF-8?q?#2253)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Description** Express domains set up the credential profile differently. Instead of a credential process, it is now vended from container. So depending on what is available, having client use correct cred provider approach. **Motivation** Fix remote experience for express domains **Testing Done** Tested by manually adding VSIX to Space. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../providers/smusAuthenticationProvider.ts | 64 ++++++++- .../shared/smusUtils.ts | 29 ++++ .../auth/smusAuthenticationProvider.test.ts | 131 ++++++++++++++++++ 3 files changed, 220 insertions(+), 4 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index eb95303d3b0..bc03100e1d0 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -15,7 +15,12 @@ import * as localizedText from '../../../shared/localizedText' import { ToolkitPromptSettings } from '../../../shared/settings' import { setContext, getContext } from '../../../shared/vscode/setContext' import { getLogger } from '../../../shared/logger/logger' -import { SmusUtils, SmusErrorCodes, extractAccountIdFromResourceMetadata } from '../../shared/smusUtils' +import { + SmusUtils, + SmusErrorCodes, + extractAccountIdFromResourceMetadata, + convertToToolkitCredentialProvider, +} from '../../shared/smusUtils' import { createSmusProfile, isValidSmusConnection, @@ -39,6 +44,8 @@ import { DefaultStsClient } from '../../../shared/clients/stsClient' import { DataZoneDomainPreferencesClient } from '../../shared/client/datazoneDomainPreferencesClient' import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' import { DataZoneClient } from '../../shared/client/datazoneClient' +import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' +import { fromContainerMetadata, fromNodeProviderChain } from '@aws-sdk/credential-providers' /** * Sets the context variable for SageMaker Unified Studio connection state @@ -1019,9 +1026,58 @@ export class SmusAuthenticationProvider { if (getContext('aws.smus.inSmusSpaceEnvironment')) { // When in SMUS space, DomainExecutionRoleCreds can be found in config file // Read the credentials from credential profile DomainExecutionRoleCreds - const credentials = fromIni({ profile: 'DomainExecutionRoleCreds' }) - return { - getCredentials: async () => await credentials(), + try { + // Load AWS config file to check profile configuration + const { configFile } = await loadSharedConfigFiles() + const profileConfig = configFile['DomainExecutionRoleCreds'] + + if (profileConfig?.credential_process) { + // Normal SMUS domain: Use the profile with credential_process + logger.debug('SMUS: Using DomainExecutionRoleCreds profile with credential_process') + const credentials = fromIni({ profile: 'DomainExecutionRoleCreds' }) + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'DomainExecutionRoleCreds', + `smus-der-profile:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) + } else if (profileConfig?.credential_source === 'EcsContainer') { + // Express domain with EcsContainer: Use ECS container credentials directly + // The environment has AWS_CONTAINER_CREDENTIALS_RELATIVE_URI set, so use fromContainerMetadata + // which properly handles the ECS credential endpoint + logger.debug('SMUS: Express domain detected, using ECS container credentials') + const credentials = fromContainerMetadata({ + timeout: 5000, + maxRetries: 3, + }) + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'EcsContainer', + `smus-ecs-container:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) + } else { + // Fallback: try the profile anyway + logger.debug( + 'SMUS: Unknown profile configuration, attempting to use DomainExecutionRoleCreds profile' + ) + const credentials = fromIni({ profile: 'DomainExecutionRoleCreds' }) + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'DomainExecutionRoleCreds-fallback', + `smus-der-fallback:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) + } + } catch (error) { + logger.error('SMUS: Failed to load config file, falling back to default credential chain: %s', error) + const credentials = fromNodeProviderChain() + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'NodeProviderChain', + `smus-node-provider-chain:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) } } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 9c2427b8b4e..68f603eb19b 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -8,6 +8,9 @@ import { ToolkitError } from '../../shared/errors' import { isSageMaker } from '../../shared/extensionUtilities' import { getResourceMetadata } from './utils/resourceMetadataUtils' import fetch from 'node-fetch' +import { CredentialsProvider, CredentialsProviderType } from '../../auth/providers/credentials' +import { CredentialType } from '../../shared/telemetry/telemetry' +import { AwsCredentialIdentity } from '@aws-sdk/types' /** * Represents SSO instance information retrieved from DataZone @@ -468,3 +471,29 @@ export async function extractAccountIdFromResourceMetadata(): Promise { throw new Error('Failed to extract AWS account ID from ResourceArn in SMUS space environment') } } + +/** + * Creates a CredentialsProvider from an AWS credentials function + * @param credentialsFunction Function that returns AWS credentials + * @param credentialTypeId Identifier for the credential type + * @param hashCode Unique hash code for caching + * @param region Domain region + * @returns Complete CredentialsProvider object + */ +export function convertToToolkitCredentialProvider( + credentialsFunction: () => Promise, + credentialTypeId: string, + hashCode: string, + region: string +): CredentialsProvider { + return { + getCredentials: credentialsFunction, + getCredentialsId: () => ({ credentialSource: 'temp' as const, credentialTypeId }), + getProviderType: () => 'temp' as CredentialsProviderType, + getTelemetryType: () => 'other' as CredentialType, + getDefaultRegion: () => region, + getHashCode: () => hashCode, + canAutoConnect: () => Promise.resolve(false), + isAvailable: () => Promise.resolve(true), + } +} diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 86c503f0627..0a51b098890 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -31,6 +31,7 @@ describe('SmusAuthenticationProvider', function () { let isInSmusSpaceEnvironmentStub: sinon.SinonStub let executeCommandStub: sinon.SinonStub let setContextStubGlobal: sinon.SinonStub + let getResourceMetadataStub: sinon.SinonStub let mockSecondaryAuthState: { activeConnection: SmusConnection | undefined hasSavedConnection: boolean @@ -1214,4 +1215,134 @@ describe('SmusAuthenticationProvider', function () { assert.strictEqual((result as any)?.type, 'iam') }) }) + + describe('getDerCredentialsProvider', function () { + let getContextStub: sinon.SinonStub + + beforeEach(function () { + getContextStub = sinon.stub(vscodeSetContext, 'getContext') + + // Clear cache + smusAuthProvider['credentialsProviderCache'].clear() + }) + + describe('in SMUS space environment', function () { + beforeEach(function () { + getContextStub.withArgs('aws.smus.inSmusSpaceEnvironment').returns(true) + + // Mock resource metadata for SMUS space environment + getResourceMetadataStub = sinon.stub(resourceMetadataUtils, 'getResourceMetadata').returns({ + ResourceArn: 'arn:aws:sagemaker:us-east-2:123456789012:app/dzd_domainId/test-app', + AdditionalMetadata: { + DataZoneDomainId: testDomainId, + DataZoneDomainRegion: testRegion, + }, + } as any) + }) + + afterEach(function () { + getResourceMetadataStub?.restore() + }) + + it('should return a credentials provider that can retrieve credentials', async function () { + // In SMUS space environment, the method should return a provider + // We can't easily test the internal branching logic without stubbing ES modules + // So we test that it returns a valid provider structure + const provider = await smusAuthProvider.getDerCredentialsProvider() + + assert.ok(provider, 'Provider should be returned') + assert.ok(typeof provider.getCredentials === 'function', 'Provider should have getCredentials method') + }) + + it('should not cache providers in SMUS space environment', async function () { + // Get provider twice + const provider1 = await smusAuthProvider.getDerCredentialsProvider() + const provider2 = await smusAuthProvider.getDerCredentialsProvider() + + // In SMUS space, providers are not cached (new provider each time) + // This is because the logic returns early before caching + assert.ok(provider1) + assert.ok(provider2) + }) + }) + + describe('in non-SMUS space environment', function () { + let getAccessTokenStub: sinon.SinonStub + + beforeEach(function () { + getContextStub.withArgs('aws.smus.inSmusSpaceEnvironment').returns(false) + mockSecondaryAuthState.activeConnection = mockSmusConnection + getAccessTokenStub = sinon.stub(smusAuthProvider, 'getAccessToken').resolves('mock-access-token') + }) + + it('should create and cache DomainExecRoleCredentialsProvider for SSO connection', async function () { + const provider = await smusAuthProvider.getDerCredentialsProvider() + + assert.ok(provider) + assert.ok(getAccessTokenStub.notCalled) // Not called until getCredentials is invoked + + // Verify caching + const cachedProvider = await smusAuthProvider.getDerCredentialsProvider() + assert.strictEqual(provider, cachedProvider) + }) + + it('should throw error when no active connection', async function () { + mockSecondaryAuthState.activeConnection = undefined + + await assert.rejects( + () => smusAuthProvider.getDerCredentialsProvider(), + (err: ToolkitError) => { + return ( + err.code === 'NoActiveConnection' && + err.message.includes('No active SMUS connection available') + ) + } + ) + }) + + it('should throw error for non-SSO connection', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + await assert.rejects( + () => smusAuthProvider.getDerCredentialsProvider(), + (err: ToolkitError) => { + return ( + err.code === 'InvalidConnectionType' && + err.message.includes( + 'Domain Execution Role credentials are only available for SSO connections' + ) + ) + } + ) + }) + + it('should use cached provider for same connection', async function () { + const provider1 = await smusAuthProvider.getDerCredentialsProvider() + const provider2 = await smusAuthProvider.getDerCredentialsProvider() + + assert.strictEqual(provider1, provider2) + }) + + it('should create different providers for different connections', async function () { + const provider1 = await smusAuthProvider.getDerCredentialsProvider() + + // Change connection + const differentConnection = { + ...mockSmusConnection, + id: 'different-connection-id', + domainId: 'different-domain-id', + } + mockSecondaryAuthState.activeConnection = differentConnection + + const provider2 = await smusAuthProvider.getDerCredentialsProvider() + + assert.notStrictEqual(provider1, provider2) + }) + }) + }) }) From a13e36c81225cd2db327fc0739a531590ed8cdc6 Mon Sep 17 00:00:00 2001 From: Bhavya Sharma Date: Mon, 20 Oct 2025 12:37:27 -0700 Subject: [PATCH 10/53] feat(smus): Add Kiro CLI path detection for all platforms (#2255) ## Problem The existing getVscodeCliPath() function in pathFind.ts had platform specific Kiro CLI path detection logic mixed with the general VSCode CLI path detection. ## Solution Kiro-specific CLI path detection into a specific getKiroCliPaths() function which is not platform dependent. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../core/src/shared/utilities/pathFind.ts | 66 +++++++++++-------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/packages/core/src/shared/utilities/pathFind.ts b/packages/core/src/shared/utilities/pathFind.ts index 2fb25994031..56ccc236800 100644 --- a/packages/core/src/shared/utilities/pathFind.ts +++ b/packages/core/src/shared/utilities/pathFind.ts @@ -66,37 +66,30 @@ export async function getVscodeCliPath(): Promise { const vscExe = process.argv0 const ideType = getIdeType() const isKiro = ideType === 'kiro' - const isWindows = process.platform === 'win32' - // https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 - const vscs = [ - // Special case for flatpak (steamdeck). #V896741845 - // https://github.com/flathub/com.visualstudio.code/blob/master/code.sh - '/app/bin/code', - // Note: macOS does not have a separate "code-insiders" binary. - path.resolve(`${vscode.env.appRoot}/bin/code`), // macOS - path.resolve(`${vscode.env.appRoot}/../../bin/code`), // Windows - path.resolve(`${vscode.env.appRoot}/../../bin/code-insiders`), // Windows - // Kiro-specific paths for Windows - ...(isKiro && isWindows - ? [ - path.resolve(`${vscode.env.appRoot}/../../bin/kiro.cmd`), - path.resolve(`${vscode.env.appRoot}/../../bin/kiro`), - ] - : []), - // Linux example "appRoot": vscode-linux-x64-1.42.0/VSCode-linux-x64/resources/app - path.resolve(`${vscode.env.appRoot}/code`), - path.resolve(vscExe, '../bin/code-insiders'), - path.resolve(vscExe, '../bin/code'), - path.resolve(vscExe, '../../bin/code-insiders'), - path.resolve(vscExe, '../../bin/code'), - '/usr/bin/code', - // Kiro fallbacks - ...(isKiro ? ['kiro', 'kiro.cmd'] : []), - 'code', // $PATH - ] + const vscs = isKiro + ? getKiroCliPaths(vscExe) + : [ + // https://github.com/microsoft/vscode-test/blob/4bdccd4c386813a8158b0f9b96f31cbbecbb3374/lib/util.ts#L133 + // Special case for flatpak (steamdeck). #V896741845 + // https://github.com/flathub/com.visualstudio.code/blob/master/code.sh + '/app/bin/code', + // Note: macOS does not have a separate "code-insiders" binary. + path.resolve(`${vscode.env.appRoot}/bin/code`), // macOS + path.resolve(`${vscode.env.appRoot}/../../bin/code`), // Windows + path.resolve(`${vscode.env.appRoot}/../../bin/code-insiders`), // Windows + // Linux example "appRoot": vscode-linux-x64-1.42.0/VSCode-linux-x64/resources/app + path.resolve(`${vscode.env.appRoot}/code`), + path.resolve(vscExe, '../bin/code-insiders'), + path.resolve(vscExe, '../bin/code'), + path.resolve(vscExe, '../../bin/code-insiders'), + path.resolve(vscExe, '../../bin/code'), + '/usr/bin/code', + 'code', // $PATH + ] + for (const vsc of vscs) { - if (!vsc || (vsc !== 'code' && !(await fs.exists(vsc)))) { + if (!vsc || (vsc !== 'code' && vsc !== 'kiro' && !(await fs.exists(vsc)))) { continue } if (await tryRun(vsc, ['--version'])) { @@ -108,6 +101,21 @@ export async function getVscodeCliPath(): Promise { return undefined } +/** + * Gets Kiro CLI paths + */ +function getKiroCliPaths(vscExe: string): string[] { + return [ + path.resolve(`${vscode.env.appRoot}/bin/kiro`), + path.resolve(`${vscode.env.appRoot}/../../bin/kiro`), + path.resolve(`${vscode.env.appRoot}/kiro`), + path.resolve(vscExe, '../bin/kiro'), + path.resolve(vscExe, '../../bin/kiro'), + '/usr/bin/kiro', + 'kiro', + ] +} + /** * Searches for `tsc` in the current workspace, or the system (tries `tsc` * using current $PATH). From 9e6b35754c9bad958553b14887a828a8296707bc Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Mon, 20 Oct 2025 14:16:49 -0700 Subject: [PATCH 11/53] fix(sagemakerunifiedstudio): Rework Kiro connection and timeout logic (#2257) ## Problem ## Solution - Increment sagemaker-ssh-kiro patch version - Fix issue where the prompt to update the sagemaker-ssh-kiro extension be displayed again after successfully updating the extension - Fix transient connection issue where the server install command (which downloads and starts a remote Kiro server on the Space) would fail to find the Kiro server log file immediately after starting the Kiro server, solved by adding retries - Fix transient connection issue when connecting to a freshly-started Space, where the SSH client could fail to connect over the SSM Session if the remote-access-server hadn't started yet, solved by waiting for explicit signals from the remote-access-server before attempting the SSH connection (previously this was done only for Windows) - Fix issue where connection failure could take minutes to surface (via timeout), instead of failing fast, when the sagemaker_connect script process exited prematurely - Fix issue where Kiro would indefinitely try to reconnect to the Space after a successful remote connection closed unexpectedly (e.g., due to network error), which would lead to many browser tabs being opened to display errors seen by the detached server - Add logging around the SSM and SSH connection sequence to help with debugging - Update the "Connection limit reached" error message to suggest the user try restarting the Space, given that there is a pending issue seen in Kiro where SSM Sessions can be leaked and take some time to clean up - Rework timeout handling to use Promise.race as it scales better when multiple async operations can trigger an error --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../sagemaker/detached-server/errorPage.ts | 2 +- .../sagemaker/sagemakerSshKiroUtils.ts | 23 +++- .../sagemaker/sagemakerSshKiroUtils.test.ts | 31 +++++ packages/sagemaker-ssh-kiro/package.json | 2 +- .../sagemaker-ssh-kiro/src/authResolver.ts | 120 +++++++++++------- .../src/common/promiseUtils.ts | 43 ++----- .../sagemaker-ssh-kiro/src/serverSetup.ts | 88 +++++++++---- .../sagemaker-ssh-kiro/src/sshConnection.ts | 25 ++-- 8 files changed, 215 insertions(+), 119 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts b/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts index 2cafa824442..1d9f55bfbf5 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/errorPage.ts @@ -75,7 +75,7 @@ export const ErrorText = { }, [ExceptionType.RESOURCE_LIMIT_EXCEEDED]: { Title: 'Connection limit reached', - Text: 'You have 10 active remote connections to this space. Stop an existing connection to start a new one.', + Text: 'You have 10 active remote connections to this space. Stop an existing connection to start a new one. If the problem persists, try restarting the Space.', }, [ExceptionType.THROTTLING]: { Title: 'Too many connection attempts', diff --git a/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts index d8f44d4f239..bdf8df71f83 100644 --- a/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts +++ b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts @@ -20,6 +20,7 @@ const pluginTechnicalName = 'sagemaker-ssh-kiro' const pluginDisplayName = 'Amazon SageMaker SSH Plugin for Kiro' const minKiroVersion = '0.3.0' +let updatedExtensionToVersion: string let vscodeProductJson: any async function getEditorProductJson() { @@ -100,16 +101,17 @@ export async function ensureSageMakerSshKiroExtension(ctx: vscode.ExtensionConte // Check if extension is already installed with the correct version const installedExtension = vscode.extensions.getExtension(VSCODE_EXTENSION_ID.sagemakerSshKiro) + const installedVersion = updatedExtensionToVersion ?? installedExtension?.packageJSON.version - if (installedExtension) { - if (installedExtension.packageJSON.version === embeddedVersion) { + if (installedVersion) { + if (installedVersion === embeddedVersion) { logger.info( `The ${pluginTechnicalName} extension is already installed with expected version ${embeddedVersion}.` ) return } else { logger.info( - `The ${pluginTechnicalName} extension is installed with version ${installedExtension.packageJSON.version}, but expected version ${embeddedVersion}` + `The ${pluginTechnicalName} extension is installed with version ${installedVersion}, but expected version ${embeddedVersion}` ) } } else { @@ -119,14 +121,13 @@ export async function ensureSageMakerSshKiroExtension(ctx: vscode.ExtensionConte } // Determine if this is an update or new installation - const isUpdate = installedExtension !== undefined - const currentVersion = installedExtension?.packageJSON.version + const isUpdate = installedVersion !== undefined // Prompt user for confirmation const actionText = isUpdate ? 'update' : 'install' const confirmButtonText = isUpdate ? 'Update' : 'Install' const installOrUpdateQuestion = isUpdate - ? `update from version ${currentVersion} to ${embeddedVersion}` + ? `update from version ${installedVersion} to ${embeddedVersion}` : `install version ${embeddedVersion}` const ok = await showConfirmationMessage({ @@ -148,6 +149,16 @@ export async function ensureSageMakerSshKiroExtension(ctx: vscode.ExtensionConte // Install the extension await vscode.commands.executeCommand('workbench.extensions.installExtension', vscode.Uri.file(embeddedPath)) + if (isUpdate) { + // After the extension is updated, calls to `vscode.extensions.getExtension` will not reflect the change unless + // the user restarts their extension host which would be disruptive as it would interrupt this entire flow, so + // we need to remember the version that we updated to, or else we will prompt the user to update the extension + // for every space connection attempt. Even if the current extension host is still running an older version of + // the extension, the new remote workspace window will have a new extension host process so it will always take + // the most recently installed version. + updatedExtensionToVersion = embeddedVersion + } + logger.info(`Installed the ${pluginTechnicalName} extension (version ${embeddedVersion}).`) // Show success notification diff --git a/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts index c256b1672af..7a9e5d7f114 100644 --- a/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts +++ b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts @@ -240,6 +240,37 @@ describe('SageMaker SSH Kiro Utils', () => { ) }) + it('should not prompt for update when previously applied', async () => { + getExtensionStub + .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) + .returns({ packageJSON: { version: '0.0.9' } }) + + let didShowUpdatePrompt = false + + getTestWindow().onDidShowMessage((message) => { + if (message.message.match(/needs to be updated.*from version 0.0.9 to 0.1.0/i)) { + if (didShowUpdatePrompt) { + throw new Error('Should not be prompted to update a second time') + } + message.selectItem('Update') + didShowUpdatePrompt = true + return + } + }) + + await ensureSageMakerSshKiroExtension(mockContext) + + await getTestWindow().waitForMessage(/updated to version 0.1.0/i) + sinon.assert.calledWith( + executeCommandStub, + 'workbench.extensions.installExtension', + vscode.Uri.file('/mock/extension/path/resources/sagemaker-ssh-kiro-0.1.0.vsix') + ) + + // Call it again to trigger the update check again (should not prompt for update) + await ensureSageMakerSshKiroExtension(mockContext) + }) + it('throws error when user declines installation', async () => { getExtensionStub.withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro).returns(undefined) diff --git a/packages/sagemaker-ssh-kiro/package.json b/packages/sagemaker-ssh-kiro/package.json index a5f197b28e6..a4290325741 100644 --- a/packages/sagemaker-ssh-kiro/package.json +++ b/packages/sagemaker-ssh-kiro/package.json @@ -2,7 +2,7 @@ "name": "sagemaker-ssh-kiro", "displayName": "Amazon SageMaker SSH Plugin for Kiro", "description": "Plugin for AWS Toolkit that enables secure remote development in Amazon SageMaker Spaces using the Kiro IDE.", - "version": "0.1.0", + "version": "0.1.1", "publisher": "amazonwebservices", "license": "Apache-2.0", "repository": { diff --git a/packages/sagemaker-ssh-kiro/src/authResolver.ts b/packages/sagemaker-ssh-kiro/src/authResolver.ts index af59e3f5357..242b8b79172 100644 --- a/packages/sagemaker-ssh-kiro/src/authResolver.ts +++ b/packages/sagemaker-ssh-kiro/src/authResolver.ts @@ -14,12 +14,15 @@ import * as vscode from 'vscode' import SSHConnection from './sshConnection' import { findRandomPort } from './common/ports' import { disposeAll } from './common/disposable' -import { installCodeServer, ServerInstallError } from './serverSetup' +import { installCodeServer, ServerInstallResult } from './serverSetup' import { waitForMatchingStreamOutput as waitForStreamOutput } from './common/streamUtils' -import { withTimeout } from './common/promiseUtils' +import { rejectAfterSecondsElapsed } from './common/promiseUtils' -// This mirrors the timeout value that the AWS Toolkit writes into the remote.SSH configuration for VS Code. -const connectTimeoutSeconds = 120 +// The SSH client timeout mirrors the timeout value that the AWS Toolkit writes into the remote.SSH configuration for VS Code. +const ssmSessionReadyTimeoutSeconds = 30 +const sshClientConnectTimeoutSeconds = 120 +const installCommandTimeoutSeconds = 120 +const openTunnelTimeoutSeconds = 10 // This is hard-coded rather than imported from the AWS Toolkit core/ package to keep the bundle size low. const awsToolkitExtensionId = 'amazonwebservices.aws-toolkit-vscode' @@ -57,7 +60,7 @@ export class SageMakerSshKiroResolver implements vscode.RemoteAuthorityResolver, resolve(authority: string, context: vscode.RemoteAuthorityResolverContext): Thenable { const { hostname: hostname, user } = validateAuthority(authority) - this.logger.info(`Resolving ssh remote authority '${authority}' (attemp #${context.resolveAttempt})`) + this.logger.info(`Resolving SSH remote authority '${authority}' (attempt #${context.resolveAttempt})`) const awsSagemakerConfig = vscode.workspace.getConfiguration('aws.sagemaker.ssh.kiro') const serverDownloadUrlTemplate = awsSagemakerConfig.get('serverDownloadUrlTemplate') @@ -128,36 +131,51 @@ export class SageMakerSshKiroResolver implements vscode.RemoteAuthorityResolver, this.logger.info(`SageMaker Connect stderr: ${errorText}`) }) - if (isWindows) { - // For Windows, we have to wait until the SSM session provides an appropriate ready signal, - // or else the SSH2 client handshake will fail for some unknown reason. - this.logger.info('Waiting for SSM session to be ready...') - const readySignals = ['Starting session with SessionId:', 'SSH-2.0-Go'] + // This promise will be rejected if the sagemaker_connect script exits (it's not supposed to exit unless we are disconnecting) + // This is used later in Promise.race() calls in order to fail fast while waiting for other operations if the connection closes prematurely + const rejectWhenProxyCommandExits = new Promise((resolve, reject) => { + this.proxyCommandProcess!.on('exit', () => + reject(new Error('SageMaker Connect script exited prematurely')) + ) + }) - try { - await withTimeout( - waitForStreamOutput(this.proxyCommandProcess.stdout, (data: Buffer) => { - const output = data.toString() + // For Windows, we have to wait until the SSM session provides an appropriate ready signal, + // or else the SSH2 client handshake will fail for some unknown reason. + // We also do this for non-Windows because we have seen occasional SSH connection failures + // if the SSH client is given access to the stream while the remote-access-server is still booting. + this.logger.info('Waiting for SSM session to be ready...') + const readySignals = ['Starting session with SessionId:', 'SSH-2.0-Go'] + + try { + await Promise.race([ + rejectWhenProxyCommandExits, + rejectAfterSecondsElapsed( + ssmSessionReadyTimeoutSeconds, + new Error('Timed out waiting for the SSM session to be ready.') + ), + waitForStreamOutput(this.proxyCommandProcess.stdout, (data: Buffer) => { + const output = data.toString() + + if (isWindows) { // The stderr 'data' callback doesn't emit on Windows for some reason (possibly due to the way the sagemaker_connect // powershell script is written), so logging stdout is the only way to see what is happening. this.logger.info(`SageMaker Connect output: ${output}`) + } - for (const signal of readySignals) { - if (output.includes(signal)) { - this.logger.info(`Tunnel ready signal detected: [${signal}]`) - return true - } + for (const signal of readySignals) { + if (output.includes(signal)) { + this.logger.info(`Tunnel ready signal detected: [${signal}]`) + return true } - - return false - }), - 30_000 - ) - } catch (error: unknown) { - const errorMessage = `Failed to establish SSM session: ${error}` - this.logger.error(errorMessage) - throw new Error(errorMessage) - } + } + + return false + }), + ]) + } catch (error: unknown) { + const errorMessage = `Failed to establish SSM session: ${error}` + this.logger.error(errorMessage) + throw new Error(errorMessage) } const proxyStream = stream.Duplex.from({ @@ -169,18 +187,33 @@ export class SageMakerSshKiroResolver implements vscode.RemoteAuthorityResolver, this.sshConnection = new SSHConnection({ sock: proxyStream, username: user, - readyTimeout: connectTimeoutSeconds * 1000, + readyTimeout: sshClientConnectTimeoutSeconds * 1000, }) - await this.sshConnection.connect() - const installResult = await installCodeServer( - this.sshConnection, - serverDownloadUrlTemplate, - defaultExtensions, - false - ) - - const tunnelConfig = await this.openTunnel(0, installResult.listeningOn) + this.logger.info(`Initiating SSH connection with ${sshClientConnectTimeoutSeconds}s timeout...`) + + // The connect() function has built-in timeout handling (configured above) + await Promise.race([rejectWhenProxyCommandExits, this.sshConnection.connect()]) + + this.logger.info('Established SSH connection. Setting up remote server...') + + const installResult = await Promise.race([ + rejectWhenProxyCommandExits as Promise, + rejectAfterSecondsElapsed( + installCommandTimeoutSeconds, + new Error('Timed out while setting up remote server.') + ), + installCodeServer(this.sshConnection, serverDownloadUrlTemplate, defaultExtensions, false), + ]) + + const tunnelConfig = await Promise.race([ + rejectWhenProxyCommandExits as Promise, + rejectAfterSecondsElapsed( + openTunnelTimeoutSeconds, + new Error('Timed out while attempting to open a tunnel.') + ), + this.openTunnel(0, installResult.listeningOn), + ]) this.tunnels.push(tunnelConfig) this.labelFormatterDisposable?.dispose() @@ -224,13 +257,8 @@ export class SageMakerSshKiroResolver implements vscode.RemoteAuthorityResolver, } } - if (e instanceof ServerInstallError || !(e instanceof Error)) { - throw vscode.RemoteAuthorityResolverError.NotAvailable( - e instanceof Error ? e.message : String(e) - ) - } else { - throw vscode.RemoteAuthorityResolverError.TemporarilyNotAvailable(e.message) - } + // Signal to the IDE to not retry the connection. + throw vscode.RemoteAuthorityResolverError.NotAvailable(e?.toString()) } } ) diff --git a/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts b/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts index aea571d8e5c..cc79c71451f 100644 --- a/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts +++ b/packages/sagemaker-ssh-kiro/src/common/promiseUtils.ts @@ -4,34 +4,19 @@ */ /** - * Creates a promise that resolves/rejects when the provided promise settles, or rejects when the timeout expires. + * Creates a promise that rejects when the specified timeout is reached. + * + * Usage: + * ``` + * await Promise.race([ + * rejectAfterSecondsElapsed(10, new Error('Timed out while doing X.')), + * someOtherPromise + * ]) + * ``` + * + * Tip: If you are using the return value of the other promise, you can supply the type of its return value to this + * function's type parameter to the same value to avoid TypeScript warnings. */ -export function withTimeout(promise: Promise, timeoutMs: number): Promise { - return new Promise((resolve, reject) => { - let isSettled = false - - const timeoutId = setTimeout(() => { - if (!isSettled) { - isSettled = true - reject(new Error(`Operation timed out after ${timeoutMs}ms`)) - } - }, timeoutMs) - - promise.then( - (result) => { - if (!isSettled) { - isSettled = true - clearTimeout(timeoutId) - resolve(result) - } - }, - (error) => { - if (!isSettled) { - isSettled = true - clearTimeout(timeoutId) - reject(error) - } - } - ) - }) +export function rejectAfterSecondsElapsed(timeoutSeconds: number, error: any): Promise { + return new Promise((resolve, reject) => setTimeout(() => reject(error), timeoutSeconds * 1000)) } diff --git a/packages/sagemaker-ssh-kiro/src/serverSetup.ts b/packages/sagemaker-ssh-kiro/src/serverSetup.ts index b39841cdcf2..c294ec4916e 100644 --- a/packages/sagemaker-ssh-kiro/src/serverSetup.ts +++ b/packages/sagemaker-ssh-kiro/src/serverSetup.ts @@ -72,14 +72,12 @@ export async function installCodeServer( const installServerScript = generateBashInstallScript(installOptions) - const serverSetupTimeoutSeconds = 120 const commandOutput = await executeShellCommand( conn, // Fish shell does not support heredoc so let's workaround it using -c option, // also replace single quotes (') within the script with ('\'') as there's no quoting within single quotes, see https://unix.stackexchange.com/a/24676 `bash -c '${installServerScript.replace(/'/g, `'\\''`)}'`, - envVariables, - serverSetupTimeoutSeconds + envVariables ) if (commandOutput.stderr) { @@ -350,29 +348,73 @@ else print_install_results_and_exit 1 fi -if [[ -f $SERVER_LOGFILE ]]; then - MAX_ATTEMPTS=60 - SLEEP_INTERVAL_SECONDS=0.5 - START_TIME=$(date +%s) - for i in $(seq 1 $MAX_ATTEMPTS); do - LISTENING_ON="$(cat $SERVER_LOGFILE | grep -E 'Extension host agent listening on .+' | sed 's/Extension host agent listening on //')" - if [[ -n $LISTENING_ON ]]; then - END_TIME=$(date +%s) - STARTUP_TIME=$((END_TIME - START_TIME)) - echo "Server started successfully in $STARTUP_TIME seconds (attempt $i/$MAX_ATTEMPTS)" - break +# Function to wait for server log file to be created +wait_for_server_log_file() { + local logfile="$1" + local max_attempts=20 + local sleep_interval=0.5 + local start_time_ms=$(date +%s%3N) + + echo "Waiting for server log file to be created at $\{logfile\}..." + for i in $(seq 1 $max_attempts); do + if [[ -f "$logfile" ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Log file found after $\{seconds_part\}.$\{decimal_part\} seconds (attempt $i/$max_attempts)" + return 0 fi - sleep $SLEEP_INTERVAL_SECONDS + if [[ $i -ge $max_attempts ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Error server log file not found after $\{seconds_part\}.$\{decimal_part\} seconds ($max_attempts attempts): $logfile" + return 1 + fi + sleep $sleep_interval done +} - if [[ -z $LISTENING_ON ]]; then - END_TIME=$(date +%s) - STARTUP_TIME=$((END_TIME - START_TIME)) - echo "Error server did not start successfully after $STARTUP_TIME seconds ($MAX_ATTEMPTS attempts)" - print_install_results_and_exit 1 - fi -else - echo "Error server log file not found $SERVER_LOGFILE" +# Function to wait for server to start listening +wait_for_server_listening() { + local logfile="$1" + local max_attempts=20 + local sleep_interval=0.5 + local start_time_ms=$(date +%s%3N) + + echo "Waiting for server to start listening..." + for i in $(seq 1 $max_attempts); do + local listening_on="$(cat "$logfile" | grep -E 'Extension host agent listening on .+' | sed 's/Extension host agent listening on //')" + if [[ -n "$listening_on" ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Server started successfully in $\{seconds_part\}.$\{decimal_part\} seconds (attempt $i/$max_attempts)" + LISTENING_ON="$listening_on" # Set global variable + return 0 + fi + if [[ $i -ge $max_attempts ]]; then + local end_time_ms=$(date +%s%3N) + local elapsed_ms=$((end_time_ms - start_time_ms)) + local seconds_part=$((elapsed_ms / 1000)) + local decimal_part=$(((elapsed_ms % 1000) / 100)) + echo "Error server did not start successfully after $\{seconds_part\}.$\{decimal_part\} seconds ($max_attempts attempts)" + return 1 + fi + sleep $sleep_interval + done +} + +# Wait for log file to be created first +if ! wait_for_server_log_file "$SERVER_LOGFILE"; then + print_install_results_and_exit 1 +fi + +# Now wait for server to start listening +if ! wait_for_server_listening "$SERVER_LOGFILE"; then print_install_results_and_exit 1 fi diff --git a/packages/sagemaker-ssh-kiro/src/sshConnection.ts b/packages/sagemaker-ssh-kiro/src/sshConnection.ts index 2f19ee4b8f3..b68f3f830eb 100644 --- a/packages/sagemaker-ssh-kiro/src/sshConnection.ts +++ b/packages/sagemaker-ssh-kiro/src/sshConnection.ts @@ -15,7 +15,9 @@ import { EventEmitter } from 'events' import * as net from 'net' import { Server } from 'net' import { Client, ClientChannel, ClientErrorExtensions, ConnectConfig, ShellOptions } from 'ssh2' -import { withTimeout } from './common/promiseUtils' +import { rejectAfterSecondsElapsed } from './common/promiseUtils' + +const establishShellTimeoutSeconds = 10 export interface SSHConnectConfig extends ConnectConfig { /** Optional Unique ID attached to ssh connection. */ @@ -74,20 +76,19 @@ interface CommandResult { export async function executeShellCommand( connection: SSHConnection, command: string, - env: { [index: string]: string | undefined }, - timeoutSeconds: number + env: { [index: string]: string | undefined } ): Promise { - let stream: ClientChannel | undefined = undefined - - try { + const stream = await Promise.race([ // Arbitrary timeout for the shell to be established. - stream = await withTimeout(connection.shell({ env }), 10_000) - } catch (error: unknown) { - throw new Error(`Failed to establish a remote shell: ${error}`) - } + rejectAfterSecondsElapsed( + establishShellTimeoutSeconds, + new Error('Timed out while attempting to establish a remote shell.') + ), + connection.shell({ env }), + ]) // Then return a promise for the command execution - const executionPromise = new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { let stdout = '' let stderr = '' @@ -111,8 +112,6 @@ export async function executeShellCommand( // This will lead to the `close` event being emitted after all stdout/stderr data has been received. stream!.end(`${command}\nexit\n`) }) - - return withTimeout(executionPromise, timeoutSeconds * 1000) } // This class is mostly unmodified from jeanp413/open-remote-ssh, aside from removing unused features. From 9c6514ad16f6dec1793b51f1e4f50920d3b4f911 Mon Sep 17 00:00:00 2001 From: kzr Date: Mon, 20 Oct 2025 14:28:13 -0700 Subject: [PATCH 12/53] fix(smus): add profile name and region to smus node tree (#2254) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem - Profile name and region were missing from SMUS tree nodes view ## Solution - Added Profile name and region to SMUS tree nodes **Express local** Screenshot 2025-10-17 at 3 42 11 PM **Express remote ssh** Screenshot 2025-10-17 at 4 54 51 PM **Standard local** Screenshot 2025-10-17 at 5 04 21 PM **Standard remote ssh** Screenshot 2025-10-17 at 4 14 39 PM --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../providers/smusAuthenticationProvider.ts | 37 +++++- .../sageMakerUnifiedStudioAuthInfoNode.ts | 35 +++-- .../nodes/sageMakerUnifiedStudioRootNode.ts | 4 +- .../client/datazoneDomainPreferencesClient.ts | 47 +++++++ .../shared/smusUtils.ts | 30 +++++ .../auth/smusAuthenticationProvider.test.ts | 98 ++++++++++++++ ...sageMakerUnifiedStudioAuthInfoNode.test.ts | 40 +++--- .../datazoneDomainPreferencesClient.test.ts | 122 ++++++++++++++++++ .../shared/smusUtils.test.ts | 65 ++++++++++ 9 files changed, 444 insertions(+), 34 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index bc03100e1d0..4a9c9a76a87 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -38,14 +38,13 @@ import { CredentialsProviderManager } from '../../../auth/providers/credentialsP import { SharedCredentialsProvider } from '../../../auth/providers/sharedCredentialsProvider' import { CredentialsId, CredentialsProvider } from '../../../auth/providers/credentials' import globals from '../../../shared/extensionGlobals' -import { fromIni } from '@aws-sdk/credential-providers' +import { fromContainerMetadata, fromIni, fromNodeProviderChain } from '@aws-sdk/credential-providers' import { randomUUID } from '../../../shared/crypto' import { DefaultStsClient } from '../../../shared/clients/stsClient' import { DataZoneDomainPreferencesClient } from '../../shared/client/datazoneDomainPreferencesClient' import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' import { DataZoneClient } from '../../shared/client/datazoneClient' import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' -import { fromContainerMetadata, fromNodeProviderChain } from '@aws-sdk/credential-providers' /** * Sets the context variable for SageMaker Unified Studio connection state @@ -160,6 +159,10 @@ export class SmusAuthenticationProvider { // Clear Express mode context for non-IAM connections or no connection await setSmusExpressModeContext(false) } + // Update Express mode context in SMUS space environment + if (getContext('aws.smus.inSmusSpaceEnvironment')) { + void this.initExpressModeContextInSpaceEnvironment() + } this.onDidChangeEmitter.fire() }) @@ -181,6 +184,36 @@ export class SmusAuthenticationProvider { await setSmusExpressModeContext(false) } })() + + // Update Express mode context in SMUS space environment + if (getContext('aws.smus.inSmusSpaceEnvironment')) { + void this.initExpressModeContextInSpaceEnvironment() + } + } + + /** + * Initializes Express mode context in SMUS space environment + */ + private async initExpressModeContextInSpaceEnvironment(): Promise { + try { + const resourceMetadata = getResourceMetadata() + if ( + resourceMetadata?.AdditionalMetadata?.DataZoneDomainId && + resourceMetadata?.AdditionalMetadata?.DataZoneDomainRegion + ) { + const domainId = resourceMetadata.AdditionalMetadata.DataZoneDomainId + const region = resourceMetadata.AdditionalMetadata.DataZoneDomainRegion + + const credentialsProvider = (await this.getDerCredentialsProvider()) as CredentialsProvider + + const isExpress = await SmusUtils.isInSmusExpressMode(domainId, region, credentialsProvider) + this.logger.debug(`SMUS Auth: is in express mode ${isExpress}`) + await setSmusExpressModeContext(isExpress) + } + } catch (error) { + this.logger.error('Failed to check Express mode in SMUS space environment: %s', error) + await setSmusExpressModeContext(false) + } } /** diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts index 51cb76c22fb..08ee20cff79 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts @@ -7,6 +7,9 @@ import * as vscode from 'vscode' import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { SageMakerUnifiedStudioRootNode } from './sageMakerUnifiedStudioRootNode' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' +import { SmusIamConnection } from '../../auth/model' +import { getContext } from '../../../shared/vscode/setContext' +import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' /** * Node representing the SageMaker Unified Studio authentication information @@ -28,7 +31,7 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { }) } - public getTreeItem(): vscode.TreeItem { + public async getTreeItem(): Promise { // Use the cached authentication provider to check connection status const isConnected = this.authProvider.isConnected() const isValid = this.authProvider.isConnectionValid() @@ -46,28 +49,39 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { let label: string let iconPath: vscode.ThemeIcon let tooltip: string + let description: string | undefined + + // Get profile name for express mode + const isExpressMode = getContext('aws.smus.isExpressMode') + let profileName: string | undefined + if (isExpressMode) { + const activeConnection = this.authProvider.activeConnection! + const { configFile } = await loadSharedConfigFiles() + profileName = + (activeConnection as SmusIamConnection).profileName || (configFile['default'] ? 'default' : undefined) + } if (isConnected && isValid) { - label = `Domain: ${domainId}` + label = isExpressMode ? `Connected with profile: ${profileName}` : `Domain: ${domainId}` iconPath = new vscode.ThemeIcon('key', new vscode.ThemeColor('charts.green')) - tooltip = `Connected to SageMaker Unified Studio\nDomain ID: ${domainId}\nRegion: ${region}\nStatus: Connected` + tooltip = `Connected to SageMaker Unified Studio\n${isExpressMode ? `Profile: ${profileName}` : `Domain ID: ${domainId}`}\nRegion: ${region}\nStatus: Connected` + description = region } else if (isConnected && !isValid) { - label = `Domain: ${domainId} (Expired) - Click to reauthenticate` + label = isExpressMode + ? `Profile: ${profileName} (Expired) - Click to reauthenticate` + : `Domain: ${domainId} (Expired) - Click to reauthenticate` iconPath = new vscode.ThemeIcon('warning', new vscode.ThemeColor('charts.yellow')) - tooltip = `Connection to SageMaker Unified Studio has expired\nDomain ID: ${domainId}\nRegion: ${region}\nStatus: Expired - Click to reauthenticate` + tooltip = `Connection to SageMaker Unified Studio has expired\n${isExpressMode ? `Profile: ${profileName}` : `Domain ID: ${domainId}`}\nRegion: ${region}\nStatus: Expired - Click to reauthenticate` + description = region } else { label = 'Not Connected' iconPath = new vscode.ThemeIcon('circle-slash', new vscode.ThemeColor('charts.red')) tooltip = 'Not connected to SageMaker Unified Studio\nPlease sign in to access your projects' + description = undefined } const item = new vscode.TreeItem(label, vscode.TreeItemCollapsibleState.None) - // Add region as description (appears to the right) if connected - if (isConnected) { - item.description = region - } - // Add command for reauthentication when connection is expired if (isConnected && !isValid) { item.command = { @@ -80,6 +94,7 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { item.tooltip = tooltip item.contextValue = 'smusAuthInfo' item.iconPath = iconPath + item.description = description return item } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index 46626e8665a..f3bb03e31ea 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -137,13 +137,13 @@ export class SageMakerUnifiedStudioRootNode implements TreeNode { } if (getContext('aws.smus.isExpressMode')) { - // In Express mode, immediately show data and compute nodes (project node's children) + // In Express mode, immediately show auth node, and project node's children (data and compute nodes) if (!this.projectNode.project) { await selectSMUSProject(this.projectNode) } const projectChildren = await this.projectNode.getChildren() - return projectChildren + return [this.authInfoNode, ...projectChildren] } // When authenticated, show auth info and projects diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts index 607b6f4c085..7c6ad982e48 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts @@ -257,4 +257,51 @@ export class DataZoneDomainPreferencesClient { throw new Error(`Failed to get domain info: ${(err as Error).message}`) } } + + /** + * Gets a specific domain by its ID + * @param domainId The ID of the domain to retrieve + * @returns Promise resolving to the GetDomainOutput + */ + public async getDomain(domainId: string): Promise { + try { + this.logger.debug(`DataZoneDomainPreferencesClient: Getting domain with ID: ${domainId}`) + + const datazoneDomainPreferencesClient = await this.getDataZoneDomainPreferencesClient() + + const response = await datazoneDomainPreferencesClient + .getDomain({ + identifier: domainId, + }) + .promise() + + this.logger.debug(`DataZoneDomainPreferencesClient: Successfully retrieved domain: ${domainId}`) + return response + } catch (err) { + this.logger.error('DataZoneDomainPreferencesClient: Failed to get domain: %s', (err as Error).message) + throw err + } + } + + /** + * Checks if a specific domain is an EXPRESS domain + * @param domainId The ID of the domain to check + * @returns Promise resolving to true if the domain is EXPRESS, false otherwise + */ + public async isExpressDomain(domainId: string): Promise { + try { + this.logger.debug(`DataZoneDomainPreferencesClient: Checking if domain ${domainId} is EXPRESS`) + + const domain = await this.getDomain(domainId) + const isExpress = domain.preferences?.DOMAIN_MODE === 'EXPRESS' || false + + this.logger.debug( + `DataZoneDomainPreferencesClient: Domain ${domainId} is ${isExpress ? 'EXPRESS' : 'not EXPRESS'}` + ) + return isExpress + } catch (err) { + this.logger.error('DataZoneDomainPreferencesClient: Failed to check if domain is EXPRESS: %s', err as Error) + throw err + } + } } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 68f603eb19b..9621192e27c 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -11,6 +11,7 @@ import fetch from 'node-fetch' import { CredentialsProvider, CredentialsProviderType } from '../../auth/providers/credentials' import { CredentialType } from '../../shared/telemetry/telemetry' import { AwsCredentialIdentity } from '@aws-sdk/types' +import { DataZoneDomainPreferencesClient } from './client/datazoneDomainPreferencesClient' /** * Represents SSO instance information retrieved from DataZone @@ -383,6 +384,35 @@ export class SmusUtils { return isSMUSspace && !!resourceMetadata?.AdditionalMetadata?.DataZoneDomainId } + /** + * Checks if we're in SMUS Express mode + * @param domainId The DataZone domain ID to check + * @param region The AWS region where the domain is located + * @param credentialsProvider The credentials provider to use for API calls + * @returns Promise resolving to true if the domain is in Express mode + */ + public static async isInSmusExpressMode( + domainId: string, + region: string, + credentialsProvider: CredentialsProvider + ): Promise { + try { + this.logger.info(`SMUS: Checking if domain ${domainId} is Express mode`) + + // Get DataZoneDomainPreferencesClient instance + const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance(credentialsProvider, region) + + // Check if the specific domain is an Express domain + const isExpress = await domainPreferencesClient.isExpressDomain(domainId) + + this.logger.debug(`SMUS: Domain ${domainId} is ${isExpress ? ' Express mode' : 'not Express mode'}`) + return isExpress + } catch (error) { + this.logger.error('SMUS: Failed to check Express mode: %s', error as Error) + return false + } + } + /** * Converts an STS assumed-role ARN to its corresponding IAM role ARN, or returns IAM user ARN as-is. * Supports all AWS partitions (aws, aws-cn, aws-us-gov, etc.) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 0a51b098890..3a3bbc5dea5 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -1345,4 +1345,102 @@ describe('SmusAuthenticationProvider', function () { }) }) }) + + describe('initExpressModeContextInSpaceEnvironment', function () { + let getResourceMetadataStub: sinon.SinonStub + let getDerCredentialsProviderStub: sinon.SinonStub + let isInSmusExpressModeStub: sinon.SinonStub + let mockCredentialsProvider: any + + const testResourceMetadata = { + AdditionalMetadata: { + DataZoneDomainId: 'test-domain-id', + DataZoneDomainRegion: 'us-east-1', + DataZoneProjectId: 'test-project-id', + }, + } + + beforeEach(function () { + getResourceMetadataStub = sinon.stub(resourceMetadataUtils, 'getResourceMetadata') + isInSmusExpressModeStub = sinon.stub(SmusUtils, 'isInSmusExpressMode') + + // Reset the global setContext stub history for clean test state + setContextStubGlobal.resetHistory() + + mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + }), + } + + getDerCredentialsProviderStub = sinon + .stub(smusAuthProvider, 'getDerCredentialsProvider') + .resolves(mockCredentialsProvider) + }) + + afterEach(function () { + sinon.restore() + }) + + it('should set express mode context to true when domain is express mode', async function () { + getResourceMetadataStub.returns(testResourceMetadata) + isInSmusExpressModeStub.resolves(true) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.called) + assert.ok( + isInSmusExpressModeStub.calledWith( + testResourceMetadata.AdditionalMetadata.DataZoneDomainId, + testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion, + mockCredentialsProvider + ) + ) + assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', true)) + }) + + it('should set express mode context to false when domain is not express mode', async function () { + getResourceMetadataStub.returns(testResourceMetadata) + isInSmusExpressModeStub.resolves(false) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.called) + assert.ok( + isInSmusExpressModeStub.calledWith( + testResourceMetadata.AdditionalMetadata.DataZoneDomainId, + testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion, + mockCredentialsProvider + ) + ) + assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', false)) + }) + + it('should not call express mode check when resource metadata is missing', async function () { + getResourceMetadataStub.returns(undefined) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.notCalled) + assert.ok(isInSmusExpressModeStub.notCalled) + assert.ok(setContextStubGlobal.notCalled) + }) + + it('should handle error when getDerCredentialsProvider fails', async function () { + getResourceMetadataStub.returns(testResourceMetadata) + const testError = new Error('Failed to get credentials provider') + getDerCredentialsProviderStub.rejects(testError) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.called) + assert.ok(isInSmusExpressModeStub.notCalled) + assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', false)) + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts index 435397885df..f1350ef9cec 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts @@ -91,8 +91,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = mockConnection }) - it('should return connected tree item', function () { - const treeItem = authInfoNode.getTreeItem() + it('should return connected tree item', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Domain: dzd_domainId') assert.strictEqual(treeItem.description, 'us-east-2') @@ -122,8 +122,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = mockConnection }) - it('should return expired tree item with reauthenticate command', function () { - const treeItem = authInfoNode.getTreeItem() + it('should return expired tree item with reauthenticate command', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Domain: dzd_domainId (Expired) - Click to reauthenticate') assert.strictEqual(treeItem.description, 'us-east-2') @@ -153,8 +153,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = undefined }) - it('should return not connected tree item', function () { - const treeItem = authInfoNode.getTreeItem() + it('should return not connected tree item', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Not Connected') assert.strictEqual(treeItem.description, undefined) @@ -187,8 +187,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = incompleteConnection }) - it('should handle missing domain ID and region gracefully', function () { - const treeItem = authInfoNode.getTreeItem() + it('should handle missing domain ID and region gracefully', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Domain: Unknown') assert.strictEqual(treeItem.description, 'Unknown') @@ -231,32 +231,32 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { }) describe('theme icon colors', function () { - it('should use green color for connected state', function () { + it('should use green color for connected state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(true) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const icon = treeItem.iconPath as vscode.ThemeIcon assert.ok(icon.color instanceof vscode.ThemeColor) assert.strictEqual((icon.color as any).id, 'charts.green') }) - it('should use yellow color for expired state', function () { + it('should use yellow color for expired state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const icon = treeItem.iconPath as vscode.ThemeIcon assert.ok(icon.color instanceof vscode.ThemeColor) assert.strictEqual((icon.color as any).id, 'charts.yellow') }) - it('should use red color for not connected state', function () { + it('should use red color for not connected state', async function () { mockAuthProvider.isConnected.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const icon = treeItem.iconPath as vscode.ThemeIcon assert.ok(icon.color instanceof vscode.ThemeColor) @@ -265,11 +265,11 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { }) describe('tooltip content', function () { - it('should include all relevant information for connected state', function () { + it('should include all relevant information for connected state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(true) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const tooltip = treeItem.tooltip as string assert.ok(tooltip.includes('Connected to SageMaker Unified Studio')) @@ -278,21 +278,21 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { assert.ok(tooltip.includes('Status: Connected')) }) - it('should include expiration information for expired state', function () { + it('should include expiration information for expired state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const tooltip = treeItem.tooltip as string assert.ok(tooltip.includes('Connection to SageMaker Unified Studio has expired')) assert.ok(tooltip.includes('Status: Expired - Click to reauthenticate')) }) - it('should include sign-in prompt for not connected state', function () { + it('should include sign-in prompt for not connected state', async function () { mockAuthProvider.isConnected.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const tooltip = treeItem.tooltip as string assert.ok(tooltip.includes('Not connected to SageMaker Unified Studio')) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts index 59051dad115..a036adb9b7e 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts @@ -342,4 +342,126 @@ describe('DataZoneDomainPreferencesClient', () => { await assert.rejects(() => client.getExpressDomain(), /Failed to get domain info: API error/) }) }) + + describe('getDomain', () => { + it('should get domain by ID successfully', async () => { + const mockDomainId = 'dzd_test123' + const mockResponse = { + id: mockDomainId, + name: 'Test Domain', + description: 'A test domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + portalUrl: 'https://test.datazone.aws', + createdAt: '2023-01-01T00:00:00Z', + lastUpdatedAt: '2023-01-02T00:00:00Z', + domainVersion: '1.0', + preferences: { DOMAIN_MODE: 'EXPRESS' }, + } + const mockDataZoneClient = { + getDomain: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) + + const result = await client.getDomain(mockDomainId) + + assert.strictEqual(result.id, mockDomainId) + assert.strictEqual(result.name, 'Test Domain') + assert.strictEqual(result.description, 'A test domain') + assert.strictEqual(result.arn, `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`) + assert.strictEqual(result.status, 'AVAILABLE') + assert.strictEqual(result.portalUrl, 'https://test.datazone.aws') + assert.strictEqual(result.domainVersion, '1.0') + assert.deepStrictEqual(result.preferences, { DOMAIN_MODE: 'EXPRESS' }) + + // Verify the API was called with correct parameters + assert.ok(mockDataZoneClient.getDomain.calledOnce) + assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { + identifier: mockDomainId, + }) + }) + + it('should handle API errors when getting domain', async () => { + const mockDomainId = 'dzd_test123' + const error = new Error('Domain not found') + + const mockDataZoneClient = { + getDomain: sinon.stub().returns({ + promise: () => Promise.reject(error), + }), + } + + sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) + + await assert.rejects(() => client.getDomain(mockDomainId), error) + + // Verify the API was called with correct parameters + assert.ok(mockDataZoneClient.getDomain.calledOnce) + assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { + identifier: mockDomainId, + }) + }) + }) + + describe('isExpressDomain', () => { + it('should return true for EXPRESS domain', async () => { + const mockDomainId = 'dzd_express123' + const mockResponse = { + id: mockDomainId, + name: 'Express Domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'EXPRESS' }, + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, true) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + + it('should return false for STANDARD domain', async () => { + const mockDomainId = 'dzd_standard123' + const mockResponse = { + id: mockDomainId, + name: 'Standard Domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'STANDARD' }, + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, false) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + + it('should return false for domain without preferences', async () => { + const mockDomainId = 'dzd_no_prefs123' + const mockResponse = { + id: mockDomainId, + name: 'Domain Without Preferences', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + // No preferences field + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, false) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts index ad14344f3eb..65dc98f415a 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts @@ -463,6 +463,71 @@ describe('SmusUtils', () => { }) }) + describe('isInSmusExpressMode', () => { + let mockCredentialsProvider: any + let mockDomainPreferencesClient: any + let getInstanceStub: sinon.SinonStub + + const testDomainId = 'dzd_test123' + const testRegion = 'us-east-1' + + beforeEach(() => { + // Mock credentials provider + mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + getCredentialsId: sinon.stub().returns({ credentialSource: 'test', credentialTypeId: 'test' }), + getProviderType: sinon.stub().returns('test'), + getTelemetryType: sinon.stub().returns('other'), + getDefaultRegion: sinon.stub().returns(testRegion), + getHashCode: sinon.stub().returns('test-hash'), + canAutoConnect: sinon.stub().resolves(false), + isAvailable: sinon.stub().resolves(true), + } + + // Mock DataZoneDomainPreferencesClient + mockDomainPreferencesClient = { + isExpressDomain: sinon.stub(), + } + + // Stub the getInstance method + getInstanceStub = sinon + .stub( + require('../../../sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient') + .DataZoneDomainPreferencesClient, + 'getInstance' + ) + .returns(mockDomainPreferencesClient) + }) + + afterEach(() => { + sinon.restore() + }) + + it('should return true when domain is in Express mode', async () => { + mockDomainPreferencesClient.isExpressDomain.resolves(true) + + const result = await SmusUtils.isInSmusExpressMode(testDomainId, testRegion, mockCredentialsProvider) + + assert.strictEqual(result, true) + assert.ok(getInstanceStub.calledWith(mockCredentialsProvider, testRegion)) + assert.ok(mockDomainPreferencesClient.isExpressDomain.calledWith(testDomainId)) + }) + + it('should return false when domain is not in Express mode', async () => { + mockDomainPreferencesClient.isExpressDomain.resolves(false) + + const result = await SmusUtils.isInSmusExpressMode(testDomainId, testRegion, mockCredentialsProvider) + + assert.strictEqual(result, false) + assert.ok(getInstanceStub.calledWith(mockCredentialsProvider, testRegion)) + assert.ok(mockDomainPreferencesClient.isExpressDomain.calledWith(testDomainId)) + }) + }) + describe('convertAssumedRoleArnToIamRoleArn', () => { it('should convert basic assumed role ARN to IAM role ARN', () => { const stsArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/MySession' From b8ea56ed7b4127107b754021bf866bda24e405e8 Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <43144436+aws-toolkit-automation@users.noreply.github.com> Date: Mon, 20 Oct 2025 16:59:19 -0700 Subject: [PATCH 13/53] Merge staging into feature/smus-m2 (#2259) ## Automatic merge failed - Resolve conflicts and push to this PR branch. - **Do not squash-merge** this PR. Use the "Create a merge commit" option to do a regular merge. ## Command line hint To perform the merge from the command line, you could do something like the following (where "origin" is the name of the remote in your local git repo): ``` git stash git fetch --all git checkout origin/feature/smus-m2 git merge origin/staging git commit git push origin HEAD:refs/heads/autoMerge/feature/smus-m2 ``` --------- Co-authored-by: David <60020664+dhasani23@users.noreply.github.com> Co-authored-by: David Hasani Co-authored-by: Arkaprava De Co-authored-by: Arkaprava De Co-authored-by: Keyu Wu Co-authored-by: chungjac Co-authored-by: aws-asolidu Co-authored-by: Newton Der Co-authored-by: Newton Der Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Co-authored-by: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Co-authored-by: Boyu Co-authored-by: atontb <104926752+atonaamz@users.noreply.github.com> Co-authored-by: kzr Co-authored-by: Richard Li <742829+rli@users.noreply.github.com> Co-authored-by: Shruti Sinha <44882001+shruti0085@users.noreply.github.com> --- .github/workflows/setup-release-candidate.yml | 3 +- LICENSE-THIRD-PARTY | 792 +++++++++--------- package-lock.json | 4 +- packages/amazonq/.changes/1.100.0.json | 5 + packages/amazonq/.changes/1.99.0.json | 5 + packages/amazonq/CHANGELOG.md | 8 + packages/amazonq/package.json | 2 +- .../app/inline/EditRendering/displayImage.ts | 46 +- packages/amazonq/src/app/inline/completion.ts | 44 + .../src/app/inline/recommendationService.ts | 25 +- .../inline/EditRendering/displayImage.test.ts | 107 +++ packages/core/src/auth/sso/clients.ts | 13 +- .../core/src/awsService/sagemaker/commands.ts | 18 +- .../awsService/sagemaker/credentialMapping.ts | 11 +- .../core/src/awsService/sagemaker/model.ts | 5 +- .../src/awsService/sagemaker/uriHandlers.ts | 9 +- .../transformByQ/transformApiHandler.ts | 10 +- .../transformByQ/transformFileHandler.ts | 21 +- .../transformByQ/transformMavenHandler.ts | 6 +- .../sageMakerUnifiedStudioSpacesParentNode.ts | 6 +- .../explorer/nodes/utils.ts | 6 + packages/core/src/shared/clients/sagemaker.ts | 43 +- packages/core/src/shared/sshConfig.ts | 2 +- .../awsService/sagemaker/uriHandlers.test.ts | 20 + .../commands/transformByQ.test.ts | 16 +- .../shared/clients/sagemakerClient.test.ts | 1 + packages/toolkit/.changes/3.79.0.json | 5 + packages/toolkit/.changes/3.80.0.json | 10 + packages/toolkit/CHANGELOG.md | 8 + packages/toolkit/package.json | 2 +- 30 files changed, 769 insertions(+), 484 deletions(-) create mode 100644 packages/amazonq/.changes/1.100.0.json create mode 100644 packages/amazonq/.changes/1.99.0.json create mode 100644 packages/toolkit/.changes/3.79.0.json create mode 100644 packages/toolkit/.changes/3.80.0.json diff --git a/.github/workflows/setup-release-candidate.yml b/.github/workflows/setup-release-candidate.yml index 30e82c82433..390669d22af 100644 --- a/.github/workflows/setup-release-candidate.yml +++ b/.github/workflows/setup-release-candidate.yml @@ -49,7 +49,8 @@ jobs: # Add generated license files git add LICENSE-THIRD-PARTY - git commit -m "Update third-party license attribution for $BRANCH_NAME" + # If there are no changes, then we don't need a new attribution commit + git commit -m "Update third-party license attribution for $BRANCH_NAME" || true # Push RC branch git push origin $BRANCH_NAME diff --git a/LICENSE-THIRD-PARTY b/LICENSE-THIRD-PARTY index 28b4dd7bd3d..efdb4af3017 100644 --- a/LICENSE-THIRD-PARTY +++ b/LICENSE-THIRD-PARTY @@ -2846,320 +2846,320 @@ @protobufjs/aspromise 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/base64 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/codegen 2.0.4 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/eventemitter 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/fetch 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/float 1.0.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/inquire 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/path 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/pool 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/utf8 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @@ -5191,13 +5191,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. color-name 1.1.4 -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @@ -8721,27 +8721,27 @@ THE SOFTWARE. registry-js 1.16.1 -MIT License - -Copyright (c) 2017 GitHub Desktop - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2017 GitHub Desktop + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -9650,17 +9650,17 @@ THE SOFTWARE. tslib 2.8.1 -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @@ -9727,61 +9727,61 @@ END OF TERMS AND CONDITIONS typescript 4.9.5 -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS ****************************** @@ -10251,27 +10251,27 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. win-ca 3.5.1 -MIT License - -Copyright (c) 2020 Stas Ukolov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2020 Stas Ukolov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -10339,27 +10339,27 @@ IN THE SOFTWARE. xmlbuilder 11.0.1 -The MIT License (MIT) - -Copyright (c) 2013 Ozgur Ozcitak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** diff --git a/package-lock.json b/package-lock.json index 645d6e348fa..627dba549de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33262,7 +33262,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.99.0-SNAPSHOT", + "version": "1.101.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -34989,7 +34989,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.79.0-SNAPSHOT", + "version": "3.81.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.100.0.json b/packages/amazonq/.changes/1.100.0.json new file mode 100644 index 00000000000..e1deb61908b --- /dev/null +++ b/packages/amazonq/.changes/1.100.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-16", + "version": "1.100.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.99.0.json b/packages/amazonq/.changes/1.99.0.json new file mode 100644 index 00000000000..9d1089ee8fa --- /dev/null +++ b/packages/amazonq/.changes/1.99.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-10", + "version": "1.99.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index afef3bdc7a7..5fac9084c01 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.100.0 2025-10-16 + +- Miscellaneous non-user-facing changes + +## 1.99.0 2025-10-10 + +- Miscellaneous non-user-facing changes + ## 1.98.0 2025-10-02 - Miscellaneous non-user-facing changes diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index cfe150bd418..b9d491a258b 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "The most capable generative AI–powered assistant for software development.", - "version": "1.99.0-SNAPSHOT", + "version": "1.101.0-SNAPSHOT", "extensionKind": [ "workspace" ], diff --git a/packages/amazonq/src/app/inline/EditRendering/displayImage.ts b/packages/amazonq/src/app/inline/EditRendering/displayImage.ts index 0af4d4801c0..7ccedc3489b 100644 --- a/packages/amazonq/src/app/inline/EditRendering/displayImage.ts +++ b/packages/amazonq/src/app/inline/EditRendering/displayImage.ts @@ -17,6 +17,7 @@ import type { AmazonQInlineCompletionItemProvider } from '../completion' import { vsCodeState } from 'aws-core-vscode/codewhisperer' const autoRejectEditCursorDistance = 25 +const autoDiscardEditCursorDistance = 10 export class EditDecorationManager { private imageDecorationType: vscode.TextEditorDecorationType @@ -312,6 +313,21 @@ export async function displaySvgDecoration( item: InlineCompletionItemWithReferences, inlineCompletionProvider?: AmazonQInlineCompletionItemProvider ) { + function logSuggestionFailure(type: 'DISCARD' | 'REJECT', reason: string, suggestionContent: string) { + getLogger('nextEditPrediction').debug( + `Auto ${type} edit suggestion with reason=${reason}, suggetion: ${suggestionContent}` + ) + } + // Check if edit is too far from current cursor position + const currentCursorLine = editor.selection.active.line + if (Math.abs(startLine - currentCursorLine) >= autoDiscardEditCursorDistance) { + // Emit DISCARD telemetry for edit suggestion that can't be shown because the suggestion is too far away + const params = createDiscardTelemetryParams(session, item) + languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + logSuggestionFailure('DISCARD', 'cursor is too far away', item.insertText as string) + return + } + const originalCode = editor.document.getText() // Set edit state immediately to prevent race condition with completion requests @@ -327,9 +343,7 @@ export async function displaySvgDecoration( // Emit DISCARD telemetry for edit suggestion that can't be shown due to active completion const params = createDiscardTelemetryParams(session, item) languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) - getLogger('nextEditPrediction').debug( - `Auto discarded edit suggestion for active completion suggestion: ${item.insertText as string}` - ) + logSuggestionFailure('DISCARD', 'Conflicting active inline completion', item.insertText as string) return } @@ -342,6 +356,7 @@ export async function displaySvgDecoration( const params = createDiscardTelemetryParams(session, item) // TODO: this session is closed on flare side hence discarded is not emitted in flare languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + logSuggestionFailure('DISCARD', 'Invalid patch', item.insertText as string) return } const documentChangeListener = vscode.workspace.onDidChangeTextDocument((e) => { @@ -360,9 +375,7 @@ export async function displaySvgDecoration( const isPatchValid = applyPatch(e.document.getText(), item.insertText as string) if (!isPatchValid) { - getLogger('nextEditPrediction').debug( - `Auto rejected edit suggestion for invalid patch: ${item.insertText as string}}` - ) + logSuggestionFailure('REJECT', 'Invalid patch due to document change', item.insertText as string) void vscode.commands.executeCommand('aws.amazonq.inline.rejectEdit') } }) @@ -376,6 +389,11 @@ export async function displaySvgDecoration( const currentPosition = e.selections[0].active const distance = Math.abs(currentPosition.line - startLine) if (distance > autoRejectEditCursorDistance) { + logSuggestionFailure( + 'REJECT', + `cursor position move too far away off ${autoRejectEditCursorDistance} lines`, + item.insertText as string + ) void vscode.commands.executeCommand('aws.amazonq.inline.rejectEdit') } }) @@ -399,9 +417,6 @@ export async function displaySvgDecoration( const endPosition = getEndOfEditPosition(originalCode, newCode) editor.selection = new vscode.Selection(endPosition, endPosition) - // Move cursor to end of the actual changed content - editor.selection = new vscode.Selection(endPosition, endPosition) - await decorationManager.clearDecorations(editor) documentChangeListener.dispose() cursorChangeListener.dispose() @@ -420,19 +435,6 @@ export async function displaySvgDecoration( } languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) session.triggerOnAcceptance = true - // VS Code triggers suggestion on every keystroke, temporarily disable trigger on acceptance - // if (inlineCompletionProvider && session.editsStreakPartialResultToken) { - // await inlineCompletionProvider.provideInlineCompletionItems( - // editor.document, - // endPosition, - // { - // triggerKind: vscode.InlineCompletionTriggerKind.Automatic, - // selectedCompletionInfo: undefined, - // }, - // new vscode.CancellationTokenSource().token, - // { emitTelemetry: false, showUi: false, editsStreakToken: session.editsStreakPartialResultToken } - // ) - // } }, async (isDiscard: boolean) => { // Handle reject diff --git a/packages/amazonq/src/app/inline/completion.ts b/packages/amazonq/src/app/inline/completion.ts index 9c4f8e3ad20..c113d3cd2fb 100644 --- a/packages/amazonq/src/app/inline/completion.ts +++ b/packages/amazonq/src/app/inline/completion.ts @@ -213,6 +213,8 @@ export class InlineCompletionManager implements Disposable { export class AmazonQInlineCompletionItemProvider implements InlineCompletionItemProvider { private logger = getLogger() + private pendingRequest: Promise | undefined + constructor( private readonly languageClient: LanguageClient, private readonly recommendationService: RecommendationService, @@ -300,6 +302,48 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem options: JSON.stringify(getAllRecommendationsOptions), }) + // If there's already a pending request, wait for it to complete instead of starting a new one + // This prevents race conditions where multiple concurrent calls cause the later (empty) response + // to override the earlier (valid) response + if (this.pendingRequest) { + getLogger().info('Reusing pending inline completion request to avoid race condition') + try { + const result = await this.pendingRequest + // Check if THIS call's token was cancelled (not the original call's token) + if (token.isCancellationRequested) { + getLogger().info('Reused request completed but this call was cancelled') + return [] + } + return result + } catch (e) { + // If the pending request failed, continue with a new request + getLogger().info('Pending request failed, starting new request: %O', e) + } + } + + // Start a new request and track it + this.pendingRequest = this._provideInlineCompletionItemsImpl( + document, + position, + context, + token, + getAllRecommendationsOptions + ) + + try { + return await this.pendingRequest + } finally { + this.pendingRequest = undefined + } + } + + private async _provideInlineCompletionItemsImpl( + document: TextDocument, + position: Position, + context: InlineCompletionContext, + token: CancellationToken, + getAllRecommendationsOptions?: GetAllRecommendationsOptions + ): Promise { if (vsCodeState.isCodeWhispererEditing) { getLogger().info('Q is editing, returning empty') return [] diff --git a/packages/amazonq/src/app/inline/recommendationService.ts b/packages/amazonq/src/app/inline/recommendationService.ts index 60fa8749cb0..bc9f8052695 100644 --- a/packages/amazonq/src/app/inline/recommendationService.ts +++ b/packages/amazonq/src/app/inline/recommendationService.ts @@ -35,6 +35,8 @@ export interface GetAllRecommendationsOptions { } export class RecommendationService { + private logger = getLogger() + constructor( private readonly sessionManager: SessionManager, private cursorUpdateRecorder?: ICursorUpdateRecorder @@ -117,7 +119,7 @@ export class RecommendationService { } // Handle first request - getLogger().info('Sending inline completion request: %O', { + this.logger.info('Sending inline completion request: %O', { method: inlineCompletionWithReferencesRequestType.method, request: { textDocument: request.textDocument, @@ -174,7 +176,7 @@ export class RecommendationService { } } - getLogger().info('Received inline completion response from LSP: %O', { + this.logger.info('Received inline completion response from LSP: %O', { sessionId: result.sessionId, latency: Date.now() - t0, itemCount: result.items?.length || 0, @@ -190,12 +192,14 @@ export class RecommendationService { if (result.items.length > 0 && result.items[0].isInlineEdit === false) { if (isTriggerByDeletion) { + this.logger.info(`Suggestions were discarded; reason: triggerByDeletion`) return [] } // Completion will not be rendered if an edit suggestion has been active for longer than 1 second if (EditSuggestionState.isEditSuggestionDisplayingOverOneSecond()) { const session = this.sessionManager.getActiveSession() if (!session) { + this.logger.error(`Suggestions were discarded; reason: undefined conflicting session`) return [] } const params: LogInlineCompletionSessionResultsParams = { @@ -213,14 +217,14 @@ export class RecommendationService { } languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) this.sessionManager.clear() - getLogger().info( - 'Completion discarded due to active edit suggestion displayed longer than 1 second' + this.logger.info( + 'Suggetions were discarded; reason: active edit suggestion displayed longer than 1 second' ) return [] } else if (EditSuggestionState.isEditSuggestionActive()) { // discard the current edit suggestion if its display time is less than 1 sec await commands.executeCommand('aws.amazonq.inline.rejectEdit', true) - getLogger().info('Discarding active edit suggestion displaying less than 1 second') + this.logger.info('Discarding active edit suggestion displaying less than 1 second') } } @@ -244,11 +248,10 @@ export class RecommendationService { // TODO: question, is it possible that the first request returns empty suggestion but has non-empty next token? if (result.partialResultToken) { + let logstr = `found non null next token; ` if (!isInlineEdit) { // If the suggestion is COMPLETIONS and there are more results to fetch, handle them in the background - getLogger().info( - 'Suggestion type is COMPLETIONS. Start fetching for more items if partialResultToken exists.' - ) + logstr += 'Suggestion type is COMPLETIONS. Start pulling more items' this.processRemainingRequests(languageClient, request, result, token).catch((error) => { languageClient.warn(`Error when getting suggestions: ${error}`) }) @@ -256,12 +259,14 @@ export class RecommendationService { // Skip fetching for more items if the suggesion is EDITS. If it is EDITS suggestion, only fetching for more // suggestions when the user start to accept a suggesion. // Save editsStreakPartialResultToken for the next EDITS suggestion trigger if user accepts. - getLogger().info('Suggestion type is EDITS. Skip fetching for more items.') + logstr += 'Suggestion type is EDITS. Skip pulling more items' this.sessionManager.updateActiveEditsStreakToken(result.partialResultToken) } + + this.logger.info(logstr) } } catch (error: any) { - getLogger().error('Error getting recommendations: %O', error) + this.logger.error('Error getting recommendations: %O', error) // bearer token expired if (error.data && error.data.awsErrorCode === 'E_AMAZON_Q_CONNECTION_EXPIRED') { // ref: https://github.com/aws/aws-toolkit-vscode/blob/amazonq/v1.74.0/packages/core/src/codewhisperer/service/inlineCompletionService.ts#L104 diff --git a/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts b/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts index 0a8cde5bacf..28155811f50 100644 --- a/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts +++ b/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts @@ -188,6 +188,89 @@ describe('EditDecorationManager', function () { }) }) +describe('displaySvgDecoration cursor distance auto-discard', function () { + let sandbox: sinon.SinonSandbox + let editorStub: sinon.SinonStubbedInstance + let languageClientStub: any + let sessionStub: any + let itemStub: any + + beforeEach(function () { + sandbox = sinon.createSandbox() + const commonStubs = createCommonStubs(sandbox) + editorStub = commonStubs.editorStub + + languageClientStub = { + sendNotification: sandbox.stub(), + } + + sessionStub = { + sessionId: 'test-session', + requestStartTime: Date.now(), + firstCompletionDisplayLatency: 100, + } + + itemStub = { + itemId: 'test-item', + insertText: 'test content', + } + }) + + afterEach(function () { + sandbox.restore() + }) + + it('should send discard telemetry and return early when edit is 10+ lines away from cursor', async function () { + // Set cursor at line 5 + editorStub.selection = { + active: new vscode.Position(5, 0), + } as any + // Try to display edit at line 20 (15 lines away) + await displaySvgDecoration( + editorStub as unknown as vscode.TextEditor, + vscode.Uri.parse('data:image/svg+xml;base64,test'), + 20, + 'new code', + [], + sessionStub, + languageClientStub, + itemStub + ) + + // Verify discard telemetry was sent + sinon.assert.calledOnce(languageClientStub.sendNotification) + const call = languageClientStub.sendNotification.getCall(0) + assert.strictEqual(call.args[0], 'aws/logInlineCompletionSessionResults') + assert.strictEqual(call.args[1].sessionId, 'test-session') + assert.strictEqual(call.args[1].completionSessionResult['test-item'].discarded, true) + }) + + it('should proceed normally when edit is within 10 lines of cursor', async function () { + // Set cursor at line 5 + editorStub.selection = { + active: new vscode.Position(5, 0), + } as any + // Mock required dependencies for normal flow + sandbox.stub(vscode.workspace, 'onDidChangeTextDocument').returns({ dispose: sandbox.stub() }) + sandbox.stub(vscode.window, 'onDidChangeTextEditorSelection').returns({ dispose: sandbox.stub() }) + + // Try to display edit at line 10 (5 lines away) + await displaySvgDecoration( + editorStub as unknown as vscode.TextEditor, + vscode.Uri.parse('data:image/svg+xml;base64,test'), + 10, + 'new code', + [], + sessionStub, + languageClientStub, + itemStub + ) + + // Verify no discard telemetry was sent (function should proceed normally) + sinon.assert.notCalled(languageClientStub.sendNotification) + }) +}) + describe('displaySvgDecoration cursor distance auto-reject', function () { let sandbox: sinon.SinonSandbox let editorStub: sinon.SinonStubbedInstance @@ -253,6 +336,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when cursor moves less than 25 lines away', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -262,6 +349,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when cursor moves exactly 25 lines away', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -271,6 +362,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should reject when cursor moves more than 25 lines away', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -280,6 +375,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should reject when cursor moves more than 25 lines before the edit', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -289,6 +388,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when edit is near beginning of file and cursor cannot move far enough', async function () { + // Set cursor at line 10 + editorStub.selection = { + active: new vscode.Position(10, 0), + } as any const startLine = 10 await setupDisplaySvgDecoration(startLine) @@ -298,6 +401,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when edit suggestion is not active', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any editSuggestionStateStub.returns(false) const startLine = 50 diff --git a/packages/core/src/auth/sso/clients.ts b/packages/core/src/auth/sso/clients.ts index e921cb7856e..2fa8b1a3854 100644 --- a/packages/core/src/auth/sso/clients.ts +++ b/packages/core/src/auth/sso/clients.ts @@ -30,7 +30,6 @@ import { getLogger } from '../../shared/logger/logger' import { SsoAccessTokenProvider } from './ssoAccessTokenProvider' import { AwsClientResponseError, isClientFault } from '../../shared/errors' import { DevSettings } from '../../shared/settings' -import { SdkError } from '@aws-sdk/types' import { HttpRequest, HttpResponse } from '@smithy/protocol-http' import { StandardRetryStrategy, defaultRetryDecider } from '@smithy/middleware-retry' import { AuthenticationFlow } from './model' @@ -104,22 +103,12 @@ export class OidcClient { } public static create(region: string) { - const updatedRetryDecider = (err: SdkError) => { - if (defaultRetryDecider(err)) { - return true - } - - // As part of SIM IDE-10703, there was an assumption that retrying on InvalidGrantException - // may be useful. This may not be the case anymore and if more research is done, this may not be needed. - // TODO: setup some telemetry to see if there are any successes on a subsequent retry for this case. - return err.name === 'InvalidGrantException' - } const client = new SSOOIDC({ region, endpoint: DevSettings.instance.get('endpoints', {})['ssooidc'], retryStrategy: new StandardRetryStrategy( () => Promise.resolve(3), // Maximum number of retries - { retryDecider: updatedRetryDecider } + { retryDecider: defaultRetryDecider } ), customUserAgent: getUserAgent({ includePlatform: true, includeClientId: true }), requestHandler: { diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index 64266c556e1..ce0b7edd7db 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -86,7 +86,8 @@ export async function deeplinkConnect( session: string, wsUrl: string, token: string, - domain: string + domain: string, + appType?: string ) { getLogger().debug( `sm:deeplinkConnect: connectionIdentifier: ${connectionIdentifier} session: ${session} wsUrl: ${wsUrl} token: ${token}` @@ -107,7 +108,8 @@ export async function deeplinkConnect( session, wsUrl, token, - domain + domain, + appType ) await startVscodeRemote( @@ -133,6 +135,16 @@ export async function stopSpace( ctx: vscode.ExtensionContext, sageMakerClient?: SagemakerClient ) { + await tryRefreshNode(node) + if (node.getStatus() === 'Stopped' || node.getStatus() === 'Stopping') { + void vscode.window.showWarningMessage(`Space ${node.spaceApp.SpaceName} is already in Stopped/Stopping state.`) + return + } else if (node.getStatus() === 'Starting') { + void vscode.window.showWarningMessage( + `Space ${node.spaceApp.SpaceName} is in Starting state. Wait until it is Running to attempt stop again.` + ) + return + } const spaceName = node.spaceApp.SpaceName! const confirmed = await showConfirmationMessage({ prompt: `You are about to stop this space. Any active resource will also be stopped. Are you sure you want to stop the space?`, @@ -179,7 +191,7 @@ export async function openRemoteConnect( void vscode.window.showErrorMessage(ConnectFromRemoteWorkspaceMessage) return } - + await tryRefreshNode(node) if (node.getStatus() === 'Stopped') { // In case of SMUS, we pass in a SM Client and for SM AI, it creates a new SM Client. const client = sageMakerClient ? sageMakerClient : new SagemakerClient(node.regionCode) diff --git a/packages/core/src/awsService/sagemaker/credentialMapping.ts b/packages/core/src/awsService/sagemaker/credentialMapping.ts index 3eb54feed36..e84b16bb415 100644 --- a/packages/core/src/awsService/sagemaker/credentialMapping.ts +++ b/packages/core/src/awsService/sagemaker/credentialMapping.ts @@ -96,15 +96,16 @@ export async function persistSSMConnection( domain: string, session?: string, wsUrl?: string, - token?: string + token?: string, + appType?: string ): Promise { const { region } = parseArn(spaceArn) const endpoint = DevSettings.instance.get('endpoints', {})['sagemaker'] ?? '' - // TODO: Hardcoded to 'jupyterlab' due to a bug in Studio that only supports refreshing - // the token for both CodeEditor and JupyterLab Apps in the jupyterlab subdomain. - // This will be fixed shortly after NYSummit launch to support refresh URL in CodeEditor subdomain. - const appSubDomain = 'jupyterlab' + let appSubDomain = 'jupyterlab' + if (appType && appType.toLowerCase() === 'codeeditor') { + appSubDomain = 'code-editor' + } let envSubdomain: string diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index cd0c1e43173..ac632740645 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -56,7 +56,8 @@ export async function prepareDevEnvConnection( session?: string, wsUrl?: string, token?: string, - domain?: string + domain?: string, + appType?: string ) { const remoteLogger = configureRemoteConnectionLogger() const { ssm, vsc, ssh } = (await ensureDependencies()).unwrap() @@ -82,7 +83,7 @@ export async function prepareDevEnvConnection( await persistSmusProjectCreds(spaceArn, node as SagemakerUnifiedStudioSpaceNode) } } else if (connectionType === 'sm_dl') { - await persistSSMConnection(spaceArn, domain ?? '', session, wsUrl, token) + await persistSSMConnection(spaceArn, domain ?? '', session, wsUrl, token, appType) } await startLocalServer(ctx) diff --git a/packages/core/src/awsService/sagemaker/uriHandlers.ts b/packages/core/src/awsService/sagemaker/uriHandlers.ts index 17c3c512272..6f1143d9054 100644 --- a/packages/core/src/awsService/sagemaker/uriHandlers.ts +++ b/packages/core/src/awsService/sagemaker/uriHandlers.ts @@ -18,7 +18,8 @@ export function register(ctx: ExtContext) { params.session, `${params.ws_url}&cell-number=${params['cell-number']}`, params.token, - params.domain + params.domain, + params.app_type ) }) } @@ -27,7 +28,7 @@ export function register(ctx: ExtContext) { } export function parseConnectParams(query: SearchParams) { - const params = query.getFromKeysOrThrow( + const requiredParams = query.getFromKeysOrThrow( 'connection_identifier', 'domain', 'user_profile', @@ -36,5 +37,7 @@ export function parseConnectParams(query: SearchParams) { 'cell-number', 'token' ) - return params + const optionalParams = query.getFromKeys('app_type') + + return { ...requiredParams, ...optionalParams } } diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts index 00dc16398da..45d95ec9a75 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts @@ -275,7 +275,8 @@ function isExcludedSourceFile(path: string): boolean { return sourceExcludedExtensions.some((extension) => path.endsWith(extension)) } -// zip all dependency files and all source files excluding "target" (contains large JARs) plus ".git" and ".idea" (may appear in diff.patch) +// zip all dependency files and all source files +// excludes "target" (contains large JARs) plus ".git", ".idea", and ".github" (may appear in diff.patch) export function getFilesRecursively(dir: string, isDependenciesFolder: boolean): string[] { const entries = nodefs.readdirSync(dir, { withFileTypes: true }) const files = entries.flatMap((entry) => { @@ -284,7 +285,12 @@ export function getFilesRecursively(dir: string, isDependenciesFolder: boolean): if (isDependenciesFolder) { // include all dependency files return getFilesRecursively(res, isDependenciesFolder) - } else if (entry.name !== 'target' && entry.name !== '.git' && entry.name !== '.idea') { + } else if ( + entry.name !== 'target' && + entry.name !== '.git' && + entry.name !== '.idea' && + entry.name !== '.github' + ) { // exclude the above directories when zipping source code return getFilesRecursively(res, isDependenciesFolder) } else { diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts index 91ee8f6639c..b16ea64022c 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts @@ -139,8 +139,14 @@ export function validateCustomVersionsFile(fileContents: string) { getLogger().info('CodeTransformation: .YAML file must contain at least dependencies or plugins') return `YAML file must contain at least \`dependencies\` or \`plugins\` under \`dependencyManagement\`` } - for (const item of dependenciesAndPlugins) { - const errorMessage = validateItem(item) + for (const item of dependencies) { + const errorMessage = validateItem(item, false) + if (errorMessage) { + return errorMessage + } + } + for (const item of plugins) { + const errorMessage = validateItem(item, true) if (errorMessage) { return errorMessage } @@ -153,10 +159,15 @@ export function validateCustomVersionsFile(fileContents: string) { } // return an error message, or undefined if item is valid -function validateItem(item: any, validOriginTypes: string[] = ['FIRST_PARTY', 'THIRD_PARTY']) { - if (!/^[^\s:]+:[^\s:]+$/.test(item.identifier)) { +function validateItem(item: any, isPlugin: boolean) { + const validOriginTypes = ['FIRST_PARTY', 'THIRD_PARTY'] + if (!isPlugin && !/^[^\s:]+:[^\s:]+$/.test(item.identifier)) { getLogger().info(`CodeTransformation: Invalid identifier format: ${item.identifier}`) - return `Invalid identifier format: \`${item.identifier}\`. Must be in format \`groupId:artifactId\` without spaces` + return `Invalid dependency identifier format: \`${item.identifier}\`. Must be in format \`groupId:artifactId\` without spaces` + } + if (isPlugin && !item.identifier?.trim()) { + getLogger().info('CodeTransformation: Missing identifier in plugin') + return 'Missing `identifier` in plugin' } if (!validOriginTypes.includes(item.originType)) { getLogger().info(`CodeTransformation: Invalid originType: ${item.originType}`) diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts index 400ac127110..22fcd1e6fa1 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts @@ -17,14 +17,14 @@ import globals from '../../../shared/extensionGlobals' function collectDependenciesAndMetadata(dependenciesFolderPath: string, workingDirPath: string) { getLogger().info('CodeTransformation: running mvn clean test-compile with maven JAR') - const baseCommand = transformByQState.getMavenName() + const baseCommand = transformByQState.getMavenName() // always 'mvn' const jarPath = globals.context.asAbsolutePath(path.join('resources', 'amazonQCT', 'QCT-Maven-1-0-156-0.jar')) getLogger().info('CodeTransformation: running Maven extension with JAR') const args = [ - `-Dmaven.ext.class.path=${jarPath}`, - `-Dcom.amazon.aws.developer.transform.jobDirectory=${dependenciesFolderPath}`, + `-Dmaven.ext.class.path="${jarPath}"`, + `-Dcom.amazon.aws.developer.transform.jobDirectory="${dependenciesFolderPath}"`, 'clean', 'test-compile', ] diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts index f784a1ce99a..3c17f0d7ff2 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts @@ -17,6 +17,7 @@ import { PollingSet } from '../../../shared/utilities/pollingSet' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { SmusUtils } from '../../shared/smusUtils' import { getIcon } from '../../../shared/icons' +import { PENDING_NODE_POLLING_INTERVAL_MS } from './utils' import { getContext } from '../../../shared/vscode/setContext' import { createDZClientBaseOnDomainMode } from './utils' @@ -30,7 +31,10 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { private readonly onDidChangeEmitter = new vscode.EventEmitter() public readonly onDidChangeTreeItem = this.onDidChangeEmitter.event public readonly onDidChangeChildren = this.onDidChangeEmitter.event - public readonly pollingSet: PollingSet = new PollingSet(5, this.updatePendingNodes.bind(this)) + public readonly pollingSet: PollingSet = new PollingSet( + PENDING_NODE_POLLING_INTERVAL_MS, + this.updatePendingNodes.bind(this) + ) private spaceAwsAccountRegion: string | undefined public constructor( diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts index 4aeba1b5602..4d2dce3d8aa 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts @@ -25,6 +25,12 @@ import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticat import { SmusIamConnection } from '../../auth/model' import { ConnectionStatus } from '@aws-sdk/client-datazone' +/** + * Polling interval in milliseconds for checking space status updates + */ +// eslint-disable-next-line @typescript-eslint/naming-convention +export const PENDING_NODE_POLLING_INTERVAL_MS = 5000 + /** * Gets the label for a node based on its data */ diff --git a/packages/core/src/shared/clients/sagemaker.ts b/packages/core/src/shared/clients/sagemaker.ts index ff086ed1d9e..fda420effef 100644 --- a/packages/core/src/shared/clients/sagemaker.ts +++ b/packages/core/src/shared/clients/sagemaker.ts @@ -52,6 +52,11 @@ import { yes, no, continueText, cancel } from '../localizedText' import { AwsCredentialIdentity } from '@aws-sdk/types' import globals from '../extensionGlobals' +const appTypeSettingsMap: Record = { + [AppType.JupyterLab as string]: 'JupyterLabAppSettings', + [AppType.CodeEditor as string]: 'CodeEditorAppSettings', +} as const + export interface SagemakerSpaceApp extends SpaceDetails { App?: AppDetails DomainSpaceKey: string @@ -136,13 +141,13 @@ export class SagemakerClient extends ClientWrapper { // Get app type const appType = spaceDetails.SpaceSettings?.AppType - if (appType !== 'JupyterLab' && appType !== 'CodeEditor') { + if (!appType || !(appType in appTypeSettingsMap)) { throw new ToolkitError(`Unsupported AppType "${appType}" for space "${spaceName}"`) } // Get app resource spec const requestedResourceSpec = - appType === 'JupyterLab' + appType === AppType.JupyterLab ? spaceDetails.SpaceSettings?.JupyterLabAppSettings?.DefaultResourceSpec : spaceDetails.SpaceSettings?.CodeEditorAppSettings?.DefaultResourceSpec @@ -181,16 +186,30 @@ export class SagemakerClient extends ClientWrapper { instanceType = InstanceTypeMinimum } - // Get remote access flag - if (!spaceDetails.SpaceSettings?.RemoteAccess || spaceDetails.SpaceSettings?.RemoteAccess === 'DISABLED') { + // First, update the space if needed + const needsRemoteAccess = + !spaceDetails.SpaceSettings?.RemoteAccess || spaceDetails.SpaceSettings?.RemoteAccess === 'DISABLED' + const instanceTypeChanged = requestedResourceSpec?.InstanceType !== instanceType + + if (needsRemoteAccess || instanceTypeChanged) { + const updateSpaceRequest: UpdateSpaceCommandInput = { + DomainId: domainId, + SpaceName: spaceName, + SpaceSettings: { + ...(needsRemoteAccess && { RemoteAccess: 'ENABLED' }), + ...(instanceTypeChanged && { + [appTypeSettingsMap[appType]]: { + DefaultResourceSpec: { + InstanceType: instanceType, + }, + }, + }), + }, + } + try { - await this.updateSpace({ - DomainId: domainId, - SpaceName: spaceName, - SpaceSettings: { - RemoteAccess: 'ENABLED', - }, - }) + getLogger().debug('SagemakerClient: Updating space: domainId=%s, spaceName=%s', domainId, spaceName) + await this.updateSpace(updateSpaceRequest) await this.waitForSpaceInService(spaceName, domainId) } catch (err) { throw this.handleStartSpaceError(err) @@ -214,6 +233,7 @@ export class SagemakerClient extends ClientWrapper { ? { ...resourceSpec, EnvironmentArn: undefined, EnvironmentVersionArn: undefined } : resourceSpec + // Second, create the App const createAppRequest: CreateAppCommandInput = { DomainId: domainId, SpaceName: spaceName, @@ -223,6 +243,7 @@ export class SagemakerClient extends ClientWrapper { } try { + getLogger().debug('SagemakerClient: Creating app: domainId=%s, spaceName=%s', domainId, spaceName) await this.createApp(createAppRequest) } catch (err) { throw this.handleStartSpaceError(err) diff --git a/packages/core/src/shared/sshConfig.ts b/packages/core/src/shared/sshConfig.ts index bba23b9a4d8..92b32666b06 100644 --- a/packages/core/src/shared/sshConfig.ts +++ b/packages/core/src/shared/sshConfig.ts @@ -208,7 +208,7 @@ Host ${this.configHostName} protected createSSHConfigSection(proxyCommand: string): string { if (this.scriptPrefix === 'sagemaker_connect') { - return `${this.getSageMakerSSHConfig(proxyCommand)}User '%r'\n` + return `${this.getSageMakerSSHConfig(proxyCommand)}` } else if (this.keyPath) { return `${this.getBaseSSHConfig(proxyCommand)}IdentityFile '${this.keyPath}'\n User '%r'\n` } diff --git a/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts b/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts index 9ff24b2a3f9..f27df1fcb11 100644 --- a/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts +++ b/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts @@ -44,6 +44,7 @@ describe('SageMaker URI handler', function () { ws_url: 'wss://example.com', 'cell-number': '4', token: 'my-token', + app_type: 'jupyterlab', } const uri = createConnectUri(params) @@ -55,5 +56,24 @@ describe('SageMaker URI handler', function () { assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[3], 'wss://example.com&cell-number=4') assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[4], 'my-token') assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[5], 'my-domain') + assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[6], 'jupyterlab') + }) + + it('calls deeplinkConnect with undefined app_type when not provided', async function () { + const params = { + connection_identifier: 'abc123', + domain: 'my-domain', + user_profile: 'me', + session: 'sess-xyz', + ws_url: 'wss://example.com', + 'cell-number': '4', + token: 'my-token', + } + + const uri = createConnectUri(params) + await handler.handleUri(uri) + + assert.ok(deeplinkConnectStub.calledOnce) + assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[6], undefined) }) }) diff --git a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts index f205f075872..218fa384c1e 100644 --- a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts +++ b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts @@ -65,7 +65,7 @@ dependencyManagement: targetVersion: "3.0.0" originType: "THIRD_PARTY" plugins: - - identifier: "com.example:plugin" + - identifier: "plugin.id" targetVersion: "1.2.0" versionProperty: "plugin.version" # Optional originType: "FIRST_PARTY" # or "THIRD_PARTY"` @@ -503,6 +503,10 @@ dependencyManagement: await fs.mkdir(gitFolder) await fs.writeFile(path.join(gitFolder, 'config'), 'sample content for the test file') + const githubFolder = path.join(tempDir, '.github') + await fs.mkdir(githubFolder) + await fs.writeFile(path.join(githubFolder, 'config'), 'more sample content for the test file') + const zippedFiles = getFilesRecursively(tempDir, false) assert.strictEqual(zippedFiles.length, 1) }) @@ -582,15 +586,21 @@ dependencyManagement: assert.strictEqual(errorMessage, `Missing required key: \`dependencyManagement\``) }) - it(`WHEN validateCustomVersionsFile on .yaml file with invalid identifier format THEN fails validation`, function () { + it(`WHEN validateCustomVersionsFile on .yaml file with invalid dependency identifier format THEN fails validation`, function () { const invalidFile = validCustomVersionsFile.replace('com.example:library1', 'com.example-library1') const errorMessage = validateCustomVersionsFile(invalidFile) assert.strictEqual( errorMessage, - `Invalid identifier format: \`com.example-library1\`. Must be in format \`groupId:artifactId\` without spaces` + `Invalid dependency identifier format: \`com.example-library1\`. Must be in format \`groupId:artifactId\` without spaces` ) }) + it(`WHEN validateCustomVersionsFile on .yaml file with missing plugin identifier format THEN fails validation`, function () { + const invalidFile = validCustomVersionsFile.replace('plugin.id', '') + const errorMessage = validateCustomVersionsFile(invalidFile) + assert.strictEqual(errorMessage, 'Missing `identifier` in plugin') + }) + it(`WHEN validateCustomVersionsFile on .yaml file with invalid originType THEN fails validation`, function () { const invalidFile = validCustomVersionsFile.replace('FIRST_PARTY', 'INVALID_TYPE') const errorMessage = validateCustomVersionsFile(invalidFile) diff --git a/packages/core/src/test/shared/clients/sagemakerClient.test.ts b/packages/core/src/test/shared/clients/sagemakerClient.test.ts index ecd60af5ad1..379cce02d3a 100644 --- a/packages/core/src/test/shared/clients/sagemakerClient.test.ts +++ b/packages/core/src/test/shared/clients/sagemakerClient.test.ts @@ -360,6 +360,7 @@ describe('SagemakerClient.startSpace', function () { getTestWindow().getFirstMessage().selectItem('Yes') await promise + sinon.assert.calledOnce(updateSpaceStub) sinon.assert.calledOnce(createAppStub) }) diff --git a/packages/toolkit/.changes/3.79.0.json b/packages/toolkit/.changes/3.79.0.json new file mode 100644 index 00000000000..ce9c5531853 --- /dev/null +++ b/packages/toolkit/.changes/3.79.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-10", + "version": "3.79.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/3.80.0.json b/packages/toolkit/.changes/3.80.0.json new file mode 100644 index 00000000000..4db49741fa7 --- /dev/null +++ b/packages/toolkit/.changes/3.80.0.json @@ -0,0 +1,10 @@ +{ + "date": "2025-10-16", + "version": "3.80.0", + "entries": [ + { + "type": "Bug Fix", + "description": "The space is updated upon creation of a new app with the requested settings" + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index 6def23f3765..868a46a01a4 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.80.0 2025-10-16 + +- **Bug Fix** The space is updated upon creation of a new app with the requested settings + +## 3.79.0 2025-10-10 + +- Miscellaneous non-user-facing changes + ## 3.78.0 2025-10-02 - **Feature** Refactor and optimize Lambda Remote Invoke UI with enhanced payload management diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index a1c37e48971..e27ccb0ae8c 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -2,7 +2,7 @@ "name": "aws-toolkit-vscode", "displayName": "AWS Toolkit", "description": "Including CodeCatalyst, Infrastructure Composer, and support for Lambda, S3, CloudWatch Logs, CloudFormation, and many other services.", - "version": "3.79.0-SNAPSHOT", + "version": "3.81.0-SNAPSHOT", "extensionKind": [ "workspace" ], From 41c2073b579614200282c6e61b2919887bd7c57c Mon Sep 17 00:00:00 2001 From: Bhargav Date: Tue, 21 Oct 2025 14:15:52 -0700 Subject: [PATCH 14/53] fix(smus): Fix re-authentication flow for SMUS IAM flow (#2256) **Description** Added more options to the reauth flow for IAM mode. User now has option to re-auth using same creds, edit creds, pick a different profile or sign out. **Testing Done** Updated unit tests where possible and tested locally. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../auth/authenticationOrchestrator.ts | 33 ++- .../auth/credentialExpiryHandler.ts | 241 ++++++++++++++++++ .../providers/smusAuthenticationProvider.ts | 50 +++- .../explorer/activation.ts | 32 ++- .../shared/smusUtils.ts | 12 + .../auth/smusAuthenticationProvider.test.ts | 10 +- .../explorer/activation.test.ts | 120 ++++++++- 7 files changed, 473 insertions(+), 25 deletions(-) create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index 60d02bdb55f..d85d5463bb7 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -10,7 +10,12 @@ import { SmusErrorCodes } from '../shared/smusUtils' import { SmusAuthenticationProvider } from './providers/smusAuthenticationProvider' import { SmusSsoAuthenticationUI } from './ui/ssoAuthentication' -import { SmusIamProfileSelector } from './ui/iamProfileSelection' +import { + SmusIamProfileSelector, + IamProfileSelection, + IamProfileEditingInProgress, + IamProfileBackNavigation, +} from './ui/iamProfileSelection' import { SmusAuthenticationPreferencesManager } from './preferences/authenticationPreferences' import { DataZoneDomainPreferencesClient } from '../shared/client/datazoneDomainPreferencesClient' import { recordAuthTelemetry } from '../shared/telemetry' @@ -31,17 +36,37 @@ export class SmusAuthenticationOrchestrator { /** * Handles IAM authentication flow + * @param authProvider The SMUS authentication provider + * @param span Telemetry span + * @param context Extension context + * @param existingProfileName Optional profile name to re-authenticate with (skips profile selection) + * @param existingRegion Optional region to use (skips region selection) */ public static async handleIamAuthentication( authProvider: SmusAuthenticationProvider, span: any, - context: vscode.ExtensionContext + context: vscode.ExtensionContext, + existingProfileName?: string, + existingRegion?: string ): Promise { const logger = this.logger try { - // Show IAM profile selection dialog - const profileSelection = await SmusIamProfileSelector.showIamProfileSelection() + let profileSelection: IamProfileSelection | IamProfileEditingInProgress | IamProfileBackNavigation + + // If profile and region are provided, skip profile selection (re-authentication case) + if (existingProfileName && existingRegion) { + logger.debug( + `SMUS Auth: Re-authenticating with existing profile: ${existingProfileName}, region: ${existingRegion}` + ) + profileSelection = { + profileName: existingProfileName, + region: existingRegion, + } + } else { + // Show IAM profile selection dialog + profileSelection = await SmusIamProfileSelector.showIamProfileSelection() + } // Handle different result types if ('isBack' in profileSelection) { diff --git a/packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts b/packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts new file mode 100644 index 00000000000..458dfa91f46 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts @@ -0,0 +1,241 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getLogger } from '../../shared/logger/logger' +import { ToolkitError } from '../../shared/errors' +import { SmusErrorCodes } from '../shared/smusUtils' +import { SmusIamProfileSelector } from './ui/iamProfileSelection' +import { getCredentialsFilename, getConfigFilename } from '../../auth/credentials/sharedCredentialsFile' +import type { SmusAuthenticationProvider } from './providers/smusAuthenticationProvider' + +export enum IamCredentialExpiryAction { + Reauthenticate = 'reauthenticate', + EditCredentials = 'editCredentials', + SwitchProfile = 'switchProfile', + SignOut = 'signOut', + Cancelled = 'cancelled', +} + +export type IamCredentialExpiryResult = + | { action: IamCredentialExpiryAction.Reauthenticate } + | { action: IamCredentialExpiryAction.EditCredentials } + | { action: IamCredentialExpiryAction.SwitchProfile } + | { action: IamCredentialExpiryAction.SignOut } + | { action: IamCredentialExpiryAction.Cancelled } + +/** + * Shows credential expiry options for IAM connections + * Provides options to re-authenticate, edit credentials, switch profiles, or sign out + * @param authProvider The SMUS authentication provider + * @param connection The expired IAM connection + * @param extensionContext The extension context + * @returns Promise that resolves with the action taken + */ +export async function showIamCredentialExpiryOptions( + authProvider: SmusAuthenticationProvider, + connection: any, + extensionContext: vscode.ExtensionContext +): Promise { + const logger = getLogger() + + type QuickPickItemWithAction = vscode.QuickPickItem & { action: IamCredentialExpiryAction } + const options: QuickPickItemWithAction[] = [ + { + label: '$(sync) Re-authenticate with current profile', + description: `Profile: ${connection.profileName}`, + detail: 'Refresh credentials using the same IAM profile', + action: IamCredentialExpiryAction.Reauthenticate, + }, + { + label: '$(file-text) Edit credentials file', + description: 'Open ~/.aws/credentials and ~/.aws/config', + detail: 'Manually update your AWS credentials', + action: IamCredentialExpiryAction.EditCredentials, + }, + { + label: '$(arrow-swap) Switch to another profile', + description: 'Select a different IAM profile', + detail: 'Choose from available credential profiles', + action: IamCredentialExpiryAction.SwitchProfile, + }, + { + label: '$(trash) Sign out', + description: 'Sign out from this connection', + detail: 'Remove the expired connection', + action: IamCredentialExpiryAction.SignOut, + }, + ] + + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'IAM Credentials Expired' + quickPick.placeholder = 'Choose how to fix your expired credentials' + quickPick.items = options + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + return new Promise((resolve, reject) => { + let isCompleted = false + + quickPick.onDidAccept(async () => { + const selectedItem = quickPick.selectedItems[0] + if (!selectedItem) { + quickPick.dispose() + reject(new ToolkitError('No option selected', { code: SmusErrorCodes.UserCancelled, cancelled: true })) + return + } + + isCompleted = true + quickPick.dispose() + + const itemWithAction = selectedItem as QuickPickItemWithAction + + try { + switch (itemWithAction.action) { + case IamCredentialExpiryAction.Reauthenticate: { + logger.debug( + `SMUS: Re-authenticating with current IAM profile: ${connection.profileName} in region ${connection.region}` + ) + // For IAM connections, just validate the credentials are still valid + // The auth system will handle refreshing them automatically + const validation = await authProvider.validateIamProfile(connection.profileName) + if (validation.isValid) { + // Credentials are valid, refresh the connection state + await authProvider.auth.refreshConnectionState(connection) + void vscode.window.showInformationMessage( + 'Successfully reauthenticated with SageMaker Unified Studio' + ) + resolve({ action: IamCredentialExpiryAction.Reauthenticate }) + } else { + const errorMsg = validation.error || 'Unknown validation error' + // Throw error for telemetry - activation.ts will show the notification + throw new ToolkitError( + `Failed to re-authenticate, ensure credential has been updated: ${errorMsg}`, + { code: SmusErrorCodes.IamValidationFailed } + ) + } + break + } + case IamCredentialExpiryAction.EditCredentials: { + logger.debug('SMUS: Opening AWS credentials and config files for editing') + // Open both credentials and config files like AWS Explorer does + const credentialsPath = getCredentialsFilename() + const configPath = getConfigFilename() + + // Open both files + const [credentialsDoc, configDoc] = await Promise.all([ + vscode.workspace.openTextDocument(credentialsPath), + vscode.workspace.openTextDocument(configPath), + ]) + + // Show both documents + await vscode.window.showTextDocument(credentialsDoc, { preview: false }) + await vscode.window.showTextDocument(configDoc, { + preview: false, + viewColumn: vscode.ViewColumn.Beside, + }) + + void vscode.window.showInformationMessage( + 'AWS credentials and config files opened. Please update your credentials and try reconnecting.' + ) + resolve({ action: IamCredentialExpiryAction.EditCredentials }) + break + } + case IamCredentialExpiryAction.SwitchProfile: { + logger.debug('SMUS: Switching to another IAM profile') + try { + const profileSelection = await SmusIamProfileSelector.showIamProfileSelection() + + // Handle back navigation - show the credential expiry menu again + if ('isBack' in profileSelection) { + logger.debug('SMUS: User clicked back, showing credential expiry options again') + // Recursively show the credential expiry options menu + const result = await showIamCredentialExpiryOptions( + authProvider, + connection, + extensionContext + ) + resolve(result) + return + } + + // Handle editing mode - This is if user picks edit during the profile selection + if ('isEditing' in profileSelection) { + logger.debug('SMUS: User is editing credentials') + resolve({ action: IamCredentialExpiryAction.EditCredentials }) + return + } + + // User selected a new profile, authenticate with it using the selected profile + // Use dynamic import to avoid circular dependency + const { SmusAuthenticationOrchestrator } = await import('./authenticationOrchestrator.js') + const result = await SmusAuthenticationOrchestrator.handleIamAuthentication( + authProvider, + { record: () => {} }, // Minimal span object + extensionContext, + profileSelection.profileName, + profileSelection.region + ) + + if (result.status === 'SUCCESS') { + void vscode.window.showInformationMessage( + `Successfully switched to profile: ${profileSelection.profileName}` + ) + resolve({ action: IamCredentialExpiryAction.SwitchProfile }) + } else if (result.status === 'INVALID_PROFILE') { + void vscode.window.showErrorMessage(`Failed to switch profile: ${result.error}`) + resolve({ action: IamCredentialExpiryAction.SwitchProfile }) + } else { + // BACK or EDITING - shouldn't happen here but handle gracefully + resolve({ action: IamCredentialExpiryAction.Cancelled }) + } + } catch (switchError) { + // Handle user cancellation gracefully + if ( + switchError instanceof ToolkitError && + switchError.code === SmusErrorCodes.UserCancelled + ) { + logger.debug('SMUS: Profile switch cancelled by user') + resolve({ action: IamCredentialExpiryAction.Cancelled }) + } else { + // Show error message for actual failures + const errorMsg = (switchError as Error).message + void vscode.window.showErrorMessage(`Failed to switch profile: ${errorMsg}`) + logger.error('SMUS: Profile switch failed: %s', switchError) + resolve({ action: IamCredentialExpiryAction.SwitchProfile }) + } + } + break + } + case IamCredentialExpiryAction.SignOut: { + logger.debug('SMUS: Signing out from connection') + // Use the provider's signOut method which properly handles metadata cleanup + await authProvider.signOut() + void vscode.window.showInformationMessage('Successfully signed out') + resolve({ action: IamCredentialExpiryAction.SignOut }) + break + } + } + } catch (error) { + logger.error('SMUS: Failed to handle credential expiry action: %s', error) + // Only show error for non-reauthenticate cases (reauthenticate handles its own errors) + if (itemWithAction.action !== IamCredentialExpiryAction.Reauthenticate) { + void vscode.window.showErrorMessage(`Failed to complete action: ${(error as Error).message}`) + } + reject(error) + } + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + logger.debug('SMUS: Credential expiry options cancelled by user') + resolve({ action: IamCredentialExpiryAction.Cancelled }) + } + }) + + quickPick.show() + }) +} diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index 4a9c9a76a87..b215623d79d 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -27,7 +27,9 @@ import { SmusConnection, SmusIamConnection, isSmusSsoConnection, + isSmusIamConnection, } from '../model' +import { IamCredentialExpiryAction, showIamCredentialExpiryOptions } from '../credentialExpiryHandler' import { DomainExecRoleCredentialsProvider } from './domainExecRoleCredentialsProvider' import { ProjectRoleCredentialsProvider } from './projectRoleCredentialsProvider' @@ -367,7 +369,7 @@ export class SmusAuthenticationProvider { } catch (error) { logger.error(`SMUS: Failed to sign out from connection ${connectionId}:`, error) throw new ToolkitError('Failed to sign out from SageMaker Unified Studio', { - code: 'SignOutFailed', + code: SmusErrorCodes.SignOutFailed, cause: error instanceof Error ? error : undefined, }) } @@ -388,7 +390,7 @@ export class SmusAuthenticationProvider { // Validate domain ID if (!domainId) { - throw new ToolkitError('Invalid domain URL format', { code: 'InvalidDomainUrl' }) + throw new ToolkitError('Invalid domain URL format', { code: SmusErrorCodes.InvalidDomainUrl }) } logger.info(`SMUS: Connecting to domain ${domainId} in region ${region}`) @@ -475,7 +477,7 @@ export class SmusAuthenticationProvider { return result as SmusConnection } catch (e) { throw ToolkitError.chain(e, 'Failed to connect to SageMaker Unified Studio', { - code: 'FailedToConnect', + code: SmusErrorCodes.FailedToConnect, }) } } @@ -503,7 +505,7 @@ export class SmusAuthenticationProvider { // Validate domain ID if (!domainId) { - throw new ToolkitError('Invalid domain URL format', { code: 'InvalidDomainUrl' }) + throw new ToolkitError('Invalid domain URL format', { code: SmusErrorCodes.InvalidDomainUrl }) } logger.info(`SMUS: Connecting with IAM profile ${profileName} to domain ${domainId} in region ${region}`) @@ -560,12 +562,12 @@ export class SmusAuthenticationProvider { throw new ToolkitError( `IAM profile connection not found for '${profileName}'. Please check your AWS credentials configuration.`, { - code: 'ConnectionNotFound', + code: SmusErrorCodes.ConnectionNotFound, } ) } catch (e) { throw ToolkitError.chain(e, 'Failed to connect to SageMaker Unified Studio with IAM profile', { - code: 'FailedToConnect', + code: SmusErrorCodes.FailedToConnect, }) } } @@ -692,9 +694,35 @@ export class SmusAuthenticationProvider { * @returns Promise resolving to the reauthenticated connection */ @withTelemetryContext({ name: 'reauthenticate', class: authClassName }) - public async reauthenticate(conn: SsoConnection) { + public async reauthenticate(conn: SmusConnection): Promise { try { - return await this.auth.reauthenticate(conn) + // Check if this is an IAM connection + if (isSmusIamConnection(conn)) { + // For IAM connections, show options menu + this.logger.debug('SMUS: Showing IAM credential expiry options for reauthentication') + const result = await showIamCredentialExpiryOptions(this, conn, globals.context) + + // Handle the result - for most actions, return the original connection + // The actions have already been performed (sign out, edit credentials, etc.) + if (result.action === IamCredentialExpiryAction.SignOut) { + throw new ToolkitError('User signed out from connection', { cancelled: true }) + } else if (result.action === IamCredentialExpiryAction.Cancelled) { + throw new ToolkitError('Reauthentication cancelled by user', { cancelled: true }) + } + + // For Reauthenticate, EditCredentials, and SwitchProfile, return the connection + return conn + } else { + // For SSO connections, use existing re-auth flow + const reauthenticatedConn = await this.auth.reauthenticate(conn) + + // Re-add SMUS-specific properties that aren't preserved by the base auth system + return { + ...reauthenticatedConn, + domainUrl: conn.domainUrl, + domainId: conn.domainId, + } as SmusConnection + } } catch (err) { throw ToolkitError.chain(err, 'Unable to reauthenticate SageMaker Unified Studio connection.') } @@ -704,7 +732,7 @@ export class SmusAuthenticationProvider { * Shows a reauthentication prompt to the user * @param conn Connection to reauthenticate */ - public async showReauthenticationPrompt(conn: SsoConnection): Promise { + public async showReauthenticationPrompt(conn: SmusConnection): Promise { await showReauthenticateMessage({ message: localizedText.connectionExpired('SageMaker Unified Studio'), connect: localizedText.reauthenticate, @@ -733,7 +761,7 @@ export class SmusAuthenticationProvider { // Only SSO connections have access tokens if (!isSmusSsoConnection(connection)) { throw new ToolkitError('Access tokens are only available for SSO connections', { - code: 'InvalidConnectionType', + code: SmusErrorCodes.InvalidConnectionType, }) } @@ -1122,7 +1150,7 @@ export class SmusAuthenticationProvider { // Domain Execution Role credentials are only available for SSO connections if (!isSmusSsoConnection(connection)) { throw new ToolkitError('Domain Execution Role credentials are only available for SSO connections', { - code: 'InvalidConnectionType', + code: SmusErrorCodes.InvalidConnectionType, }) } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts index f3edd5be90e..8f88f299034 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts @@ -17,6 +17,7 @@ import { SagemakerUnifiedStudioSpaceNode } from './nodes/sageMakerUnifiedStudioS import { SageMakerUnifiedStudioProjectNode } from './nodes/sageMakerUnifiedStudioProjectNode' import { getLogger } from '../../shared/logger/logger' import { setSmusConnectedContext, SmusAuthenticationProvider } from '../auth/providers/smusAuthenticationProvider' +import { isSmusIamConnection } from '../auth/model' import { setupUserActivityMonitoring } from '../../awsService/sagemaker/sagemakerSpace' import { telemetry } from '../../shared/telemetry/telemetry' import { isSageMaker } from '../../shared/extensionUtilities' @@ -101,15 +102,32 @@ export async function activate(extensionContext: vscode.ExtensionContext): Promi if (connection) { try { await smusAuthProvider.reauthenticate(connection) - // Refresh the tree view after successful reauthentication treeDataProvider.refresh() - // Show success message - void vscode.window.showInformationMessage( - 'Successfully reauthenticated with SageMaker Unified Studio' - ) + + // IAM connections handle their own success messages + // Only show success message for SSO connections + if (!isSmusIamConnection(connection)) { + void vscode.window.showInformationMessage( + 'Successfully reauthenticated with SageMaker Unified Studio' + ) + } } catch (error) { - // Show error message if reauthentication fails - void vscode.window.showErrorMessage(`Failed to reauthenticate: ${error}`) + // Extract the most detailed error message available + let errorMessage = 'Unknown error' + if (error instanceof Error) { + // Check if this is a ToolkitError with a cause chain + const cause = (error as any).cause + if (cause instanceof Error) { + // Use the cause's message as it contains the detailed validation error + errorMessage = cause.message + } else { + // Fall back to the error's own message + errorMessage = error.message + } + } + + // Show the detailed error message to the user + void vscode.window.showErrorMessage(`${errorMessage}`) logger.error('SMUS: Reauthentication failed: %O', error) } } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 9621192e27c..7a48a2761d3 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -78,6 +78,18 @@ export const SmusErrorCodes = { CredentialProviderInitFailed: 'CredentialProviderInitFailed', /** Error code for when IAM profile type is invalid */ InvalidProfileType: 'InvalidProfileType', + /** Error code for when IAM credential validation fails */ + IamValidationFailed: 'IamValidationFailed', + /** Error code for when sign out operation fails */ + SignOutFailed: 'SignOutFailed', + /** Error code for when domain URL format is invalid */ + InvalidDomainUrl: 'InvalidDomainUrl', + /** Error code for when connection to SMUS fails */ + FailedToConnect: 'FailedToConnect', + /** Error code for when connection is not found */ + ConnectionNotFound: 'ConnectionNotFound', + /** Error code for when connection type is invalid for the operation */ + InvalidConnectionType: 'InvalidConnectionType', } as const /** diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 3a3bbc5dea5..3ebfd6bb88d 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -317,10 +317,16 @@ describe('SmusAuthenticationProvider', function () { }) describe('reauthenticate', function () { - it('should call auth reauthenticate', async function () { + it('should call auth reauthenticate for SSO connection', async function () { const result = await smusAuthProvider.reauthenticate(mockSmusConnection) - assert.strictEqual(result, mockSmusConnection) + // Verify the result has the correct SMUS properties preserved + assert.strictEqual(result.id, mockSmusConnection.id) + assert.strictEqual(result.domainUrl, mockSmusConnection.domainUrl) + assert.strictEqual(result.domainId, mockSmusConnection.domainId) + assert.strictEqual(result.type, mockSmusConnection.type) + assert.strictEqual(result.startUrl, mockSmusConnection.startUrl) + assert.strictEqual(result.label, mockSmusConnection.label) assert.ok(mockAuth.reauthenticate.calledWith(mockSmusConnection)) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts index 6f2b22190f3..519f491c742 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts @@ -19,6 +19,7 @@ import { SeverityLevel } from '../../shared/vscode/message' import * as extensionUtilities from '../../../shared/extensionUtilities' import { createMockSpaceNode } from '../testUtils' import { DataZoneClient } from '../../../sagemakerunifiedstudio/shared/client/datazoneClient' +import * as model from '../../../sagemakerunifiedstudio/auth/model' describe('SMUS Explorer Activation', function () { let mockExtensionContext: vscode.ExtensionContext @@ -261,7 +262,124 @@ describe('SMUS Explorer Activation', function () { // Check that an error message was shown const errorMessages = testWindow.shownMessages.filter((msg) => msg.severity === SeverityLevel.Error) assert.ok(errorMessages.length > 0, 'Should show error message') - assert.ok(errorMessages.some((msg) => msg.message.includes('Failed to reauthenticate'))) + assert.ok(errorMessages.some((msg) => msg.message.includes('Reauthentication failed'))) + }) + + it('should extract detailed error message from ToolkitError cause chain', async function () { + const reauthCommand = registerCommandStub + .getCalls() + .find((call) => call.args[0] === 'aws.smus.reauthenticate') + + assert.ok(reauthCommand) + + const mockConnection = { + id: 'test-connection', + type: 'sso', + startUrl: 'https://identitycenter.amazonaws.com/ssoins-testInstanceId', + ssoRegion: 'us-east-1', + scopes: ['datazone:domain:access'], + label: 'Test Connection', + } as any + + // Create a ToolkitError with a cause chain + const detailedError = new Error('Invalid profile - The security token is expired') + const wrapperError = new Error('Unable to reauthenticate SageMaker Unified Studio connection.') + ;(wrapperError as any).cause = detailedError + mockSmusAuthProvider.reauthenticate.rejects(wrapperError) + + const testWindow = getTestWindow() + + // Execute the command handler + await reauthCommand.args[1](mockConnection) + + // Check that the detailed error message from the cause was shown + const errorMessages = testWindow.shownMessages.filter((msg) => msg.severity === SeverityLevel.Error) + assert.ok(errorMessages.length > 0, 'Should show error message') + const hasDetailedError = errorMessages.some((msg) => + msg.message.includes('Invalid profile - The security token is expired') + ) + assert.ok(hasDetailedError, 'Should show detailed error from cause chain') + }) + + it('should not show success message for IAM connection reauthentication', async function () { + const reauthCommand = registerCommandStub + .getCalls() + .find((call) => call.args[0] === 'aws.smus.reauthenticate') + + assert.ok(reauthCommand) + + // Create an IAM connection + const mockIamConnection = { + id: 'test-iam-connection', + type: 'iam', + profileName: 'test-profile', + region: 'us-east-1', + label: 'Test IAM Connection', + } as any + + // Stub isSmusIamConnection to return true for IAM connection + sinon.stub(model, 'isSmusIamConnection').returns(true) + + // Mock the return value to return the connection (IAM connection handled its own message) + mockSmusAuthProvider.reauthenticate.resolves(mockIamConnection) + + const testWindow = getTestWindow() + + // Execute the command handler + await reauthCommand.args[1](mockIamConnection) + + assert.ok(mockSmusAuthProvider.reauthenticate.calledWith(mockIamConnection)) + assert.ok(mockTreeDataProvider.refresh.called) + + // Check that NO information message was shown (IAM handles its own) + const infoMessages = testWindow.shownMessages.filter( + (msg) => msg.severity === SeverityLevel.Information + ) + assert.ok( + !infoMessages.some((msg) => msg.message.includes('Successfully reauthenticated')), + 'Should not show success message for IAM connection' + ) + }) + + it('should show success message for SSO connection reauthentication', async function () { + const reauthCommand = registerCommandStub + .getCalls() + .find((call) => call.args[0] === 'aws.smus.reauthenticate') + + assert.ok(reauthCommand) + + const mockSsoConnection = { + id: 'test-sso-connection', + type: 'sso', + startUrl: 'https://identitycenter.amazonaws.com/ssoins-testInstanceId', + ssoRegion: 'us-east-1', + scopes: ['datazone:domain:access'], + label: 'Test SSO Connection', + } as any + + // Stub isSmusIamConnection to return false for SSO connection + sinon.stub(model, 'isSmusIamConnection').returns(false) + + // Mock the return value to indicate SSO connection (returns connection object) + mockSmusAuthProvider.reauthenticate.resolves(mockSsoConnection) + + const testWindow = getTestWindow() + + // Execute the command handler + await reauthCommand.args[1](mockSsoConnection) + + assert.ok(mockSmusAuthProvider.reauthenticate.calledWith(mockSsoConnection)) + assert.ok(mockTreeDataProvider.refresh.called) + + // Check that an information message was shown for SSO + const infoMessages = testWindow.shownMessages.filter( + (msg) => msg.severity === SeverityLevel.Information + ) + assert.ok(infoMessages.length > 0, 'Should show information message for SSO') + assert.ok( + infoMessages.some((msg) => msg.message.includes('Successfully reauthenticated')), + 'Should show success message for SSO connection' + ) }) it('should handle aws.smus.refreshProject command', async function () { From bd40c9256357fc0a374f181472d4ec022f244edf Mon Sep 17 00:00:00 2001 From: kzr Date: Tue, 21 Oct 2025 17:27:32 -0700 Subject: [PATCH 15/53] fix(smus):use der credentials in remote ssh (#2262) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem - The data node was not loading in express mode in remote ssh ## Solution - use der credentials in remote ssh for dz client ## standard Screenshot 2025-10-21 at 10 28 50 AM ## express Screenshot 2025-10-21 at 9 15 17 AM --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> --- .../sagemakerunifiedstudio/explorer/nodes/utils.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts index 4d2dce3d8aa..1f2c63a4aeb 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts @@ -481,12 +481,14 @@ export function isFederatedConnection(connection?: DataZoneConnection): boolean export async function createDZClientBaseOnDomainMode( smusAuthProvider: SmusAuthenticationProvider ): Promise { - const credentialsProvider = getContext('aws.smus.isExpressMode') - ? await smusAuthProvider.getCredentialsProviderForIamProfile( - (smusAuthProvider.activeConnection as SmusIamConnection).profileName - ) - : await smusAuthProvider.getDerCredentialsProvider() - + let credentialsProvider + if (getContext('aws.smus.isExpressMode') && !getContext('aws.smus.inSmusSpaceEnvironment')) { + credentialsProvider = await smusAuthProvider.getCredentialsProviderForIamProfile( + (smusAuthProvider.activeConnection as SmusIamConnection).profileName + ) + } else { + credentialsProvider = await smusAuthProvider.getDerCredentialsProvider() + } return DataZoneClient.createWithCredentials( smusAuthProvider.getDomainRegion(), smusAuthProvider.getDomainId(), From bd5facab76dfa0b052f09808174b42b982e83d23 Mon Sep 17 00:00:00 2001 From: zulil <31738836+liuzulin@users.noreply.github.com> Date: Wed, 22 Oct 2025 15:38:52 -0700 Subject: [PATCH 16/53] fix(smus): Validate domain metadata against profile before restoring it (#2265) ## Problem Need to match the domain metadata that is stored with what's actually with the credential profile ## Solution Before calling restore(), compare the domain id and region with what's saved in the metadata. If not match, force update the metadata before restoring the connection --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Zulin Liu --- .../providers/smusAuthenticationProvider.ts | 111 +++++++++++++++++- .../auth/smusAuthenticationProvider.test.ts | 43 ++++++- 2 files changed, 152 insertions(+), 2 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index b215623d79d..85275398579 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -47,6 +47,7 @@ import { DataZoneDomainPreferencesClient } from '../../shared/client/datazoneDom import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' import { DataZoneClient } from '../../shared/client/datazoneClient' import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' +import { loadSharedCredentialsProfiles } from '../../../auth/credentials/sharedCredentials' /** * Sets the context variable for SageMaker Unified Studio connection state @@ -314,9 +315,117 @@ export class SmusAuthenticationProvider { /** * Restores the previous connection - * Uses a promise to prevent multiple simultaneous restore calls + * Validates domain metadata against profile and updates if needed before using saved connection */ public async restore() { + const logger = getLogger() + + // Get the saved connection ID before restoring + const savedConnectionId = this.secondaryAuth.state.get('smus.savedConnectionId') as string + if (!savedConnectionId) { + logger.debug('SMUS: No saved connection ID found, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + // Get the saved connection metadata + const smusConnections = (this.secondaryAuth.state.get('smus.connections') as any) || {} + const connectionMetadata = smusConnections[savedConnectionId] + + // If no connection metadata exists, proceed with normal restore + if (!connectionMetadata) { + logger.debug('SMUS: No connection metadata found, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + const savedProfileName = connectionMetadata.profileName + + // If no profile name in metadata, proceed with normal restore + if (!savedProfileName) { + logger.debug('SMUS: No profile name in metadata, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + const profiles = await loadSharedCredentialsProfiles() + const profile = profiles[savedProfileName] + const region = profile.region || 'not-set' + + const validation = await this.validateIamProfile(savedProfileName) + if (!validation.isValid) { + logger.debug(`SMUS Auth: Profile validation failed: ${validation.error}, proceeding with normal restore`) + await this.secondaryAuth.restoreConnection() + return + } + + let domainUrl + try { + logger.debug(`SMUS Auth: Finding Express domain in region using profile ${savedProfileName}`) + + // Get DataZoneDomainPreferencesClient instance + const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance( + await this.getCredentialsProviderForIamProfile(savedProfileName), + region + ) + + // Find the Express domain using the client + const expressDomain = await domainPreferencesClient.getExpressDomain() + + if (!expressDomain) { + logger.warn(`SMUS Auth: No Express domain found in region ${region}, proceeding with normal restore`) + await this.secondaryAuth.restoreConnection() + return + } + + logger.debug(`SMUS Auth: Found Express domain: ${expressDomain.name} (${expressDomain.id})`) + + // Construct domain URL from the Express domain + domainUrl = expressDomain.portalUrl || `https://${expressDomain.id}.sagemaker.${region}.on.aws/` + logger.debug(`SMUS Auth: Discovered Express domain URL: ${domainUrl}`) + } catch (error) { + logger.error(`SMUS Auth: Failed to find Express domain: ${error} , proceeding with normal restore`) + await this.secondaryAuth.restoreConnection() + return + } + + try { + logger.debug(`SMUS: Validating domain metadata for saved connection ${savedConnectionId}`) + + if (!domainUrl) { + logger.info('SMUS: No domain URL constructed, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + const { domainId } = SmusUtils.extractDomainInfoFromUrl(domainUrl) + + // Compare with saved metadata + const savedDomainId = connectionMetadata.domainId + const savedRegion = connectionMetadata.region + + if (domainId === savedDomainId && region === savedRegion) { + logger.debug('SMUS: Domain metadata matches, proceeding with normal restore') + } else { + logger.debug( + `SMUS: Domain metadata mismatch detected. Saved: ${savedDomainId}@${savedRegion}, Profile: ${domainId}@${region}. Updating metadata.` + ) + + // Update the metadata with API values + connectionMetadata.domainId = domainId + connectionMetadata.region = region + + // Save updated metadata + smusConnections[savedConnectionId] = connectionMetadata + await this.secondaryAuth.state.update('smus.connections', smusConnections) + + logger.debug('SMUS: Successfully updated domain metadata') + } + } catch (error) { + logger.warn(`SMUS: Failed to validate domain metadata: ${error}. Proceeding with normal restore.`) + } + + // Proceed with normal restore await this.secondaryAuth.restoreConnection() } diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 3ebfd6bb88d..b0a5bb8542b 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -192,8 +192,49 @@ describe('SmusAuthenticationProvider', function () { }) describe('restore', function () { - it('should call secondary auth restoreConnection', async function () { + let mockState: any + let loadSharedCredentialsProfilesStub: sinon.SinonStub + let validateIamProfileStub: sinon.SinonStub + beforeEach(function () { + mockState = { + get: sinon.stub(), + update: sinon.stub().resolves(), + } + mockSecondaryAuth.state = mockState + + loadSharedCredentialsProfilesStub = sinon.stub( + require('../../../auth/credentials/sharedCredentials'), + 'loadSharedCredentialsProfiles' + ) + validateIamProfileStub = sinon.stub(smusAuthProvider, 'validateIamProfile') + }) + + it('should call secondary auth restoreConnection when no saved connection ID', async function () { + mockState.get.withArgs('smus.savedConnectionId').returns(undefined) + await smusAuthProvider.restore() + + assert.ok(mockSecondaryAuth.restoreConnection.called) + assert.ok(loadSharedCredentialsProfilesStub.notCalled) + }) + + it('should validate IAM profile and restore connection', async function () { + const savedConnectionId = 'test-connection-id' + const connectionMetadata = { + profileName: 'test-profile', + domainId: 'old-domain-id', + region: 'us-west-1', + } + const smusConnections = { [savedConnectionId]: connectionMetadata } + + mockState.get.withArgs('smus.savedConnectionId').returns(savedConnectionId) + mockState.get.withArgs('smus.connections').returns(smusConnections) + loadSharedCredentialsProfilesStub.resolves({ 'test-profile': { region: 'us-east-1' } }) + validateIamProfileStub.resolves({ isValid: true }) + + await smusAuthProvider.restore() + + assert.ok(validateIamProfileStub.calledWith('test-profile')) assert.ok(mockSecondaryAuth.restoreConnection.called) }) }) From 747f0870b3d94e4ce682409b978829b3bfd3c9b3 Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Wed, 22 Oct 2025 18:11:27 -0700 Subject: [PATCH 17/53] Merge feature/smus-m2 into feature/smus-m2-kiro (#2264) ## Problem Auto merging from `feature/smus-m2` -> `feature/smus-m2-kiro` is not currently set up. ## Solution Created the merge PR manually. We will have to do this from time to time to keep the `feature/smus-m2-kiro` branch updated. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: Bhargav Co-authored-by: Bhargava Varadharajan Co-authored-by: zulil <31738836+liuzulin@users.noreply.github.com> Co-authored-by: Zulin Liu Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Co-authored-by: kzr Co-authored-by: aws-toolkit-automation <43144436+aws-toolkit-automation@users.noreply.github.com> Co-authored-by: David <60020664+dhasani23@users.noreply.github.com> Co-authored-by: David Hasani Co-authored-by: Arkaprava De Co-authored-by: Arkaprava De Co-authored-by: Keyu Wu Co-authored-by: chungjac Co-authored-by: aws-asolidu Co-authored-by: Newton Der Co-authored-by: Newton Der Co-authored-by: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Co-authored-by: Boyu Co-authored-by: atontb <104926752+atonaamz@users.noreply.github.com> Co-authored-by: Richard Li <742829+rli@users.noreply.github.com> Co-authored-by: Shruti Sinha <44882001+shruti0085@users.noreply.github.com> --- .github/workflows/setup-release-candidate.yml | 3 +- LICENSE-THIRD-PARTY | 792 +++++++++--------- package-lock.json | 4 +- packages/amazonq/.changes/1.100.0.json | 5 + packages/amazonq/.changes/1.99.0.json | 5 + packages/amazonq/CHANGELOG.md | 8 + packages/amazonq/package.json | 2 +- .../app/inline/EditRendering/displayImage.ts | 46 +- packages/amazonq/src/app/inline/completion.ts | 44 + .../src/app/inline/recommendationService.ts | 25 +- .../inline/EditRendering/displayImage.test.ts | 107 +++ packages/core/src/auth/sso/clients.ts | 13 +- .../core/src/awsService/sagemaker/commands.ts | 18 +- .../awsService/sagemaker/credentialMapping.ts | 11 +- .../core/src/awsService/sagemaker/model.ts | 5 +- .../src/awsService/sagemaker/uriHandlers.ts | 9 +- .../transformByQ/transformApiHandler.ts | 10 +- .../transformByQ/transformFileHandler.ts | 21 +- .../transformByQ/transformMavenHandler.ts | 6 +- .../auth/authenticationOrchestrator.ts | 33 +- .../auth/credentialExpiryHandler.ts | 241 ++++++ .../connectionCredentialsProvider.ts | 13 +- .../projectRoleCredentialsProvider.ts | 4 +- .../providers/smusAuthenticationProvider.ts | 268 +++++- .../explorer/activation.ts | 34 +- .../nodes/federatedConnectionStrategy.ts | 332 ++++++++ .../explorer/nodes/s3Strategy.ts | 101 ++- .../sageMakerUnifiedStudioAuthInfoNode.ts | 35 +- .../sageMakerUnifiedStudioComputeNode.ts | 15 +- ...eMakerUnifiedStudioConnectionParentNode.ts | 4 +- .../nodes/sageMakerUnifiedStudioDataNode.ts | 125 ++- .../sageMakerUnifiedStudioProjectNode.ts | 14 +- .../nodes/sageMakerUnifiedStudioRootNode.ts | 9 +- .../sageMakerUnifiedStudioSpacesParentNode.ts | 12 +- .../explorer/nodes/types.ts | 22 + .../explorer/nodes/utils.ts | 141 +++- .../shared/client/datazoneClient.ts | 239 +++--- .../client/datazoneDomainPreferencesClient.ts | 47 ++ .../shared/client/s3Client.ts | 38 +- .../shared/smusUtils.ts | 101 ++- .../shared/telemetry.ts | 5 +- packages/core/src/shared/clients/sagemaker.ts | 43 +- packages/core/src/shared/sshConfig.ts | 2 +- .../awsService/sagemaker/uriHandlers.test.ts | 20 + .../commands/transformByQ.test.ts | 16 +- .../connectionCredentialsProvider.test.ts | 14 +- .../projectRoleCredentialsProvider.test.ts | 26 +- .../auth/smusAuthenticationProvider.test.ts | 286 ++++++- .../explorer/activation.test.ts | 126 ++- .../nodes/federatedConnectionStrategy.test.ts | 185 ++++ ...sageMakerUnifiedStudioAuthInfoNode.test.ts | 40 +- .../sageMakerUnifiedStudioComputeNode.test.ts | 19 +- ...rUnifiedStudioConnectionParentNode.test.ts | 28 +- .../sageMakerUnifiedStudioDataNode.test.ts | 18 +- .../sageMakerUnifiedStudioProjectNode.test.ts | 10 +- .../sageMakerUnifiedStudioRootNode.test.ts | 20 +- ...MakerUnifiedStudioSpacesParentNode.test.ts | 13 +- .../shared/client/datazoneClient.test.ts | 98 ++- .../datazoneDomainPreferencesClient.test.ts | 122 +++ .../shared/smusUtils.test.ts | 117 +++ .../shared/clients/sagemakerClient.test.ts | 1 + packages/toolkit/.changes/3.79.0.json | 5 + packages/toolkit/.changes/3.80.0.json | 10 + packages/toolkit/CHANGELOG.md | 8 + packages/toolkit/package.json | 2 +- 65 files changed, 3385 insertions(+), 811 deletions(-) create mode 100644 packages/amazonq/.changes/1.100.0.json create mode 100644 packages/amazonq/.changes/1.99.0.json create mode 100644 packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts create mode 100644 packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts create mode 100644 packages/toolkit/.changes/3.79.0.json create mode 100644 packages/toolkit/.changes/3.80.0.json diff --git a/.github/workflows/setup-release-candidate.yml b/.github/workflows/setup-release-candidate.yml index 30e82c82433..390669d22af 100644 --- a/.github/workflows/setup-release-candidate.yml +++ b/.github/workflows/setup-release-candidate.yml @@ -49,7 +49,8 @@ jobs: # Add generated license files git add LICENSE-THIRD-PARTY - git commit -m "Update third-party license attribution for $BRANCH_NAME" + # If there are no changes, then we don't need a new attribution commit + git commit -m "Update third-party license attribution for $BRANCH_NAME" || true # Push RC branch git push origin $BRANCH_NAME diff --git a/LICENSE-THIRD-PARTY b/LICENSE-THIRD-PARTY index 28b4dd7bd3d..efdb4af3017 100644 --- a/LICENSE-THIRD-PARTY +++ b/LICENSE-THIRD-PARTY @@ -2846,320 +2846,320 @@ @protobufjs/aspromise 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/base64 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/codegen 2.0.4 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/eventemitter 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/fetch 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/float 1.0.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/inquire 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/path 1.1.2 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/pool 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @protobufjs/utf8 1.1.0 -Copyright (c) 2016, Daniel Wirtz All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - -* Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. -* Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. -* Neither the name of its author, nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Copyright (c) 2016, Daniel Wirtz All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. +* Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. +* Neither the name of its author, nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ****************************** @@ -5191,13 +5191,13 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. color-name 1.1.4 -The MIT License (MIT) -Copyright (c) 2015 Dmitry Ivanov - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - +The MIT License (MIT) +Copyright (c) 2015 Dmitry Ivanov + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************** @@ -8721,27 +8721,27 @@ THE SOFTWARE. registry-js 1.16.1 -MIT License - -Copyright (c) 2017 GitHub Desktop - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2017 GitHub Desktop + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -9650,17 +9650,17 @@ THE SOFTWARE. tslib 2.8.1 -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ****************************** @@ -9727,61 +9727,61 @@ END OF TERMS AND CONDITIONS typescript 4.9.5 -Apache License - -Version 2.0, January 2004 - -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - -"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - -You must give any other recipients of the Work or Derivative Works a copy of this License; and - -You must cause any modified files to carry prominent notices stating that You changed the files; and - -You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - -If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS +Apache License + +Version 2.0, January 2004 + +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + +"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of this License; and + +You must cause any modified files to carry prominent notices stating that You changed the files; and + +You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + +If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS ****************************** @@ -10251,27 +10251,27 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. win-ca 3.5.1 -MIT License - -Copyright (c) 2020 Stas Ukolov - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. +MIT License + +Copyright (c) 2020 Stas Ukolov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. ****************************** @@ -10339,27 +10339,27 @@ IN THE SOFTWARE. xmlbuilder 11.0.1 -The MIT License (MIT) - -Copyright (c) 2013 Ozgur Ozcitak - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +The MIT License (MIT) + +Copyright (c) 2013 Ozgur Ozcitak + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. ****************************** diff --git a/package-lock.json b/package-lock.json index 2b2f038eba3..8f91138e1fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33364,7 +33364,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.99.0-SNAPSHOT", + "version": "1.101.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -35105,7 +35105,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.79.0-SNAPSHOT", + "version": "3.81.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.100.0.json b/packages/amazonq/.changes/1.100.0.json new file mode 100644 index 00000000000..e1deb61908b --- /dev/null +++ b/packages/amazonq/.changes/1.100.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-16", + "version": "1.100.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.99.0.json b/packages/amazonq/.changes/1.99.0.json new file mode 100644 index 00000000000..9d1089ee8fa --- /dev/null +++ b/packages/amazonq/.changes/1.99.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-10", + "version": "1.99.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index afef3bdc7a7..5fac9084c01 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.100.0 2025-10-16 + +- Miscellaneous non-user-facing changes + +## 1.99.0 2025-10-10 + +- Miscellaneous non-user-facing changes + ## 1.98.0 2025-10-02 - Miscellaneous non-user-facing changes diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index cfe150bd418..b9d491a258b 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "The most capable generative AI–powered assistant for software development.", - "version": "1.99.0-SNAPSHOT", + "version": "1.101.0-SNAPSHOT", "extensionKind": [ "workspace" ], diff --git a/packages/amazonq/src/app/inline/EditRendering/displayImage.ts b/packages/amazonq/src/app/inline/EditRendering/displayImage.ts index 0af4d4801c0..7ccedc3489b 100644 --- a/packages/amazonq/src/app/inline/EditRendering/displayImage.ts +++ b/packages/amazonq/src/app/inline/EditRendering/displayImage.ts @@ -17,6 +17,7 @@ import type { AmazonQInlineCompletionItemProvider } from '../completion' import { vsCodeState } from 'aws-core-vscode/codewhisperer' const autoRejectEditCursorDistance = 25 +const autoDiscardEditCursorDistance = 10 export class EditDecorationManager { private imageDecorationType: vscode.TextEditorDecorationType @@ -312,6 +313,21 @@ export async function displaySvgDecoration( item: InlineCompletionItemWithReferences, inlineCompletionProvider?: AmazonQInlineCompletionItemProvider ) { + function logSuggestionFailure(type: 'DISCARD' | 'REJECT', reason: string, suggestionContent: string) { + getLogger('nextEditPrediction').debug( + `Auto ${type} edit suggestion with reason=${reason}, suggetion: ${suggestionContent}` + ) + } + // Check if edit is too far from current cursor position + const currentCursorLine = editor.selection.active.line + if (Math.abs(startLine - currentCursorLine) >= autoDiscardEditCursorDistance) { + // Emit DISCARD telemetry for edit suggestion that can't be shown because the suggestion is too far away + const params = createDiscardTelemetryParams(session, item) + languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + logSuggestionFailure('DISCARD', 'cursor is too far away', item.insertText as string) + return + } + const originalCode = editor.document.getText() // Set edit state immediately to prevent race condition with completion requests @@ -327,9 +343,7 @@ export async function displaySvgDecoration( // Emit DISCARD telemetry for edit suggestion that can't be shown due to active completion const params = createDiscardTelemetryParams(session, item) languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) - getLogger('nextEditPrediction').debug( - `Auto discarded edit suggestion for active completion suggestion: ${item.insertText as string}` - ) + logSuggestionFailure('DISCARD', 'Conflicting active inline completion', item.insertText as string) return } @@ -342,6 +356,7 @@ export async function displaySvgDecoration( const params = createDiscardTelemetryParams(session, item) // TODO: this session is closed on flare side hence discarded is not emitted in flare languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) + logSuggestionFailure('DISCARD', 'Invalid patch', item.insertText as string) return } const documentChangeListener = vscode.workspace.onDidChangeTextDocument((e) => { @@ -360,9 +375,7 @@ export async function displaySvgDecoration( const isPatchValid = applyPatch(e.document.getText(), item.insertText as string) if (!isPatchValid) { - getLogger('nextEditPrediction').debug( - `Auto rejected edit suggestion for invalid patch: ${item.insertText as string}}` - ) + logSuggestionFailure('REJECT', 'Invalid patch due to document change', item.insertText as string) void vscode.commands.executeCommand('aws.amazonq.inline.rejectEdit') } }) @@ -376,6 +389,11 @@ export async function displaySvgDecoration( const currentPosition = e.selections[0].active const distance = Math.abs(currentPosition.line - startLine) if (distance > autoRejectEditCursorDistance) { + logSuggestionFailure( + 'REJECT', + `cursor position move too far away off ${autoRejectEditCursorDistance} lines`, + item.insertText as string + ) void vscode.commands.executeCommand('aws.amazonq.inline.rejectEdit') } }) @@ -399,9 +417,6 @@ export async function displaySvgDecoration( const endPosition = getEndOfEditPosition(originalCode, newCode) editor.selection = new vscode.Selection(endPosition, endPosition) - // Move cursor to end of the actual changed content - editor.selection = new vscode.Selection(endPosition, endPosition) - await decorationManager.clearDecorations(editor) documentChangeListener.dispose() cursorChangeListener.dispose() @@ -420,19 +435,6 @@ export async function displaySvgDecoration( } languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) session.triggerOnAcceptance = true - // VS Code triggers suggestion on every keystroke, temporarily disable trigger on acceptance - // if (inlineCompletionProvider && session.editsStreakPartialResultToken) { - // await inlineCompletionProvider.provideInlineCompletionItems( - // editor.document, - // endPosition, - // { - // triggerKind: vscode.InlineCompletionTriggerKind.Automatic, - // selectedCompletionInfo: undefined, - // }, - // new vscode.CancellationTokenSource().token, - // { emitTelemetry: false, showUi: false, editsStreakToken: session.editsStreakPartialResultToken } - // ) - // } }, async (isDiscard: boolean) => { // Handle reject diff --git a/packages/amazonq/src/app/inline/completion.ts b/packages/amazonq/src/app/inline/completion.ts index 9c4f8e3ad20..c113d3cd2fb 100644 --- a/packages/amazonq/src/app/inline/completion.ts +++ b/packages/amazonq/src/app/inline/completion.ts @@ -213,6 +213,8 @@ export class InlineCompletionManager implements Disposable { export class AmazonQInlineCompletionItemProvider implements InlineCompletionItemProvider { private logger = getLogger() + private pendingRequest: Promise | undefined + constructor( private readonly languageClient: LanguageClient, private readonly recommendationService: RecommendationService, @@ -300,6 +302,48 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem options: JSON.stringify(getAllRecommendationsOptions), }) + // If there's already a pending request, wait for it to complete instead of starting a new one + // This prevents race conditions where multiple concurrent calls cause the later (empty) response + // to override the earlier (valid) response + if (this.pendingRequest) { + getLogger().info('Reusing pending inline completion request to avoid race condition') + try { + const result = await this.pendingRequest + // Check if THIS call's token was cancelled (not the original call's token) + if (token.isCancellationRequested) { + getLogger().info('Reused request completed but this call was cancelled') + return [] + } + return result + } catch (e) { + // If the pending request failed, continue with a new request + getLogger().info('Pending request failed, starting new request: %O', e) + } + } + + // Start a new request and track it + this.pendingRequest = this._provideInlineCompletionItemsImpl( + document, + position, + context, + token, + getAllRecommendationsOptions + ) + + try { + return await this.pendingRequest + } finally { + this.pendingRequest = undefined + } + } + + private async _provideInlineCompletionItemsImpl( + document: TextDocument, + position: Position, + context: InlineCompletionContext, + token: CancellationToken, + getAllRecommendationsOptions?: GetAllRecommendationsOptions + ): Promise { if (vsCodeState.isCodeWhispererEditing) { getLogger().info('Q is editing, returning empty') return [] diff --git a/packages/amazonq/src/app/inline/recommendationService.ts b/packages/amazonq/src/app/inline/recommendationService.ts index 60fa8749cb0..bc9f8052695 100644 --- a/packages/amazonq/src/app/inline/recommendationService.ts +++ b/packages/amazonq/src/app/inline/recommendationService.ts @@ -35,6 +35,8 @@ export interface GetAllRecommendationsOptions { } export class RecommendationService { + private logger = getLogger() + constructor( private readonly sessionManager: SessionManager, private cursorUpdateRecorder?: ICursorUpdateRecorder @@ -117,7 +119,7 @@ export class RecommendationService { } // Handle first request - getLogger().info('Sending inline completion request: %O', { + this.logger.info('Sending inline completion request: %O', { method: inlineCompletionWithReferencesRequestType.method, request: { textDocument: request.textDocument, @@ -174,7 +176,7 @@ export class RecommendationService { } } - getLogger().info('Received inline completion response from LSP: %O', { + this.logger.info('Received inline completion response from LSP: %O', { sessionId: result.sessionId, latency: Date.now() - t0, itemCount: result.items?.length || 0, @@ -190,12 +192,14 @@ export class RecommendationService { if (result.items.length > 0 && result.items[0].isInlineEdit === false) { if (isTriggerByDeletion) { + this.logger.info(`Suggestions were discarded; reason: triggerByDeletion`) return [] } // Completion will not be rendered if an edit suggestion has been active for longer than 1 second if (EditSuggestionState.isEditSuggestionDisplayingOverOneSecond()) { const session = this.sessionManager.getActiveSession() if (!session) { + this.logger.error(`Suggestions were discarded; reason: undefined conflicting session`) return [] } const params: LogInlineCompletionSessionResultsParams = { @@ -213,14 +217,14 @@ export class RecommendationService { } languageClient.sendNotification('aws/logInlineCompletionSessionResults', params) this.sessionManager.clear() - getLogger().info( - 'Completion discarded due to active edit suggestion displayed longer than 1 second' + this.logger.info( + 'Suggetions were discarded; reason: active edit suggestion displayed longer than 1 second' ) return [] } else if (EditSuggestionState.isEditSuggestionActive()) { // discard the current edit suggestion if its display time is less than 1 sec await commands.executeCommand('aws.amazonq.inline.rejectEdit', true) - getLogger().info('Discarding active edit suggestion displaying less than 1 second') + this.logger.info('Discarding active edit suggestion displaying less than 1 second') } } @@ -244,11 +248,10 @@ export class RecommendationService { // TODO: question, is it possible that the first request returns empty suggestion but has non-empty next token? if (result.partialResultToken) { + let logstr = `found non null next token; ` if (!isInlineEdit) { // If the suggestion is COMPLETIONS and there are more results to fetch, handle them in the background - getLogger().info( - 'Suggestion type is COMPLETIONS. Start fetching for more items if partialResultToken exists.' - ) + logstr += 'Suggestion type is COMPLETIONS. Start pulling more items' this.processRemainingRequests(languageClient, request, result, token).catch((error) => { languageClient.warn(`Error when getting suggestions: ${error}`) }) @@ -256,12 +259,14 @@ export class RecommendationService { // Skip fetching for more items if the suggesion is EDITS. If it is EDITS suggestion, only fetching for more // suggestions when the user start to accept a suggesion. // Save editsStreakPartialResultToken for the next EDITS suggestion trigger if user accepts. - getLogger().info('Suggestion type is EDITS. Skip fetching for more items.') + logstr += 'Suggestion type is EDITS. Skip pulling more items' this.sessionManager.updateActiveEditsStreakToken(result.partialResultToken) } + + this.logger.info(logstr) } } catch (error: any) { - getLogger().error('Error getting recommendations: %O', error) + this.logger.error('Error getting recommendations: %O', error) // bearer token expired if (error.data && error.data.awsErrorCode === 'E_AMAZON_Q_CONNECTION_EXPIRED') { // ref: https://github.com/aws/aws-toolkit-vscode/blob/amazonq/v1.74.0/packages/core/src/codewhisperer/service/inlineCompletionService.ts#L104 diff --git a/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts b/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts index 0a8cde5bacf..28155811f50 100644 --- a/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts +++ b/packages/amazonq/test/unit/app/inline/EditRendering/displayImage.test.ts @@ -188,6 +188,89 @@ describe('EditDecorationManager', function () { }) }) +describe('displaySvgDecoration cursor distance auto-discard', function () { + let sandbox: sinon.SinonSandbox + let editorStub: sinon.SinonStubbedInstance + let languageClientStub: any + let sessionStub: any + let itemStub: any + + beforeEach(function () { + sandbox = sinon.createSandbox() + const commonStubs = createCommonStubs(sandbox) + editorStub = commonStubs.editorStub + + languageClientStub = { + sendNotification: sandbox.stub(), + } + + sessionStub = { + sessionId: 'test-session', + requestStartTime: Date.now(), + firstCompletionDisplayLatency: 100, + } + + itemStub = { + itemId: 'test-item', + insertText: 'test content', + } + }) + + afterEach(function () { + sandbox.restore() + }) + + it('should send discard telemetry and return early when edit is 10+ lines away from cursor', async function () { + // Set cursor at line 5 + editorStub.selection = { + active: new vscode.Position(5, 0), + } as any + // Try to display edit at line 20 (15 lines away) + await displaySvgDecoration( + editorStub as unknown as vscode.TextEditor, + vscode.Uri.parse('data:image/svg+xml;base64,test'), + 20, + 'new code', + [], + sessionStub, + languageClientStub, + itemStub + ) + + // Verify discard telemetry was sent + sinon.assert.calledOnce(languageClientStub.sendNotification) + const call = languageClientStub.sendNotification.getCall(0) + assert.strictEqual(call.args[0], 'aws/logInlineCompletionSessionResults') + assert.strictEqual(call.args[1].sessionId, 'test-session') + assert.strictEqual(call.args[1].completionSessionResult['test-item'].discarded, true) + }) + + it('should proceed normally when edit is within 10 lines of cursor', async function () { + // Set cursor at line 5 + editorStub.selection = { + active: new vscode.Position(5, 0), + } as any + // Mock required dependencies for normal flow + sandbox.stub(vscode.workspace, 'onDidChangeTextDocument').returns({ dispose: sandbox.stub() }) + sandbox.stub(vscode.window, 'onDidChangeTextEditorSelection').returns({ dispose: sandbox.stub() }) + + // Try to display edit at line 10 (5 lines away) + await displaySvgDecoration( + editorStub as unknown as vscode.TextEditor, + vscode.Uri.parse('data:image/svg+xml;base64,test'), + 10, + 'new code', + [], + sessionStub, + languageClientStub, + itemStub + ) + + // Verify no discard telemetry was sent (function should proceed normally) + sinon.assert.notCalled(languageClientStub.sendNotification) + }) +}) + describe('displaySvgDecoration cursor distance auto-reject', function () { let sandbox: sinon.SinonSandbox let editorStub: sinon.SinonStubbedInstance @@ -253,6 +336,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when cursor moves less than 25 lines away', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -262,6 +349,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when cursor moves exactly 25 lines away', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -271,6 +362,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should reject when cursor moves more than 25 lines away', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -280,6 +375,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should reject when cursor moves more than 25 lines before the edit', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any const startLine = 50 await setupDisplaySvgDecoration(startLine) @@ -289,6 +388,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when edit is near beginning of file and cursor cannot move far enough', async function () { + // Set cursor at line 10 + editorStub.selection = { + active: new vscode.Position(10, 0), + } as any const startLine = 10 await setupDisplaySvgDecoration(startLine) @@ -298,6 +401,10 @@ describe('displaySvgDecoration cursor distance auto-reject', function () { }) it('should not reject when edit suggestion is not active', async function () { + // Set cursor at line 50 + editorStub.selection = { + active: new vscode.Position(50, 0), + } as any editSuggestionStateStub.returns(false) const startLine = 50 diff --git a/packages/core/src/auth/sso/clients.ts b/packages/core/src/auth/sso/clients.ts index e921cb7856e..2fa8b1a3854 100644 --- a/packages/core/src/auth/sso/clients.ts +++ b/packages/core/src/auth/sso/clients.ts @@ -30,7 +30,6 @@ import { getLogger } from '../../shared/logger/logger' import { SsoAccessTokenProvider } from './ssoAccessTokenProvider' import { AwsClientResponseError, isClientFault } from '../../shared/errors' import { DevSettings } from '../../shared/settings' -import { SdkError } from '@aws-sdk/types' import { HttpRequest, HttpResponse } from '@smithy/protocol-http' import { StandardRetryStrategy, defaultRetryDecider } from '@smithy/middleware-retry' import { AuthenticationFlow } from './model' @@ -104,22 +103,12 @@ export class OidcClient { } public static create(region: string) { - const updatedRetryDecider = (err: SdkError) => { - if (defaultRetryDecider(err)) { - return true - } - - // As part of SIM IDE-10703, there was an assumption that retrying on InvalidGrantException - // may be useful. This may not be the case anymore and if more research is done, this may not be needed. - // TODO: setup some telemetry to see if there are any successes on a subsequent retry for this case. - return err.name === 'InvalidGrantException' - } const client = new SSOOIDC({ region, endpoint: DevSettings.instance.get('endpoints', {})['ssooidc'], retryStrategy: new StandardRetryStrategy( () => Promise.resolve(3), // Maximum number of retries - { retryDecider: updatedRetryDecider } + { retryDecider: defaultRetryDecider } ), customUserAgent: getUserAgent({ includePlatform: true, includeClientId: true }), requestHandler: { diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index 64266c556e1..ce0b7edd7db 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -86,7 +86,8 @@ export async function deeplinkConnect( session: string, wsUrl: string, token: string, - domain: string + domain: string, + appType?: string ) { getLogger().debug( `sm:deeplinkConnect: connectionIdentifier: ${connectionIdentifier} session: ${session} wsUrl: ${wsUrl} token: ${token}` @@ -107,7 +108,8 @@ export async function deeplinkConnect( session, wsUrl, token, - domain + domain, + appType ) await startVscodeRemote( @@ -133,6 +135,16 @@ export async function stopSpace( ctx: vscode.ExtensionContext, sageMakerClient?: SagemakerClient ) { + await tryRefreshNode(node) + if (node.getStatus() === 'Stopped' || node.getStatus() === 'Stopping') { + void vscode.window.showWarningMessage(`Space ${node.spaceApp.SpaceName} is already in Stopped/Stopping state.`) + return + } else if (node.getStatus() === 'Starting') { + void vscode.window.showWarningMessage( + `Space ${node.spaceApp.SpaceName} is in Starting state. Wait until it is Running to attempt stop again.` + ) + return + } const spaceName = node.spaceApp.SpaceName! const confirmed = await showConfirmationMessage({ prompt: `You are about to stop this space. Any active resource will also be stopped. Are you sure you want to stop the space?`, @@ -179,7 +191,7 @@ export async function openRemoteConnect( void vscode.window.showErrorMessage(ConnectFromRemoteWorkspaceMessage) return } - + await tryRefreshNode(node) if (node.getStatus() === 'Stopped') { // In case of SMUS, we pass in a SM Client and for SM AI, it creates a new SM Client. const client = sageMakerClient ? sageMakerClient : new SagemakerClient(node.regionCode) diff --git a/packages/core/src/awsService/sagemaker/credentialMapping.ts b/packages/core/src/awsService/sagemaker/credentialMapping.ts index 3eb54feed36..e84b16bb415 100644 --- a/packages/core/src/awsService/sagemaker/credentialMapping.ts +++ b/packages/core/src/awsService/sagemaker/credentialMapping.ts @@ -96,15 +96,16 @@ export async function persistSSMConnection( domain: string, session?: string, wsUrl?: string, - token?: string + token?: string, + appType?: string ): Promise { const { region } = parseArn(spaceArn) const endpoint = DevSettings.instance.get('endpoints', {})['sagemaker'] ?? '' - // TODO: Hardcoded to 'jupyterlab' due to a bug in Studio that only supports refreshing - // the token for both CodeEditor and JupyterLab Apps in the jupyterlab subdomain. - // This will be fixed shortly after NYSummit launch to support refresh URL in CodeEditor subdomain. - const appSubDomain = 'jupyterlab' + let appSubDomain = 'jupyterlab' + if (appType && appType.toLowerCase() === 'codeeditor') { + appSubDomain = 'code-editor' + } let envSubdomain: string diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index 04fd3dab946..227c7399071 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -71,7 +71,8 @@ export async function prepareDevEnvConnection( session?: string, wsUrl?: string, token?: string, - domain?: string + domain?: string, + appType?: string ) { const remoteLogger = configureRemoteConnectionLogger() // Skip Remote SSH extension check in Kiro since it uses embedded SageMaker SSH Kiro extension @@ -102,7 +103,7 @@ export async function prepareDevEnvConnection( await persistSmusProjectCreds(spaceArn, node as SagemakerUnifiedStudioSpaceNode) } } else if (connectionType === 'sm_dl') { - await persistSSMConnection(spaceArn, domain ?? '', session, wsUrl, token) + await persistSSMConnection(spaceArn, domain ?? '', session, wsUrl, token, appType) } await startLocalServer(ctx) diff --git a/packages/core/src/awsService/sagemaker/uriHandlers.ts b/packages/core/src/awsService/sagemaker/uriHandlers.ts index 17c3c512272..6f1143d9054 100644 --- a/packages/core/src/awsService/sagemaker/uriHandlers.ts +++ b/packages/core/src/awsService/sagemaker/uriHandlers.ts @@ -18,7 +18,8 @@ export function register(ctx: ExtContext) { params.session, `${params.ws_url}&cell-number=${params['cell-number']}`, params.token, - params.domain + params.domain, + params.app_type ) }) } @@ -27,7 +28,7 @@ export function register(ctx: ExtContext) { } export function parseConnectParams(query: SearchParams) { - const params = query.getFromKeysOrThrow( + const requiredParams = query.getFromKeysOrThrow( 'connection_identifier', 'domain', 'user_profile', @@ -36,5 +37,7 @@ export function parseConnectParams(query: SearchParams) { 'cell-number', 'token' ) - return params + const optionalParams = query.getFromKeys('app_type') + + return { ...requiredParams, ...optionalParams } } diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts index 00dc16398da..45d95ec9a75 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts @@ -275,7 +275,8 @@ function isExcludedSourceFile(path: string): boolean { return sourceExcludedExtensions.some((extension) => path.endsWith(extension)) } -// zip all dependency files and all source files excluding "target" (contains large JARs) plus ".git" and ".idea" (may appear in diff.patch) +// zip all dependency files and all source files +// excludes "target" (contains large JARs) plus ".git", ".idea", and ".github" (may appear in diff.patch) export function getFilesRecursively(dir: string, isDependenciesFolder: boolean): string[] { const entries = nodefs.readdirSync(dir, { withFileTypes: true }) const files = entries.flatMap((entry) => { @@ -284,7 +285,12 @@ export function getFilesRecursively(dir: string, isDependenciesFolder: boolean): if (isDependenciesFolder) { // include all dependency files return getFilesRecursively(res, isDependenciesFolder) - } else if (entry.name !== 'target' && entry.name !== '.git' && entry.name !== '.idea') { + } else if ( + entry.name !== 'target' && + entry.name !== '.git' && + entry.name !== '.idea' && + entry.name !== '.github' + ) { // exclude the above directories when zipping source code return getFilesRecursively(res, isDependenciesFolder) } else { diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts index 91ee8f6639c..b16ea64022c 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformFileHandler.ts @@ -139,8 +139,14 @@ export function validateCustomVersionsFile(fileContents: string) { getLogger().info('CodeTransformation: .YAML file must contain at least dependencies or plugins') return `YAML file must contain at least \`dependencies\` or \`plugins\` under \`dependencyManagement\`` } - for (const item of dependenciesAndPlugins) { - const errorMessage = validateItem(item) + for (const item of dependencies) { + const errorMessage = validateItem(item, false) + if (errorMessage) { + return errorMessage + } + } + for (const item of plugins) { + const errorMessage = validateItem(item, true) if (errorMessage) { return errorMessage } @@ -153,10 +159,15 @@ export function validateCustomVersionsFile(fileContents: string) { } // return an error message, or undefined if item is valid -function validateItem(item: any, validOriginTypes: string[] = ['FIRST_PARTY', 'THIRD_PARTY']) { - if (!/^[^\s:]+:[^\s:]+$/.test(item.identifier)) { +function validateItem(item: any, isPlugin: boolean) { + const validOriginTypes = ['FIRST_PARTY', 'THIRD_PARTY'] + if (!isPlugin && !/^[^\s:]+:[^\s:]+$/.test(item.identifier)) { getLogger().info(`CodeTransformation: Invalid identifier format: ${item.identifier}`) - return `Invalid identifier format: \`${item.identifier}\`. Must be in format \`groupId:artifactId\` without spaces` + return `Invalid dependency identifier format: \`${item.identifier}\`. Must be in format \`groupId:artifactId\` without spaces` + } + if (isPlugin && !item.identifier?.trim()) { + getLogger().info('CodeTransformation: Missing identifier in plugin') + return 'Missing `identifier` in plugin' } if (!validOriginTypes.includes(item.originType)) { getLogger().info(`CodeTransformation: Invalid originType: ${item.originType}`) diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts index 400ac127110..22fcd1e6fa1 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformMavenHandler.ts @@ -17,14 +17,14 @@ import globals from '../../../shared/extensionGlobals' function collectDependenciesAndMetadata(dependenciesFolderPath: string, workingDirPath: string) { getLogger().info('CodeTransformation: running mvn clean test-compile with maven JAR') - const baseCommand = transformByQState.getMavenName() + const baseCommand = transformByQState.getMavenName() // always 'mvn' const jarPath = globals.context.asAbsolutePath(path.join('resources', 'amazonQCT', 'QCT-Maven-1-0-156-0.jar')) getLogger().info('CodeTransformation: running Maven extension with JAR') const args = [ - `-Dmaven.ext.class.path=${jarPath}`, - `-Dcom.amazon.aws.developer.transform.jobDirectory=${dependenciesFolderPath}`, + `-Dmaven.ext.class.path="${jarPath}"`, + `-Dcom.amazon.aws.developer.transform.jobDirectory="${dependenciesFolderPath}"`, 'clean', 'test-compile', ] diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index 60d02bdb55f..d85d5463bb7 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -10,7 +10,12 @@ import { SmusErrorCodes } from '../shared/smusUtils' import { SmusAuthenticationProvider } from './providers/smusAuthenticationProvider' import { SmusSsoAuthenticationUI } from './ui/ssoAuthentication' -import { SmusIamProfileSelector } from './ui/iamProfileSelection' +import { + SmusIamProfileSelector, + IamProfileSelection, + IamProfileEditingInProgress, + IamProfileBackNavigation, +} from './ui/iamProfileSelection' import { SmusAuthenticationPreferencesManager } from './preferences/authenticationPreferences' import { DataZoneDomainPreferencesClient } from '../shared/client/datazoneDomainPreferencesClient' import { recordAuthTelemetry } from '../shared/telemetry' @@ -31,17 +36,37 @@ export class SmusAuthenticationOrchestrator { /** * Handles IAM authentication flow + * @param authProvider The SMUS authentication provider + * @param span Telemetry span + * @param context Extension context + * @param existingProfileName Optional profile name to re-authenticate with (skips profile selection) + * @param existingRegion Optional region to use (skips region selection) */ public static async handleIamAuthentication( authProvider: SmusAuthenticationProvider, span: any, - context: vscode.ExtensionContext + context: vscode.ExtensionContext, + existingProfileName?: string, + existingRegion?: string ): Promise { const logger = this.logger try { - // Show IAM profile selection dialog - const profileSelection = await SmusIamProfileSelector.showIamProfileSelection() + let profileSelection: IamProfileSelection | IamProfileEditingInProgress | IamProfileBackNavigation + + // If profile and region are provided, skip profile selection (re-authentication case) + if (existingProfileName && existingRegion) { + logger.debug( + `SMUS Auth: Re-authenticating with existing profile: ${existingProfileName}, region: ${existingRegion}` + ) + profileSelection = { + profileName: existingProfileName, + region: existingRegion, + } + } else { + // Show IAM profile selection dialog + profileSelection = await SmusIamProfileSelector.showIamProfileSelection() + } // Handle different result types if ('isBack' in profileSelection) { diff --git a/packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts b/packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts new file mode 100644 index 00000000000..458dfa91f46 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/auth/credentialExpiryHandler.ts @@ -0,0 +1,241 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getLogger } from '../../shared/logger/logger' +import { ToolkitError } from '../../shared/errors' +import { SmusErrorCodes } from '../shared/smusUtils' +import { SmusIamProfileSelector } from './ui/iamProfileSelection' +import { getCredentialsFilename, getConfigFilename } from '../../auth/credentials/sharedCredentialsFile' +import type { SmusAuthenticationProvider } from './providers/smusAuthenticationProvider' + +export enum IamCredentialExpiryAction { + Reauthenticate = 'reauthenticate', + EditCredentials = 'editCredentials', + SwitchProfile = 'switchProfile', + SignOut = 'signOut', + Cancelled = 'cancelled', +} + +export type IamCredentialExpiryResult = + | { action: IamCredentialExpiryAction.Reauthenticate } + | { action: IamCredentialExpiryAction.EditCredentials } + | { action: IamCredentialExpiryAction.SwitchProfile } + | { action: IamCredentialExpiryAction.SignOut } + | { action: IamCredentialExpiryAction.Cancelled } + +/** + * Shows credential expiry options for IAM connections + * Provides options to re-authenticate, edit credentials, switch profiles, or sign out + * @param authProvider The SMUS authentication provider + * @param connection The expired IAM connection + * @param extensionContext The extension context + * @returns Promise that resolves with the action taken + */ +export async function showIamCredentialExpiryOptions( + authProvider: SmusAuthenticationProvider, + connection: any, + extensionContext: vscode.ExtensionContext +): Promise { + const logger = getLogger() + + type QuickPickItemWithAction = vscode.QuickPickItem & { action: IamCredentialExpiryAction } + const options: QuickPickItemWithAction[] = [ + { + label: '$(sync) Re-authenticate with current profile', + description: `Profile: ${connection.profileName}`, + detail: 'Refresh credentials using the same IAM profile', + action: IamCredentialExpiryAction.Reauthenticate, + }, + { + label: '$(file-text) Edit credentials file', + description: 'Open ~/.aws/credentials and ~/.aws/config', + detail: 'Manually update your AWS credentials', + action: IamCredentialExpiryAction.EditCredentials, + }, + { + label: '$(arrow-swap) Switch to another profile', + description: 'Select a different IAM profile', + detail: 'Choose from available credential profiles', + action: IamCredentialExpiryAction.SwitchProfile, + }, + { + label: '$(trash) Sign out', + description: 'Sign out from this connection', + detail: 'Remove the expired connection', + action: IamCredentialExpiryAction.SignOut, + }, + ] + + const quickPick = vscode.window.createQuickPick() + quickPick.title = 'IAM Credentials Expired' + quickPick.placeholder = 'Choose how to fix your expired credentials' + quickPick.items = options + quickPick.canSelectMany = false + quickPick.ignoreFocusOut = true + + return new Promise((resolve, reject) => { + let isCompleted = false + + quickPick.onDidAccept(async () => { + const selectedItem = quickPick.selectedItems[0] + if (!selectedItem) { + quickPick.dispose() + reject(new ToolkitError('No option selected', { code: SmusErrorCodes.UserCancelled, cancelled: true })) + return + } + + isCompleted = true + quickPick.dispose() + + const itemWithAction = selectedItem as QuickPickItemWithAction + + try { + switch (itemWithAction.action) { + case IamCredentialExpiryAction.Reauthenticate: { + logger.debug( + `SMUS: Re-authenticating with current IAM profile: ${connection.profileName} in region ${connection.region}` + ) + // For IAM connections, just validate the credentials are still valid + // The auth system will handle refreshing them automatically + const validation = await authProvider.validateIamProfile(connection.profileName) + if (validation.isValid) { + // Credentials are valid, refresh the connection state + await authProvider.auth.refreshConnectionState(connection) + void vscode.window.showInformationMessage( + 'Successfully reauthenticated with SageMaker Unified Studio' + ) + resolve({ action: IamCredentialExpiryAction.Reauthenticate }) + } else { + const errorMsg = validation.error || 'Unknown validation error' + // Throw error for telemetry - activation.ts will show the notification + throw new ToolkitError( + `Failed to re-authenticate, ensure credential has been updated: ${errorMsg}`, + { code: SmusErrorCodes.IamValidationFailed } + ) + } + break + } + case IamCredentialExpiryAction.EditCredentials: { + logger.debug('SMUS: Opening AWS credentials and config files for editing') + // Open both credentials and config files like AWS Explorer does + const credentialsPath = getCredentialsFilename() + const configPath = getConfigFilename() + + // Open both files + const [credentialsDoc, configDoc] = await Promise.all([ + vscode.workspace.openTextDocument(credentialsPath), + vscode.workspace.openTextDocument(configPath), + ]) + + // Show both documents + await vscode.window.showTextDocument(credentialsDoc, { preview: false }) + await vscode.window.showTextDocument(configDoc, { + preview: false, + viewColumn: vscode.ViewColumn.Beside, + }) + + void vscode.window.showInformationMessage( + 'AWS credentials and config files opened. Please update your credentials and try reconnecting.' + ) + resolve({ action: IamCredentialExpiryAction.EditCredentials }) + break + } + case IamCredentialExpiryAction.SwitchProfile: { + logger.debug('SMUS: Switching to another IAM profile') + try { + const profileSelection = await SmusIamProfileSelector.showIamProfileSelection() + + // Handle back navigation - show the credential expiry menu again + if ('isBack' in profileSelection) { + logger.debug('SMUS: User clicked back, showing credential expiry options again') + // Recursively show the credential expiry options menu + const result = await showIamCredentialExpiryOptions( + authProvider, + connection, + extensionContext + ) + resolve(result) + return + } + + // Handle editing mode - This is if user picks edit during the profile selection + if ('isEditing' in profileSelection) { + logger.debug('SMUS: User is editing credentials') + resolve({ action: IamCredentialExpiryAction.EditCredentials }) + return + } + + // User selected a new profile, authenticate with it using the selected profile + // Use dynamic import to avoid circular dependency + const { SmusAuthenticationOrchestrator } = await import('./authenticationOrchestrator.js') + const result = await SmusAuthenticationOrchestrator.handleIamAuthentication( + authProvider, + { record: () => {} }, // Minimal span object + extensionContext, + profileSelection.profileName, + profileSelection.region + ) + + if (result.status === 'SUCCESS') { + void vscode.window.showInformationMessage( + `Successfully switched to profile: ${profileSelection.profileName}` + ) + resolve({ action: IamCredentialExpiryAction.SwitchProfile }) + } else if (result.status === 'INVALID_PROFILE') { + void vscode.window.showErrorMessage(`Failed to switch profile: ${result.error}`) + resolve({ action: IamCredentialExpiryAction.SwitchProfile }) + } else { + // BACK or EDITING - shouldn't happen here but handle gracefully + resolve({ action: IamCredentialExpiryAction.Cancelled }) + } + } catch (switchError) { + // Handle user cancellation gracefully + if ( + switchError instanceof ToolkitError && + switchError.code === SmusErrorCodes.UserCancelled + ) { + logger.debug('SMUS: Profile switch cancelled by user') + resolve({ action: IamCredentialExpiryAction.Cancelled }) + } else { + // Show error message for actual failures + const errorMsg = (switchError as Error).message + void vscode.window.showErrorMessage(`Failed to switch profile: ${errorMsg}`) + logger.error('SMUS: Profile switch failed: %s', switchError) + resolve({ action: IamCredentialExpiryAction.SwitchProfile }) + } + } + break + } + case IamCredentialExpiryAction.SignOut: { + logger.debug('SMUS: Signing out from connection') + // Use the provider's signOut method which properly handles metadata cleanup + await authProvider.signOut() + void vscode.window.showInformationMessage('Successfully signed out') + resolve({ action: IamCredentialExpiryAction.SignOut }) + break + } + } + } catch (error) { + logger.error('SMUS: Failed to handle credential expiry action: %s', error) + // Only show error for non-reauthenticate cases (reauthenticate handles its own errors) + if (itemWithAction.action !== IamCredentialExpiryAction.Reauthenticate) { + void vscode.window.showErrorMessage(`Failed to complete action: ${(error as Error).message}`) + } + reject(error) + } + }) + + quickPick.onDidHide(() => { + if (!isCompleted) { + quickPick.dispose() + logger.debug('SMUS: Credential expiry options cancelled by user') + resolve({ action: IamCredentialExpiryAction.Cancelled }) + } + }) + + quickPick.show() + }) +} diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts index f060e6477ab..f10384f6221 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider.ts @@ -12,6 +12,7 @@ import { DataZoneClient } from '../../shared/client/datazoneClient' import { SmusAuthenticationProvider } from './smusAuthenticationProvider' import { CredentialType } from '../../../shared/telemetry/telemetry' import { SmusCredentialExpiry, validateCredentialFields } from '../../shared/smusUtils' +import { getContext } from '../../../shared/vscode/setContext' /** * Credentials provider for SageMaker Unified Studio Connection credentials @@ -27,7 +28,8 @@ export class ConnectionCredentialsProvider implements CredentialsProvider { constructor( private readonly smusAuthProvider: SmusAuthenticationProvider, - private readonly connectionId: string + private readonly connectionId: string, + private readonly projectId: string ) {} /** @@ -131,7 +133,14 @@ export class ConnectionCredentialsProvider implements CredentialsProvider { ) try { - const datazoneClient = await DataZoneClient.getInstance(this.smusAuthProvider) + if (getContext('aws.smus.isExpressMode') && this.projectId) { + return (await this.smusAuthProvider.getProjectCredentialProvider(this.projectId)).getCredentials() + } + const datazoneClient = DataZoneClient.createWithCredentials( + this.smusAuthProvider.getDomainRegion(), + this.smusAuthProvider.getDomainId(), + await this.smusAuthProvider.getDerCredentialsProvider() + ) const getConnectionResponse = await datazoneClient.getConnection({ domainIdentifier: this.smusAuthProvider.getDomainId(), identifier: this.connectionId, diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts index 5eb42e1fd5f..44e87131214 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/projectRoleCredentialsProvider.ts @@ -8,11 +8,11 @@ import { ToolkitError } from '../../../shared/errors' import * as AWS from '@aws-sdk/types' import { CredentialsId, CredentialsProvider, CredentialsProviderType } from '../../../auth/providers/credentials' -import { DataZoneClient } from '../../shared/client/datazoneClient' import { SmusAuthenticationProvider } from './smusAuthenticationProvider' import { CredentialType } from '../../../shared/telemetry/telemetry' import { SmusCredentialExpiry, validateCredentialFields } from '../../shared/smusUtils' import { loadMappings, saveMappings } from '../../../awsService/sagemaker/credentialMapping' +import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' /** * Credentials provider for SageMaker Unified Studio Project Role credentials @@ -123,7 +123,7 @@ export class ProjectRoleCredentialsProvider implements CredentialsProvider { this.logger.debug(`SMUS Project: Fetching project credentials from API for project ${this.projectId}`) try { - const dataZoneClient = await DataZoneClient.getInstance(this.smusAuthProvider) + const dataZoneClient = await createDZClientBaseOnDomainMode(this.smusAuthProvider) const response = await dataZoneClient.getProjectDefaultEnvironmentCreds(this.projectId) this.logger.debug( diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index 2fa53a44bd4..85275398579 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -15,14 +15,21 @@ import * as localizedText from '../../../shared/localizedText' import { ToolkitPromptSettings } from '../../../shared/settings' import { setContext, getContext } from '../../../shared/vscode/setContext' import { getLogger } from '../../../shared/logger/logger' -import { SmusUtils, SmusErrorCodes, extractAccountIdFromResourceMetadata } from '../../shared/smusUtils' +import { + SmusUtils, + SmusErrorCodes, + extractAccountIdFromResourceMetadata, + convertToToolkitCredentialProvider, +} from '../../shared/smusUtils' import { createSmusProfile, isValidSmusConnection, SmusConnection, SmusIamConnection, isSmusSsoConnection, + isSmusIamConnection, } from '../model' +import { IamCredentialExpiryAction, showIamCredentialExpiryOptions } from '../credentialExpiryHandler' import { DomainExecRoleCredentialsProvider } from './domainExecRoleCredentialsProvider' import { ProjectRoleCredentialsProvider } from './projectRoleCredentialsProvider' @@ -33,11 +40,14 @@ import { CredentialsProviderManager } from '../../../auth/providers/credentialsP import { SharedCredentialsProvider } from '../../../auth/providers/sharedCredentialsProvider' import { CredentialsId, CredentialsProvider } from '../../../auth/providers/credentials' import globals from '../../../shared/extensionGlobals' -import { fromIni } from '@aws-sdk/credential-providers' +import { fromContainerMetadata, fromIni, fromNodeProviderChain } from '@aws-sdk/credential-providers' import { randomUUID } from '../../../shared/crypto' import { DefaultStsClient } from '../../../shared/clients/stsClient' -import { DataZoneClient } from '../../shared/client/datazoneClient' import { DataZoneDomainPreferencesClient } from '../../shared/client/datazoneDomainPreferencesClient' +import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' +import { DataZoneClient } from '../../shared/client/datazoneClient' +import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' +import { loadSharedCredentialsProfiles } from '../../../auth/credentials/sharedCredentials' /** * Sets the context variable for SageMaker Unified Studio connection state @@ -152,6 +162,10 @@ export class SmusAuthenticationProvider { // Clear Express mode context for non-IAM connections or no connection await setSmusExpressModeContext(false) } + // Update Express mode context in SMUS space environment + if (getContext('aws.smus.inSmusSpaceEnvironment')) { + void this.initExpressModeContextInSpaceEnvironment() + } this.onDidChangeEmitter.fire() }) @@ -173,6 +187,36 @@ export class SmusAuthenticationProvider { await setSmusExpressModeContext(false) } })() + + // Update Express mode context in SMUS space environment + if (getContext('aws.smus.inSmusSpaceEnvironment')) { + void this.initExpressModeContextInSpaceEnvironment() + } + } + + /** + * Initializes Express mode context in SMUS space environment + */ + private async initExpressModeContextInSpaceEnvironment(): Promise { + try { + const resourceMetadata = getResourceMetadata() + if ( + resourceMetadata?.AdditionalMetadata?.DataZoneDomainId && + resourceMetadata?.AdditionalMetadata?.DataZoneDomainRegion + ) { + const domainId = resourceMetadata.AdditionalMetadata.DataZoneDomainId + const region = resourceMetadata.AdditionalMetadata.DataZoneDomainRegion + + const credentialsProvider = (await this.getDerCredentialsProvider()) as CredentialsProvider + + const isExpress = await SmusUtils.isInSmusExpressMode(domainId, region, credentialsProvider) + this.logger.debug(`SMUS Auth: is in express mode ${isExpress}`) + await setSmusExpressModeContext(isExpress) + } + } catch (error) { + this.logger.error('Failed to check Express mode in SMUS space environment: %s', error) + await setSmusExpressModeContext(false) + } } /** @@ -271,9 +315,117 @@ export class SmusAuthenticationProvider { /** * Restores the previous connection - * Uses a promise to prevent multiple simultaneous restore calls + * Validates domain metadata against profile and updates if needed before using saved connection */ public async restore() { + const logger = getLogger() + + // Get the saved connection ID before restoring + const savedConnectionId = this.secondaryAuth.state.get('smus.savedConnectionId') as string + if (!savedConnectionId) { + logger.debug('SMUS: No saved connection ID found, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + // Get the saved connection metadata + const smusConnections = (this.secondaryAuth.state.get('smus.connections') as any) || {} + const connectionMetadata = smusConnections[savedConnectionId] + + // If no connection metadata exists, proceed with normal restore + if (!connectionMetadata) { + logger.debug('SMUS: No connection metadata found, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + const savedProfileName = connectionMetadata.profileName + + // If no profile name in metadata, proceed with normal restore + if (!savedProfileName) { + logger.debug('SMUS: No profile name in metadata, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + const profiles = await loadSharedCredentialsProfiles() + const profile = profiles[savedProfileName] + const region = profile.region || 'not-set' + + const validation = await this.validateIamProfile(savedProfileName) + if (!validation.isValid) { + logger.debug(`SMUS Auth: Profile validation failed: ${validation.error}, proceeding with normal restore`) + await this.secondaryAuth.restoreConnection() + return + } + + let domainUrl + try { + logger.debug(`SMUS Auth: Finding Express domain in region using profile ${savedProfileName}`) + + // Get DataZoneDomainPreferencesClient instance + const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance( + await this.getCredentialsProviderForIamProfile(savedProfileName), + region + ) + + // Find the Express domain using the client + const expressDomain = await domainPreferencesClient.getExpressDomain() + + if (!expressDomain) { + logger.warn(`SMUS Auth: No Express domain found in region ${region}, proceeding with normal restore`) + await this.secondaryAuth.restoreConnection() + return + } + + logger.debug(`SMUS Auth: Found Express domain: ${expressDomain.name} (${expressDomain.id})`) + + // Construct domain URL from the Express domain + domainUrl = expressDomain.portalUrl || `https://${expressDomain.id}.sagemaker.${region}.on.aws/` + logger.debug(`SMUS Auth: Discovered Express domain URL: ${domainUrl}`) + } catch (error) { + logger.error(`SMUS Auth: Failed to find Express domain: ${error} , proceeding with normal restore`) + await this.secondaryAuth.restoreConnection() + return + } + + try { + logger.debug(`SMUS: Validating domain metadata for saved connection ${savedConnectionId}`) + + if (!domainUrl) { + logger.info('SMUS: No domain URL constructed, proceeding with normal restore') + await this.secondaryAuth.restoreConnection() + return + } + + const { domainId } = SmusUtils.extractDomainInfoFromUrl(domainUrl) + + // Compare with saved metadata + const savedDomainId = connectionMetadata.domainId + const savedRegion = connectionMetadata.region + + if (domainId === savedDomainId && region === savedRegion) { + logger.debug('SMUS: Domain metadata matches, proceeding with normal restore') + } else { + logger.debug( + `SMUS: Domain metadata mismatch detected. Saved: ${savedDomainId}@${savedRegion}, Profile: ${domainId}@${region}. Updating metadata.` + ) + + // Update the metadata with API values + connectionMetadata.domainId = domainId + connectionMetadata.region = region + + // Save updated metadata + smusConnections[savedConnectionId] = connectionMetadata + await this.secondaryAuth.state.update('smus.connections', smusConnections) + + logger.debug('SMUS: Successfully updated domain metadata') + } + } catch (error) { + logger.warn(`SMUS: Failed to validate domain metadata: ${error}. Proceeding with normal restore.`) + } + + // Proceed with normal restore await this.secondaryAuth.restoreConnection() } @@ -326,7 +478,7 @@ export class SmusAuthenticationProvider { } catch (error) { logger.error(`SMUS: Failed to sign out from connection ${connectionId}:`, error) throw new ToolkitError('Failed to sign out from SageMaker Unified Studio', { - code: 'SignOutFailed', + code: SmusErrorCodes.SignOutFailed, cause: error instanceof Error ? error : undefined, }) } @@ -347,7 +499,7 @@ export class SmusAuthenticationProvider { // Validate domain ID if (!domainId) { - throw new ToolkitError('Invalid domain URL format', { code: 'InvalidDomainUrl' }) + throw new ToolkitError('Invalid domain URL format', { code: SmusErrorCodes.InvalidDomainUrl }) } logger.info(`SMUS: Connecting to domain ${domainId} in region ${region}`) @@ -434,7 +586,7 @@ export class SmusAuthenticationProvider { return result as SmusConnection } catch (e) { throw ToolkitError.chain(e, 'Failed to connect to SageMaker Unified Studio', { - code: 'FailedToConnect', + code: SmusErrorCodes.FailedToConnect, }) } } @@ -462,7 +614,7 @@ export class SmusAuthenticationProvider { // Validate domain ID if (!domainId) { - throw new ToolkitError('Invalid domain URL format', { code: 'InvalidDomainUrl' }) + throw new ToolkitError('Invalid domain URL format', { code: SmusErrorCodes.InvalidDomainUrl }) } logger.info(`SMUS: Connecting with IAM profile ${profileName} to domain ${domainId} in region ${region}`) @@ -519,12 +671,12 @@ export class SmusAuthenticationProvider { throw new ToolkitError( `IAM profile connection not found for '${profileName}'. Please check your AWS credentials configuration.`, { - code: 'ConnectionNotFound', + code: SmusErrorCodes.ConnectionNotFound, } ) } catch (e) { throw ToolkitError.chain(e, 'Failed to connect to SageMaker Unified Studio with IAM profile', { - code: 'FailedToConnect', + code: SmusErrorCodes.FailedToConnect, }) } } @@ -651,9 +803,35 @@ export class SmusAuthenticationProvider { * @returns Promise resolving to the reauthenticated connection */ @withTelemetryContext({ name: 'reauthenticate', class: authClassName }) - public async reauthenticate(conn: SsoConnection) { + public async reauthenticate(conn: SmusConnection): Promise { try { - return await this.auth.reauthenticate(conn) + // Check if this is an IAM connection + if (isSmusIamConnection(conn)) { + // For IAM connections, show options menu + this.logger.debug('SMUS: Showing IAM credential expiry options for reauthentication') + const result = await showIamCredentialExpiryOptions(this, conn, globals.context) + + // Handle the result - for most actions, return the original connection + // The actions have already been performed (sign out, edit credentials, etc.) + if (result.action === IamCredentialExpiryAction.SignOut) { + throw new ToolkitError('User signed out from connection', { cancelled: true }) + } else if (result.action === IamCredentialExpiryAction.Cancelled) { + throw new ToolkitError('Reauthentication cancelled by user', { cancelled: true }) + } + + // For Reauthenticate, EditCredentials, and SwitchProfile, return the connection + return conn + } else { + // For SSO connections, use existing re-auth flow + const reauthenticatedConn = await this.auth.reauthenticate(conn) + + // Re-add SMUS-specific properties that aren't preserved by the base auth system + return { + ...reauthenticatedConn, + domainUrl: conn.domainUrl, + domainId: conn.domainId, + } as SmusConnection + } } catch (err) { throw ToolkitError.chain(err, 'Unable to reauthenticate SageMaker Unified Studio connection.') } @@ -663,7 +841,7 @@ export class SmusAuthenticationProvider { * Shows a reauthentication prompt to the user * @param conn Connection to reauthenticate */ - public async showReauthenticationPrompt(conn: SsoConnection): Promise { + public async showReauthenticationPrompt(conn: SmusConnection): Promise { await showReauthenticateMessage({ message: localizedText.connectionExpired('SageMaker Unified Studio'), connect: localizedText.reauthenticate, @@ -692,7 +870,7 @@ export class SmusAuthenticationProvider { // Only SSO connections have access tokens if (!isSmusSsoConnection(connection)) { throw new ToolkitError('Access tokens are only available for SSO connections', { - code: 'InvalidConnectionType', + code: SmusErrorCodes.InvalidConnectionType, }) } @@ -779,7 +957,7 @@ export class SmusAuthenticationProvider { logger.debug('SMUS: Creating new connection provider') // Create a new connection provider and cache it - const connectionProvider = new ConnectionCredentialsProvider(this, connectionId) + const connectionProvider = new ConnectionCredentialsProvider(this, connectionId, projectId) this.connectionCredentialProvidersCache.set(cacheKey, connectionProvider) logger.debug('SMUS: Cached new connection provider') @@ -943,7 +1121,7 @@ export class SmusAuthenticationProvider { const projectCreds = await projectCredProvider.getCredentials() // Get project region from tooling environment - const dzClient = await DataZoneClient.getInstance(this) + const dzClient = await createDZClientBaseOnDomainMode(this) const toolingEnv = await dzClient.getToolingEnvironment(projectId) const projectRegion = toolingEnv.awsAccountRegion @@ -1018,9 +1196,58 @@ export class SmusAuthenticationProvider { if (getContext('aws.smus.inSmusSpaceEnvironment')) { // When in SMUS space, DomainExecutionRoleCreds can be found in config file // Read the credentials from credential profile DomainExecutionRoleCreds - const credentials = fromIni({ profile: 'DomainExecutionRoleCreds' }) - return { - getCredentials: async () => await credentials(), + try { + // Load AWS config file to check profile configuration + const { configFile } = await loadSharedConfigFiles() + const profileConfig = configFile['DomainExecutionRoleCreds'] + + if (profileConfig?.credential_process) { + // Normal SMUS domain: Use the profile with credential_process + logger.debug('SMUS: Using DomainExecutionRoleCreds profile with credential_process') + const credentials = fromIni({ profile: 'DomainExecutionRoleCreds' }) + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'DomainExecutionRoleCreds', + `smus-der-profile:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) + } else if (profileConfig?.credential_source === 'EcsContainer') { + // Express domain with EcsContainer: Use ECS container credentials directly + // The environment has AWS_CONTAINER_CREDENTIALS_RELATIVE_URI set, so use fromContainerMetadata + // which properly handles the ECS credential endpoint + logger.debug('SMUS: Express domain detected, using ECS container credentials') + const credentials = fromContainerMetadata({ + timeout: 5000, + maxRetries: 3, + }) + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'EcsContainer', + `smus-ecs-container:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) + } else { + // Fallback: try the profile anyway + logger.debug( + 'SMUS: Unknown profile configuration, attempting to use DomainExecutionRoleCreds profile' + ) + const credentials = fromIni({ profile: 'DomainExecutionRoleCreds' }) + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'DomainExecutionRoleCreds-fallback', + `smus-der-fallback:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) + } + } catch (error) { + logger.error('SMUS: Failed to load config file, falling back to default credential chain: %s', error) + const credentials = fromNodeProviderChain() + return convertToToolkitCredentialProvider( + async () => await credentials(), + 'NodeProviderChain', + `smus-node-provider-chain:${this.getDomainId()}:${this.getDomainRegion()}`, + this.getDomainRegion() + ) } } @@ -1032,7 +1259,7 @@ export class SmusAuthenticationProvider { // Domain Execution Role credentials are only available for SSO connections if (!isSmusSsoConnection(connection)) { throw new ToolkitError('Domain Execution Role credentials are only available for SSO connections', { - code: 'InvalidConnectionType', + code: SmusErrorCodes.InvalidConnectionType, }) } @@ -1152,6 +1379,7 @@ export class SmusAuthenticationProvider { // Clear cached project account IDs this.cachedProjectAccountIds.clear() + DataZoneClient.dispose() DataZoneDomainPreferencesClient.dispose() this.logger.debug('SMUS Auth: Successfully disposed authentication provider') diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts index 243a6b53a01..8f88f299034 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/activation.ts @@ -12,16 +12,17 @@ import { SageMakerUnifiedStudioRootNode, selectSMUSProject, } from './nodes/sageMakerUnifiedStudioRootNode' -import { DataZoneClient } from '../shared/client/datazoneClient' import { openRemoteConnect, stopSpace } from '../../awsService/sagemaker/commands' import { SagemakerUnifiedStudioSpaceNode } from './nodes/sageMakerUnifiedStudioSpaceNode' import { SageMakerUnifiedStudioProjectNode } from './nodes/sageMakerUnifiedStudioProjectNode' import { getLogger } from '../../shared/logger/logger' import { setSmusConnectedContext, SmusAuthenticationProvider } from '../auth/providers/smusAuthenticationProvider' +import { isSmusIamConnection } from '../auth/model' import { setupUserActivityMonitoring } from '../../awsService/sagemaker/sagemakerSpace' import { telemetry } from '../../shared/telemetry/telemetry' import { isSageMaker } from '../../shared/extensionUtilities' import { recordSpaceTelemetry } from '../shared/telemetry' +import { DataZoneClient } from '../shared/client/datazoneClient' export async function activate(extensionContext: vscode.ExtensionContext): Promise { // Initialize the SMUS authentication provider @@ -101,15 +102,32 @@ export async function activate(extensionContext: vscode.ExtensionContext): Promi if (connection) { try { await smusAuthProvider.reauthenticate(connection) - // Refresh the tree view after successful reauthentication treeDataProvider.refresh() - // Show success message - void vscode.window.showInformationMessage( - 'Successfully reauthenticated with SageMaker Unified Studio' - ) + + // IAM connections handle their own success messages + // Only show success message for SSO connections + if (!isSmusIamConnection(connection)) { + void vscode.window.showInformationMessage( + 'Successfully reauthenticated with SageMaker Unified Studio' + ) + } } catch (error) { - // Show error message if reauthentication fails - void vscode.window.showErrorMessage(`Failed to reauthenticate: ${error}`) + // Extract the most detailed error message available + let errorMessage = 'Unknown error' + if (error instanceof Error) { + // Check if this is a ToolkitError with a cause chain + const cause = (error as any).cause + if (cause instanceof Error) { + // Use the cause's message as it contains the detailed validation error + errorMessage = cause.message + } else { + // Fall back to the error's own message + errorMessage = error.message + } + } + + // Show the detailed error message to the user + void vscode.window.showErrorMessage(`${errorMessage}`) logger.error('SMUS: Reauthentication failed: %O', error) } } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts new file mode 100644 index 00000000000..a42957cdf75 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.ts @@ -0,0 +1,332 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' +import { getLogger } from '../../../shared/logger/logger' +import { DataZoneConnection } from '../../shared/client/datazoneClient' +import { GlueClient, ListEntitiesCommand, DescribeEntityCommand, Entity, Field } from '@aws-sdk/client-glue' +import { ConnectionCredentialsProvider } from '../../auth/providers/connectionCredentialsProvider' +import { getIcon } from '../../../shared/icons' +import { createPlaceholderItem } from '../../../shared/treeview/utils' +import { createErrorItem, createColumnTreeItem } from './utils' +import { NO_DATA_FOUND_MESSAGE, NodeType } from './types' + +/** + * Creates a federated connection node + */ +export async function createFederatedConnectionNode( + connection: DataZoneConnection, + connectionCredentialsProvider: ConnectionCredentialsProvider, + region: string +): Promise { + const logger = getLogger() + + // Check for error message in glue properties + // Create error node directly in this case + const connectionError = connection.props?.glueProperties?.errorMessage + if (connectionError) { + return createErrorItem(connectionError, 'glue-error', connection.connectionId) + } + + return { + id: `federated-${connection.connectionId}`, + resource: connection, + getTreeItem: () => { + const item = new vscode.TreeItem(connection.name, vscode.TreeItemCollapsibleState.Collapsed) + item.contextValue = 'federatedConnection' + item.iconPath = getIcon('aws-sagemakerunifiedstudio-catalog') + item.tooltip = `Federated Connection: ${connection.name}` + return item + }, + getChildren: async () => { + try { + return await getFederatedEntities(connection, connectionCredentialsProvider, region) + } catch (err) { + logger.error(`Failed to get federated entities: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [ + createErrorItem(`Failed to load entities - ${errorMessage}`, 'entities', connection.connectionId), + ] + } + }, + getParent: () => undefined, + } +} + +/** + * Gets federated entities from Glue API + */ +async function getFederatedEntities( + connection: DataZoneConnection, + connectionCredentialsProvider: ConnectionCredentialsProvider, + region: string +): Promise { + const awsCredentialProvider = async () => { + const credentials = await connectionCredentialsProvider.getCredentials() + return { + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + sessionToken: credentials.sessionToken, + expiration: credentials.expiration, + } + } + const glueClient = new GlueClient({ + region: region, + credentials: awsCredentialProvider, + }) + + const glueConnectionName = connection?.glueConnectionName + if (!glueConnectionName) { + return [createErrorItem('No Glue connection name found', 'glue-connection', connection.connectionId)] + } + + const allEntities: Entity[] = [] + let nextToken: string | undefined + + do { + const response = await glueClient.send( + new ListEntitiesCommand({ + ConnectionName: glueConnectionName, + NextToken: nextToken, + }) + ) + + if (response.Entities) { + allEntities.push(...response.Entities) + } + nextToken = response.NextToken + } while (nextToken) + + if (allEntities.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE)] + } + + const entityNodes: TreeNode[] = [] + const tableNodes: TreeNode[] = [] + + for (const entity of allEntities) { + const nodeType = getGlueNodeType(entity.Category) + const isTable = nodeType === NodeType.GLUE_TABLE + + const entityNode = createGlueEntityNode(entity, connection, glueClient, glueConnectionName) + + if (isTable) { + tableNodes.push(entityNode) + } else { + entityNodes.push(entityNode) + } + } + + // Always group tables under a "Tables" container + if (tableNodes.length > 0) { + const tablesContainer = createTablesContainer(tableNodes, connection.connectionId) + return [...entityNodes, tablesContainer] + } + + return entityNodes +} + +/** + * Creates a Glue entity node + */ +function createGlueEntityNode( + entity: Entity, + connection: DataZoneConnection, + glueClient: GlueClient, + glueConnectionName: string +): TreeNode { + const logger = getLogger() + const nodeType = getGlueNodeType(entity.Category) + const isTable = nodeType === NodeType.GLUE_TABLE + + return { + id: `${connection.connectionId}-${entity.EntityName}`, + resource: entity, + getTreeItem: () => { + const item = new vscode.TreeItem( + entity.Label || entity.EntityName || 'Unknown', + entity.IsParentEntity || (isTable && !entity.IsParentEntity) + ? vscode.TreeItemCollapsibleState.Collapsed + : vscode.TreeItemCollapsibleState.None + ) + item.contextValue = nodeType + item.iconPath = getGlueEntityIcon(nodeType) + item.tooltip = `${entity.Category}: ${entity.Label || entity.EntityName}` + return item + }, + getChildren: async () => { + try { + if (entity.IsParentEntity) { + return await getChildEntities(entity, connection, glueClient, glueConnectionName) + } else if (isTable) { + return await getTableColumns(entity, glueClient, glueConnectionName) + } + return [] + } catch (err) { + logger.error(`Failed to get children for entity ${entity.EntityName}: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [ + createErrorItem( + `Failed to load children - ${errorMessage}`, + 'entity-children', + entity.EntityName || 'unknown' + ), + ] + } + }, + getParent: () => undefined, + } +} + +/** + * Gets child entities for parent entities + */ +async function getChildEntities( + parentEntity: Entity, + connection: DataZoneConnection, + glueClient: GlueClient, + glueConnectionName: string +): Promise { + const allEntities: Entity[] = [] + let nextToken: string | undefined + + do { + const response = await glueClient.send( + new ListEntitiesCommand({ + ConnectionName: glueConnectionName, + ParentEntityName: parentEntity.EntityName, + NextToken: nextToken, + }) + ) + + if (response.Entities) { + allEntities.push(...response.Entities) + } + nextToken = response.NextToken + } while (nextToken) + + if (allEntities.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE)] + } + + const entityNodes: TreeNode[] = [] + const tableNodes: TreeNode[] = [] + + for (const entity of allEntities) { + const nodeType = getGlueNodeType(entity.Category) + const isTable = nodeType === NodeType.GLUE_TABLE + const entityNode = createGlueEntityNode(entity, connection, glueClient, glueConnectionName) + + if (isTable) { + tableNodes.push(entityNode) + } else { + entityNodes.push(entityNode) + } + } + + // Always group tables under a "Tables" container if there are any + if (tableNodes.length > 0) { + const tablesContainer = createTablesContainer( + tableNodes, + `${connection.connectionId}-${parentEntity.EntityName}` + ) + return [...entityNodes, tablesContainer] + } + + return entityNodes +} + +/** + * Gets table columns using DescribeEntity + */ +async function getTableColumns( + entity: Entity, + glueClient: GlueClient, + glueConnectionName: string +): Promise { + const response = await glueClient.send( + new DescribeEntityCommand({ + ConnectionName: glueConnectionName, + EntityName: entity.EntityName, + }) + ) + + if (!response.Fields || response.Fields.length === 0) { + return [createPlaceholderItem('No columns found')] + } + + return response.Fields.map((field) => createColumnNode(field, entity.EntityName || 'unknown')) +} + +/** + * Creates a column node + */ +function createColumnNode(field: Field, tableName: string): TreeNode { + return { + id: `${tableName}-${field.FieldName}`, + resource: field, + getTreeItem: () => { + return createColumnTreeItem( + field.Label || field.FieldName || 'Unknown', + field.FieldType || 'unknown', + NodeType.REDSHIFT_COLUMN + ) + }, + getChildren: async () => [], + getParent: () => undefined, + } +} + +/** + * Creates a tables container node + */ +function createTablesContainer(tableNodes: TreeNode[], connectionId: string): TreeNode { + return { + id: `${connectionId}-tables`, + resource: {}, + getTreeItem: () => { + const item = new vscode.TreeItem('Tables', vscode.TreeItemCollapsibleState.Collapsed) + item.contextValue = NodeType.GLUE_TABLE + item.iconPath = new vscode.ThemeIcon('table') + return item + }, + getChildren: async () => tableNodes, + getParent: () => undefined, + } +} + +/** + * Maps Glue entity category to node type + */ +function getGlueNodeType(category?: string): NodeType { + const lowerCategory = category?.toLowerCase() + if (lowerCategory?.includes('schema')) { + return NodeType.GLUE_DATABASE + } else if (lowerCategory?.includes('table')) { + return NodeType.GLUE_TABLE + } else if (lowerCategory?.includes('database')) { + return NodeType.GLUE_DATABASE + } + return NodeType.GLUE_CATALOG +} + +/** + * Gets icon for Glue entity node type + */ +function getGlueEntityIcon(nodeType: NodeType): vscode.ThemeIcon | any { + switch (nodeType) { + case NodeType.GLUE_DATABASE: + return new vscode.ThemeIcon('database') + case NodeType.GLUE_TABLE: + return getIcon('aws-redshift-table') + case NodeType.GLUE_CATALOG: + return getIcon('aws-sagemakerunifiedstudio-catalog') + default: + return getIcon('vscode-circle-outline') + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts index 4106a0b4889..387c4f972b3 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/s3Strategy.ts @@ -123,6 +123,9 @@ export function createS3ConnectionNode( return createErrorItem(errorMessage, 'connection', connection.connectionId) as S3Node } + // Handle case where s3Uri is "s3://" (all buckets access) + const isAllBucketsAccess = !s3Info.bucket + // Get S3 client from store const clientStore = ConnectionClientStore.getInstance() const s3Client = clientStore.getS3Client(connection.connectionId, region, connectionCredentialsProvider) @@ -146,7 +149,90 @@ export function createS3ConnectionNode( return telemetry.smus_renderS3Node.run(async (span) => { await recordDataConnectionTelemetry(span, connection, connectionCredentialsProvider) try { - if (isDefaultConnection && s3Info.prefix) { + if (isAllBucketsAccess) { + // For all buckets access (s3://), list all accessible buckets + try { + const buckets = await s3Client.listBuckets() + if (buckets.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE) as S3Node] + } + + return buckets.map((bucket) => { + return new S3Node( + { + id: bucket.Name || 'unknown-bucket', + nodeType: NodeType.S3_BUCKET, + connectionType: ConnectionType.S3, + value: { bucket: bucket.Name }, + path: { + connection: connection.name, + bucket: bucket.Name, + }, + parent: node, + }, + async (bucketNode) => { + try { + const allPaths = [] + let nextToken: string | undefined + + do { + const result = await s3Client.listPaths( + bucket.Name || '', + undefined, + nextToken + ) + allPaths.push(...result.paths) + nextToken = result.nextToken + } while (nextToken) + + if (allPaths.length === 0) { + return [createPlaceholderItem(NO_DATA_FOUND_MESSAGE) as S3Node] + } + + return allPaths.map((path) => { + const nodeId = `${path.bucket}-${path.prefix || 'root'}` + + return new S3Node( + { + id: nodeId, + nodeType: path.isFolder ? NodeType.S3_FOLDER : NodeType.S3_FILE, + connectionType: ConnectionType.S3, + value: path, + path: { + connection: connection.name, + bucket: path.bucket, + key: path.prefix, + label: path.displayName, + }, + parent: bucketNode, + }, + path.isFolder + ? createFolderChildrenProvider(s3Client, path) + : undefined + ) + }) + } catch (err) { + logger.error(`Failed to list bucket contents: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [ + createErrorItem( + errorMessage, + 'bucket-contents-all-access', + bucketNode.id + ) as S3Node, + ] + } + } + ) + }) + } catch (err) { + logger.error(`Failed to list buckets: ${(err as Error).message}`) + const errorMessage = (err as Error).message + void vscode.window.showErrorMessage(errorMessage) + return [createErrorItem(errorMessage, 'list-buckets', node.id) as S3Node] + } + } else if (isDefaultConnection && s3Info.prefix) { // For default connections, show the full path as the first node const fullPath = `${s3Info.bucket}/${s3Info.prefix}` return [ @@ -382,11 +468,22 @@ function parseS3Uri(connection: DataZoneConnection): { bucket: string; prefix?: return undefined } + // Handle case where s3Uri is just "s3://" (all buckets access) + if (s3Uri === 's3://') { + return { bucket: '', prefix: undefined } + } + // Parse S3 URI: s3://bucket-name/prefix/path/ const uriWithoutPrefix = s3Uri.replace('s3://', '') + + // Handle empty URI after removing prefix + if (!uriWithoutPrefix) { + return { bucket: '', prefix: undefined } + } + // Since the URI ends with a slash, the last item will be an empty string, so ignore it in the parts. const parts = uriWithoutPrefix.split('/').slice(0, -1) - const bucket = parts[0] + const bucket = parts[0] || '' // If parts only contains 1 item, then only a bucket was provided, and the key is empty. const prefix = parts.length > 1 ? parts.slice(1).join('/') + '/' : undefined diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts index 51cb76c22fb..08ee20cff79 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts @@ -7,6 +7,9 @@ import * as vscode from 'vscode' import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { SageMakerUnifiedStudioRootNode } from './sageMakerUnifiedStudioRootNode' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' +import { SmusIamConnection } from '../../auth/model' +import { getContext } from '../../../shared/vscode/setContext' +import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' /** * Node representing the SageMaker Unified Studio authentication information @@ -28,7 +31,7 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { }) } - public getTreeItem(): vscode.TreeItem { + public async getTreeItem(): Promise { // Use the cached authentication provider to check connection status const isConnected = this.authProvider.isConnected() const isValid = this.authProvider.isConnectionValid() @@ -46,28 +49,39 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { let label: string let iconPath: vscode.ThemeIcon let tooltip: string + let description: string | undefined + + // Get profile name for express mode + const isExpressMode = getContext('aws.smus.isExpressMode') + let profileName: string | undefined + if (isExpressMode) { + const activeConnection = this.authProvider.activeConnection! + const { configFile } = await loadSharedConfigFiles() + profileName = + (activeConnection as SmusIamConnection).profileName || (configFile['default'] ? 'default' : undefined) + } if (isConnected && isValid) { - label = `Domain: ${domainId}` + label = isExpressMode ? `Connected with profile: ${profileName}` : `Domain: ${domainId}` iconPath = new vscode.ThemeIcon('key', new vscode.ThemeColor('charts.green')) - tooltip = `Connected to SageMaker Unified Studio\nDomain ID: ${domainId}\nRegion: ${region}\nStatus: Connected` + tooltip = `Connected to SageMaker Unified Studio\n${isExpressMode ? `Profile: ${profileName}` : `Domain ID: ${domainId}`}\nRegion: ${region}\nStatus: Connected` + description = region } else if (isConnected && !isValid) { - label = `Domain: ${domainId} (Expired) - Click to reauthenticate` + label = isExpressMode + ? `Profile: ${profileName} (Expired) - Click to reauthenticate` + : `Domain: ${domainId} (Expired) - Click to reauthenticate` iconPath = new vscode.ThemeIcon('warning', new vscode.ThemeColor('charts.yellow')) - tooltip = `Connection to SageMaker Unified Studio has expired\nDomain ID: ${domainId}\nRegion: ${region}\nStatus: Expired - Click to reauthenticate` + tooltip = `Connection to SageMaker Unified Studio has expired\n${isExpressMode ? `Profile: ${profileName}` : `Domain ID: ${domainId}`}\nRegion: ${region}\nStatus: Expired - Click to reauthenticate` + description = region } else { label = 'Not Connected' iconPath = new vscode.ThemeIcon('circle-slash', new vscode.ThemeColor('charts.red')) tooltip = 'Not connected to SageMaker Unified Studio\nPlease sign in to access your projects' + description = undefined } const item = new vscode.TreeItem(label, vscode.TreeItemCollapsibleState.None) - // Add region as description (appears to the right) if connected - if (isConnected) { - item.description = region - } - // Add command for reauthentication when connection is expired if (isConnected && !isValid) { item.command = { @@ -80,6 +94,7 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { item.tooltip = tooltip item.contextValue = 'smusAuthInfo' item.iconPath = iconPath + item.description = description return item } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts index 01293e7e523..d31bfdb33e3 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.ts @@ -12,6 +12,7 @@ import { SagemakerClient } from '../../../shared/clients/sagemaker' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { SageMakerUnifiedStudioConnectionParentNode } from './sageMakerUnifiedStudioConnectionParentNode' import { ConnectionType } from '@aws-sdk/client-datazone' +import { getContext } from '../../../shared/vscode/setContext' export class SageMakerUnifiedStudioComputeNode implements TreeNode { public readonly id = 'smusComputeNode' @@ -37,12 +38,14 @@ export class SageMakerUnifiedStudioComputeNode implements TreeNode { const projectId = this.parent.getProject()?.id if (projectId) { - childrenNodes.push( - new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.REDSHIFT, 'Data warehouse') - ) - childrenNodes.push( - new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.SPARK, 'Data processing') - ) + if (!getContext('aws.smus.isExpressMode')) { + childrenNodes.push( + new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.REDSHIFT, 'Data warehouse') + ) + childrenNodes.push( + new SageMakerUnifiedStudioConnectionParentNode(this, ConnectionType.SPARK, 'Data processing') + ) + } this.spacesNode = new SageMakerUnifiedStudioSpacesParentNode( this, projectId, diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts index a04377f0133..3bb7fa80222 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.ts @@ -8,7 +8,7 @@ import { SageMakerUnifiedStudioComputeNode } from './sageMakerUnifiedStudioCompu import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { ListConnectionsCommandOutput, ConnectionType } from '@aws-sdk/client-datazone' import { SageMakerUnifiedStudioConnectionNode } from './sageMakerUnifiedStudioConnectionNode' -import { DataZoneClient } from '../../shared/client/datazoneClient' +import { createDZClientBaseOnDomainMode } from './utils' // eslint-disable-next-line id-length export class SageMakerUnifiedStudioConnectionParentNode implements TreeNode { @@ -31,7 +31,7 @@ export class SageMakerUnifiedStudioConnectionParentNode implements TreeNode { } public async getChildren(): Promise { - const client = await DataZoneClient.getInstance(this.parent.authProvider) + const client = await createDZClientBaseOnDomainMode(this.parent.authProvider) this.connections = await client.fetchConnections( this.parent.parent.project?.domainId, this.parent.parent.project?.id, diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts index 4294a3e42f4..7b900f97792 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.ts @@ -8,15 +8,23 @@ import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { getIcon } from '../../../shared/icons' import { getLogger } from '../../../shared/logger/logger' -import { DataZoneClient, DataZoneConnection, DataZoneProject } from '../../shared/client/datazoneClient' +import { DataZoneConnection, DataZoneProject } from '../../shared/client/datazoneClient' import { createS3ConnectionNode, createS3AccessGrantNodes } from './s3Strategy' import { createRedshiftConnectionNode } from './redshiftStrategy' import { createLakehouseConnectionNode } from './lakehouseStrategy' import { SageMakerUnifiedStudioProjectNode } from './sageMakerUnifiedStudioProjectNode' import { isFederatedConnection, createErrorItem } from './utils' import { createPlaceholderItem } from '../../../shared/treeview/utils' -import { ConnectionType, NO_DATA_FOUND_MESSAGE } from './types' +import { + ConnectionType, + DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP, + NO_DATA_FOUND_MESSAGE, + S3_PROJECT_NON_GIT_PROJECT_REPOSITORY_LOCATION_NAME_REGEXP, +} from './types' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' +import { createFederatedConnectionNode } from './federatedConnectionStrategy' +import { createDZClientForProject } from './utils' +import { getContext } from '../../../shared/vscode/setContext' /** * Tree node representing a Data folder that contains S3 and Redshift connections @@ -57,7 +65,8 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { return [createErrorItem(errorMessage, 'project', this.id)] } - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientForProject(this.authProvider, project.id) + const connections = await datazoneClient.listConnections(project.domainId, undefined, project.id) this.logger.info(`Found ${connections.length} connections for project ${project.id}`) @@ -105,15 +114,23 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { } // Add Redshift nodes second - for (const connection of redshiftConnections) { - if (connection.name.startsWith('project.lakehouse')) { - continue + if (!getContext('aws.smus.isExpressMode')) { + for (const connection of redshiftConnections) { + if (connection.name.startsWith('project.lakehouse')) { + continue + } + if (isFederatedConnection(connection)) { + continue + } + const node = await this.createRedshiftNode(project, connection, region) + dataNodes.push(node) } - if (isFederatedConnection(connection)) { - continue + } else { + const federatedConnections = connections.filter((conn) => isFederatedConnection(conn)) + if (federatedConnections.length > 0) { + const connectionsNode = this.createConnectionsParentNode(project, federatedConnections, region) + dataNodes.push(connectionsNode) } - const node = await this.createRedshiftNode(project, connection, region) - dataNodes.push(node) } // Add S3 Bucket parent node last @@ -132,30 +149,23 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { region: string ): Promise { try { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) - const getConnectionResponse = await datazoneClient.getConnection({ - domainIdentifier: project.domainId, - identifier: connection.connectionId, - withSecret: true, - }) - const connectionCredentialsProvider = await this.authProvider.getConnectionCredentialsProvider( connection.connectionId, project.id, - getConnectionResponse.location?.awsRegion || region + connection.location?.awsRegion || region ) const s3ConnectionNode = createS3ConnectionNode( connection, connectionCredentialsProvider, - getConnectionResponse.location?.awsRegion || region + connection.location?.awsRegion || region ) const accessGrantNodes = await createS3AccessGrantNodes( connection, connectionCredentialsProvider, - getConnectionResponse.location?.awsRegion || region, - getConnectionResponse.location?.awsAccountId + connection.location?.awsRegion || region, + connection.location?.awsAccountId ) return [s3ConnectionNode, ...accessGrantNodes] @@ -173,7 +183,7 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { region: string ): Promise { try { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientForProject(this.authProvider, project.id) const getConnectionResponse = await datazoneClient.getConnection({ domainIdentifier: project.domainId, identifier: connection.connectionId, @@ -201,17 +211,10 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { region: string ): Promise { try { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) - const getConnectionResponse = await datazoneClient.getConnection({ - domainIdentifier: project.domainId, - identifier: connection.connectionId, - withSecret: true, - }) - const connectionCredentialsProvider = await this.authProvider.getConnectionCredentialsProvider( connection.connectionId, project.id, - getConnectionResponse.location?.awsRegion || region + connection.location?.awsRegion || region ) return createLakehouseConnectionNode(connection, connectionCredentialsProvider, region) @@ -237,8 +240,26 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { return item }, getChildren: async () => { + // Filter connections inside the bucket parent node + const defaultS3Connection = s3Connections.find((conn) => + DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP.test(conn.name) + ) + const otherS3Connections = s3Connections.filter( + (conn) => + !DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP.test(conn.name) && + !S3_PROJECT_NON_GIT_PROJECT_REPOSITORY_LOCATION_NAME_REGEXP.test(conn.name) + ) + const s3Nodes: TreeNode[] = [] - for (const connection of s3Connections) { + + // Add default connections first + if (defaultS3Connection) { + const defaultS3Node = await this.createS3Node(project, defaultS3Connection, region) + s3Nodes.push(...defaultS3Node) + } + + // Add other connections + for (const connection of otherS3Connections) { const nodes = await this.createS3Node(project, connection, region) s3Nodes.push(...nodes) } @@ -247,4 +268,46 @@ export class SageMakerUnifiedStudioDataNode implements TreeNode { getParent: () => this, } } + + private createConnectionsParentNode( + project: DataZoneProject, + federatedConnections: DataZoneConnection[], + region: string + ): TreeNode { + return { + id: 'connections-parent', + resource: {}, + getTreeItem: () => { + const item = new vscode.TreeItem('Connections', vscode.TreeItemCollapsibleState.Collapsed) + item.contextValue = 'connectionsFolder' + return item + }, + getChildren: async () => { + const nodes: TreeNode[] = [] + for (const connection of federatedConnections) { + try { + const connectionCredentialsProvider = await this.authProvider.getConnectionCredentialsProvider( + connection.connectionId, + project.id, + connection.location?.awsRegion || region + ) + const node = await createFederatedConnectionNode( + connection, + connectionCredentialsProvider, + region + ) + nodes.push(node) + } catch (err) { + const errorMessage = `Failed to create federated connection - ${(err as Error).message}` + this.logger.error( + `Failed to create federated connection ${connection.name}: ${(err as Error).message}` + ) + nodes.push(createErrorItem(errorMessage, `federated-${connection.connectionId}`, this.id)) + } + } + return nodes + }, + getParent: () => this, + } + } } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts index 912693906e6..b37f1769be6 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.ts @@ -19,6 +19,8 @@ import { getResourceMetadata } from '../../shared/utils/resourceMetadataUtils' import { getContext } from '../../../shared/vscode/setContext' import { ToolkitError } from '../../../shared/errors' import { SmusErrorCodes } from '../../shared/smusUtils' +import { SmusIamConnection } from '../../auth/model' +import { createDZClientBaseOnDomainMode } from './utils' /** * Tree node representing a SageMaker Unified Studio project @@ -121,7 +123,7 @@ export class SageMakerUnifiedStudioProjectNode implements TreeNode { return [dataNode] } - const dzClient = await DataZoneClient.getInstance(this.authProvider) + const dzClient = await createDZClientBaseOnDomainMode(this.authProvider) if (!this.project?.id) { throw new Error('Project ID is required') } @@ -214,7 +216,7 @@ export class SageMakerUnifiedStudioProjectNode implements TreeNode { } try { - const dzClient = await DataZoneClient.getInstance(this.authProvider) + const dzClient = await createDZClientBaseOnDomainMode(this.authProvider) const projectDetails = await dzClient.getProject(this.project.id) if (projectDetails && projectDetails.name) { @@ -235,7 +237,13 @@ export class SageMakerUnifiedStudioProjectNode implements TreeNode { } let awsCredentialProvider if (getContext('aws.smus.isExpressMode')) { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = DataZoneClient.createWithCredentials( + this.authProvider.getDomainRegion(), + this.authProvider.getDomainId(), + await this.authProvider.getCredentialsProviderForIamProfile( + (this.authProvider.activeConnection as SmusIamConnection).profileName + ) + ) const projectId = this.project.id awsCredentialProvider = async (): Promise => { const creds = await datazoneClient.getProjectDefaultEnvironmentCreds(projectId) diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index 62eb14a0663..f3bb03e31ea 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { getIcon } from '../../../shared/icons' import { getLogger } from '../../../shared/logger/logger' -import { DataZoneClient, DataZoneProject } from '../../shared/client/datazoneClient' +import { DataZoneProject } from '../../shared/client/datazoneClient' import { Commands } from '../../../shared/vscode/commands2' import { telemetry } from '../../../shared/telemetry/telemetry' import { createQuickPick } from '../../../shared/ui/pickerPrompter' @@ -20,6 +20,7 @@ import { SmusAuthenticationMethod } from '../../auth/ui/authenticationMethodSele import { SmusAuthenticationOrchestrator } from '../../auth/authenticationOrchestrator' import { isSmusSsoConnection } from '../../auth/model' import { getContext } from '../../../shared/vscode/setContext' +import { createDZClientBaseOnDomainMode } from './utils' const contextValueSmusRoot = 'sageMakerUnifiedStudioRoot' const contextValueSmusLogin = 'sageMakerUnifiedStudioLogin' @@ -136,13 +137,13 @@ export class SageMakerUnifiedStudioRootNode implements TreeNode { } if (getContext('aws.smus.isExpressMode')) { - // In Express mode, immediately show data and compute nodes (project node's children) + // In Express mode, immediately show auth node, and project node's children (data and compute nodes) if (!this.projectNode.project) { await selectSMUSProject(this.projectNode) } const projectChildren = await this.projectNode.getChildren() - return projectChildren + return [this.authInfoNode, ...projectChildren] } // When authenticated, show auth info and projects @@ -459,7 +460,7 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj return } - const client = await DataZoneClient.getInstance(authProvider) + const client = await createDZClientBaseOnDomainMode(authProvider) logger.debug('DataZone client instance obtained successfully') const allProjects = await client.fetchAllProjects() diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts index cf69bcafde2..3c17f0d7ff2 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts @@ -6,7 +6,6 @@ import * as vscode from 'vscode' import { SageMakerUnifiedStudioComputeNode } from './sageMakerUnifiedStudioComputeNode' import { updateInPlace } from '../../../shared/utilities/collectionUtils' -import { DataZoneClient } from '../../shared/client/datazoneClient' import { DescribeDomainResponse } from '@amzn/sagemaker-client' import { getDomainUserProfileKey } from '../../../awsService/sagemaker/utils' import { getLogger } from '../../../shared/logger/logger' @@ -18,7 +17,9 @@ import { PollingSet } from '../../../shared/utilities/pollingSet' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { SmusUtils } from '../../shared/smusUtils' import { getIcon } from '../../../shared/icons' +import { PENDING_NODE_POLLING_INTERVAL_MS } from './utils' import { getContext } from '../../../shared/vscode/setContext' +import { createDZClientBaseOnDomainMode } from './utils' export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { public readonly id = 'smusSpacesParentNode' @@ -30,7 +31,10 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { private readonly onDidChangeEmitter = new vscode.EventEmitter() public readonly onDidChangeTreeItem = this.onDidChangeEmitter.event public readonly onDidChangeChildren = this.onDidChangeEmitter.event - public readonly pollingSet: PollingSet = new PollingSet(5, this.updatePendingNodes.bind(this)) + public readonly pollingSet: PollingSet = new PollingSet( + PENDING_NODE_POLLING_INTERVAL_MS, + this.updatePendingNodes.bind(this) + ) private spaceAwsAccountRegion: string | undefined public constructor( @@ -142,7 +146,7 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { } this.logger.debug('SMUS: Getting DataZone client instance') - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientBaseOnDomainMode(this.authProvider) if (!datazoneClient) { throw new Error('DataZone client is not initialized') } @@ -179,7 +183,7 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { } private async updateChildren(): Promise { - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) + const datazoneClient = await createDZClientBaseOnDomainMode(this.authProvider) let userProfileId if (getContext('aws.smus.isExpressMode')) { diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts index a94d25fccc4..73da925a8f7 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/types.ts @@ -17,6 +17,9 @@ export const DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP = /^(project\.default export const DATA_DEFAULT_ATHENA_CONNECTION_NAME_REGEXP = /^(project\.athena)|(default\.sql)$/ // eslint-disable-next-line @typescript-eslint/naming-convention export const DATA_DEFAULT_S3_CONNECTION_NAME_REGEXP = /^(project\.s3_default_folder)|(default\.s3)$/ +// eslint-disable-next-line @typescript-eslint/naming-convention, id-length +export const S3_PROJECT_NON_GIT_PROJECT_REPOSITORY_LOCATION_NAME_REGEXP = + /^(project\.non_git_project_repository_location)|(default\.s3_shared)$/ // Database object types export enum DatabaseObjects { @@ -205,3 +208,22 @@ export const LEAF_NODE_TYPES = [ // eslint-disable-next-line @typescript-eslint/naming-convention export const NO_DATA_FOUND_MESSAGE = '[No data found]' + +/** + * Glue connection types + */ +export const glueConnectionTypes = [ + 'BIGQUERY', + 'DOCUMENTDB', + 'DYNAMODB', + 'MYSQL', + 'OPENSEARCH', + 'ORACLE', + 'POSTGRESQL', + 'REDSHIFT', + 'SAPHANA', + 'SNOWFLAKE', + 'SQLSERVER', + 'TERADATA', + 'VERTICA', +] diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts index 10b52f83728..1f2c63a4aeb 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/utils.ts @@ -17,8 +17,19 @@ import { DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP, redshiftColumnTypes, lakeHouseColumnTypes, + glueConnectionTypes, } from './types' -import { DataZoneConnection } from '../../shared/client/datazoneClient' +import { DataZoneClient, DataZoneConnection } from '../../shared/client/datazoneClient' +import { getContext } from '../../../shared/vscode/setContext' +import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' +import { SmusIamConnection } from '../../auth/model' +import { ConnectionStatus } from '@aws-sdk/client-datazone' + +/** + * Polling interval in milliseconds for checking space status updates + */ +// eslint-disable-next-line @typescript-eslint/naming-convention +export const PENDING_NODE_POLLING_INTERVAL_MS = 5000 /** * Gets the label for a node based on its data @@ -41,6 +52,9 @@ export function getLabel(data: { data.value?.connection?.type === ConnectionType.LAKEHOUSE && DATA_DEFAULT_LAKEHOUSE_CONNECTION_NAME_REGEXP.test(data.value?.connection?.name) ) { + if (getContext('aws.smus.isExpressMode')) { + return 'Catalogs' + } return 'Lakehouse' } const formattedType = data.value?.connection?.type?.replace(/([A-Z]+(?:_[A-Z]+)*)/g, (match: string) => { @@ -224,6 +238,14 @@ function getColumnIcon(columnType: string): vscode.ThemeIcon | IconPath { return getIcon('vscode-calendar') } + // Check if it's a boolean type + if ( + lakeHouseColumnTypes.BOOLEAN.some((type) => upperType.includes(type)) || + redshiftColumnTypes.BOOLEAN.some((type) => upperType.includes(type)) + ) { + return getIcon('vscode-symbol-boolean') + } + // Default icon for unknown types return new vscode.ThemeIcon('symbol-field') } @@ -368,6 +390,69 @@ export function getRedshiftTypeFromHost(host?: string): RedshiftType | undefined } } +/** + * This function searches for property keys that end with "Properties" (like "snowflakeProperties", + * "redshiftProperties", "athenaProperties") and returns the actual property object, not just the key name. + * It only works for connections that have a glueConnectionName, indicating they are federated connections. + * + * @param connection - The DataZone connection object to search + * @returns The property object (not the key name) if found, undefined otherwise + * + * @example + * ```typescript + * // Redshift connection + * const redshiftConnection = { + * glueConnectionName: 'my-redshift-glue-conn', + * props: { + * redshiftProperties: { + * status: 'FAILED', + * errorMessage: 'Connection timeout' + * } + * } + * } + * const result = getGluePropertiesKey(redshiftConnection) + * // Returns: { status: 'FAILED', errorMessage: 'Connection timeout' } + */ +export function getGluePropertiesKey(connection: DataZoneConnection) { + if (!connection?.props) { + return undefined + } + if (!connection.glueConnectionName) { + return undefined + } + // Check for other properties that might contain glue connection info + const propertiesKey = Object.keys(connection.props).find( + (key) => + key.endsWith('Properties') && + typeof connection.props![key] === 'object' && + !Array.isArray(connection.props![key]) + ) + + return propertiesKey ? connection.props[propertiesKey] : undefined +} + +/** + * This function handles the refactor where connections moved from a single `glueProperties` object to + * connector-specific property bags (like `snowflakeProperties`, `redshiftProperties`, `athenaProperties`). + * It first checks for the legacy `glueProperties` field, then falls back to connector-specific properties. + * + * @param connection - The DataZone connection object to extract properties from + * @returns Object with optional status and errorMessage fields, or undefined if no properties found + */ +export function getGlueProperties(connection?: DataZoneConnection) { + if (!connection?.props) { + return undefined + } + // Check for direct glueProperties + if ('glueProperties' in connection.props) { + return connection.props.glueProperties + } + + return connection?.props?.[getGluePropertiesKey(connection)!] as + | { status?: ConnectionStatus; errorMessage?: string } + | undefined +} + /** * Determines if a connection is a federated connection by checking its type. * A connection is considered federated if it's either: @@ -379,7 +464,57 @@ export function getRedshiftTypeFromHost(host?: string): RedshiftType | undefined */ export function isFederatedConnection(connection?: DataZoneConnection): boolean { if (connection?.type === ConnectionType.REDSHIFT) { - return !!connection?.props?.glueProperties + return !!getGlueProperties(connection) + } + + // Check if connection type exists in GlueConnectionType enum values + return glueConnectionTypes.includes(connection?.type || '') +} + +/** + * Creates a DataZoneClient with appropriate credentials provider based on domain mode + * If domain mode is express mode, use the credential profile credential provider + * If domain mode is not express mode, use the DER credential provider + * @param smusAuthProvider The SMUS authentication provider + * @returns Promise resolving to DataZoneClient instance + */ +export async function createDZClientBaseOnDomainMode( + smusAuthProvider: SmusAuthenticationProvider +): Promise { + let credentialsProvider + if (getContext('aws.smus.isExpressMode') && !getContext('aws.smus.inSmusSpaceEnvironment')) { + credentialsProvider = await smusAuthProvider.getCredentialsProviderForIamProfile( + (smusAuthProvider.activeConnection as SmusIamConnection).profileName + ) + } else { + credentialsProvider = await smusAuthProvider.getDerCredentialsProvider() } - return false + return DataZoneClient.createWithCredentials( + smusAuthProvider.getDomainRegion(), + smusAuthProvider.getDomainId(), + credentialsProvider + ) +} + +/** + * Creates a DataZoneClient with appropriate credentials provider for a specific project + * If domain mode is express mode, use the project credential provider + * If domain mode is not express mode, use the DER credential provider + * @param smusAuthProvider The SMUS authentication provider + * @param projectId The project ID for project-specific credentials + * @returns Promise resolving to DataZoneClient instance + */ +export async function createDZClientForProject( + smusAuthProvider: SmusAuthenticationProvider, + projectId: string +): Promise { + const credentialsProvider = getContext('aws.smus.isExpressMode') + ? await smusAuthProvider.getProjectCredentialProvider(projectId) + : await smusAuthProvider.getDerCredentialsProvider() + + return DataZoneClient.createWithCredentials( + smusAuthProvider.getDomainRegion(), + smusAuthProvider.getDomainId(), + credentialsProvider + ) } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts index 12c78e3bb10..c29b0a5fb07 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts @@ -18,11 +18,10 @@ import { GetEnvironmentCommandOutput, } from '@aws-sdk/client-datazone' import { getLogger } from '../../../shared/logger/logger' -import type { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { DefaultStsClient } from '../../../shared/clients/stsClient' import { getContext } from '../../../shared/vscode/setContext' +import { CredentialsProvider } from '../../../auth/providers/credentials' import { SmusUtils } from '../smusUtils' -import { SmusIamConnection } from '../../auth/model' /** * Represents a DataZone domain @@ -98,6 +97,10 @@ export interface DataZoneConnection { awsAccountId?: string iamConnectionId?: string } + /** + * Glue connection name + */ + glueConnectionName?: string } // Constants for DataZone environment configuration @@ -105,14 +108,64 @@ const toolingBlueprintName = 'Tooling' const sageMakerProviderName = 'Amazon SageMaker' /** - * Client for interacting with AWS DataZone API with DER credential support + * Client for interacting with AWS DataZone API * - * This client integrates with SmusAuthenticationProvider to provide authenticated - * DataZone operations using Domain Execution Role (DER) credentials. - * - * One instance per connection/domainId is maintained to avoid duplication. + * This client can be used with different credential providers */ export class DataZoneClient { + private datazoneClient: DataZone | undefined + private static instances = new Map() + private readonly logger = getLogger() + + private constructor( + private readonly region: string, + private readonly domainId: string, + private readonly credentialsProvider?: CredentialsProvider + ) {} + + /** + * Creates a new DataZoneClient instance with specific credentials + * @param region AWS region + * @param domainId DataZone domain ID + * @param credentialsProvider Credentials provider + * @returns DataZoneClient instance with credentials + */ + public static createWithCredentials( + region: string, + domainId: string, + credentialsProvider: CredentialsProvider + ): DataZoneClient { + const instanceKey = credentialsProvider.getHashCode() + + if (DataZoneClient.instances.has(instanceKey)) { + const existingInstance = DataZoneClient.instances.get(instanceKey)! + getLogger().debug(`DataZoneClient: Using existing instance, instance key is ${instanceKey}`) + return existingInstance + } + + // Create new instance + getLogger().debug(`DataZoneClient: Creating new instance with instance key ${instanceKey}`) + const instance = new DataZoneClient(region, domainId, credentialsProvider) + DataZoneClient.instances.set(instanceKey, instance) + + return instance + } + + /** + * Disposes all cached DataZoneClient instances + */ + public static dispose(): void { + const logger = getLogger() + getLogger().debug('DataZoneClient: Disposing all cached instances') + + for (const [key, instance] of DataZoneClient.instances.entries()) { + instance.datazoneClient = undefined + logger.debug(`DataZoneClient: Disposed instance for: ${key}`) + } + + DataZoneClient.instances.clear() + } + /** * Parse a Redshift connection info object from JDBC URL * @param jdbcURL Example JDBC URL: jdbc:redshift://redshift-serverless-workgroup-3zzw0fjmccdixz.123456789012.us-east-1.redshift-serverless.amazonaws.com:5439/dev @@ -156,73 +209,6 @@ export class DataZoneClient { } } - private datazoneClient: DataZone | undefined - private static instances = new Map() - private readonly logger = getLogger() - - private constructor( - private readonly authProvider: SmusAuthenticationProvider, - private readonly domainId: string, - private readonly region: string - ) {} - - /** - * Gets an authenticated DataZoneClient instance using DER credentials - * One instance per connection/domainId is maintained - * @param authProvider The SMUS authentication provider - * @returns Promise resolving to authenticated DataZoneClient instance - */ - public static async getInstance(authProvider: SmusAuthenticationProvider): Promise { - const logger = getLogger() - - if (!authProvider.isConnected()) { - throw new Error('SMUS authentication provider is not connected') - } - - const region = authProvider.getDomainRegion() - const instanceKey = `${authProvider.getDomainId()}:${region}` - - logger.debug(`DataZoneClient: Getting instance for domain: ${instanceKey}`) - - // Check if we already have an instance for this domain/region - if (DataZoneClient.instances.has(instanceKey)) { - const existingInstance = DataZoneClient.instances.get(instanceKey)! - logger.debug('DataZoneClient: Using existing instance') - return existingInstance - } - - // Create new instance - logger.debug('DataZoneClient: Creating new instance') - const instance = new DataZoneClient(authProvider, authProvider.getDomainId(), region) - DataZoneClient.instances.set(instanceKey, instance) - - // Set up cleanup when connection changes - const disposable = authProvider.onDidChangeActiveConnection(() => { - logger.debug(`DataZoneClient: Connection changed, cleaning up instance for: ${instanceKey}`) - DataZoneClient.instances.delete(instanceKey) - instance.datazoneClient = undefined - disposable.dispose() - }) - - logger.info(`DataZoneClient: Created instance for domain ${authProvider.getDomainId()}`) - return instance - } - - /** - * Disposes all instances and cleans up resources - */ - public static dispose(): void { - const logger = getLogger() - logger.debug('DataZoneClient: Disposing all instances') - - for (const [key, instance] of DataZoneClient.instances.entries()) { - instance.datazoneClient = undefined - logger.debug(`DataZoneClient: Disposed instance for: ${key}`) - } - - DataZoneClient.instances.clear() - } - /** * Gets the DataZone domain ID * @returns DataZone domain ID @@ -298,35 +284,25 @@ export class DataZoneClient { private async getDataZoneClient(): Promise { if (!this.datazoneClient) { try { - const credentialsProvider = async () => { - let credentials - if (getContext('aws.smus.isExpressMode')) { - this.logger.info( - 'DataZoneClient: Creating authenticated DataZone client with Iam profile credentials' - ) - const activeConnection = this.authProvider.activeConnection! - credentials = await ( - await this.authProvider.getCredentialsProviderForIamProfile( - (activeConnection as SmusIamConnection).profileName - ) - ).getCredentials() - } else { - this.logger.debug('DataZoneClient: Creating authenticated DataZone client with DER credentials') - credentials = await (await this.authProvider.getDerCredentialsProvider()).getCredentials() - } - return { - accessKeyId: credentials.accessKeyId, - secretAccessKey: credentials.secretAccessKey, - sessionToken: credentials.sessionToken, - expiration: credentials.expiration, + if (this.credentialsProvider) { + const awsCredentialProvider = async () => { + const credentials = await this.credentialsProvider!.getCredentials() + return { + accessKeyId: credentials.accessKeyId, + secretAccessKey: credentials.secretAccessKey, + sessionToken: credentials.sessionToken, + expiration: credentials.expiration, + } } + this.datazoneClient = new DataZone({ + region: this.region, + credentials: awsCredentialProvider, + }) + } else { + throw new Error('No credentials provider provided') } - this.datazoneClient = new DataZone({ - region: this.region, - credentials: credentialsProvider, - }) - this.logger.debug('DataZoneClient: Successfully created authenticated DataZone client') + this.logger.info('DataZoneClient: Successfully created authenticated DataZone client') } catch (err) { this.logger.error('DataZoneClient: Failed to create DataZone client: %s', err as Error) throw err @@ -560,6 +536,22 @@ export class DataZoneClient { return undefined } + /** + * Parses glueConnectionName from physical endpoints + * @param physicalEndpoints Array of physical endpoints + * @returns glueConnectionName or undefined + */ + // eslint-disable-next-line id-length + private parseGlueConnectionNameFromPhysicalEndpoints( + physicalEndpoints?: PhysicalEndpoint[] + ): DataZoneConnection['glueConnectionName'] { + if (physicalEndpoints && physicalEndpoints.length > 0) { + const physicalEndpoint = physicalEndpoints[0] + return physicalEndpoint.glueConnectionName + } + return undefined + } + /** * Gets a specific connection by ID * @param params Parameters for getting a connection @@ -590,6 +582,8 @@ export class DataZoneClient { // Parse location from physical endpoints const location = this.parseLocationFromPhysicalEndpoints(response.physicalEndpoints) + const glueConnectionName = this.parseGlueConnectionNameFromPhysicalEndpoints(response.physicalEndpoints) + // Return as DataZoneConnection, currently only required fields are added // Can always include new fields in DataZoneConnection when needed const connection: DataZoneConnection = { @@ -602,6 +596,7 @@ export class DataZoneClient { props: response.props || {}, connectionCredentials: response.connectionCredentials, location, + glueConnectionName, } return connection @@ -663,6 +658,10 @@ export class DataZoneClient { // Parse location from physical endpoints const location = this.parseLocationFromPhysicalEndpoints(connection.physicalEndpoints) + const glueConnectionName = this.parseGlueConnectionNameFromPhysicalEndpoints( + connection.physicalEndpoints + ) + return { connectionId: connection.connectionId || '', name: connection.name || '', @@ -673,6 +672,7 @@ export class DataZoneClient { projectId, props: connection.props || {}, location, + glueConnectionName, } }) allConnections = [...allConnections, ...connections] @@ -757,7 +757,6 @@ export class DataZoneClient { /** * Gets environment details - * @param domainId The DataZone domain identifier * @param environmentId The environment identifier * @returns Promise resolving to environment details */ @@ -789,48 +788,36 @@ export class DataZoneClient { * @returns The tooling environment details */ public async getToolingEnvironment(projectId: string): Promise { - const logger = getLogger() - - const datazoneClient = await DataZoneClient.getInstance(this.authProvider) - if (!datazoneClient) { - throw new Error('DataZone client is not initialized') - } - - const toolingEnvId = await datazoneClient - .getToolingEnvironmentId(datazoneClient.getDomainId(), projectId) - .catch((err) => { - logger.error('Failed to get tooling environment ID for project %s', projectId) - throw new Error(`Failed to get tooling environment ID: ${err.message}`) - }) - + const toolingEnvId = await this.getToolingEnvironmentId(this.getDomainId(), projectId) if (!toolingEnvId) { throw new Error('No default environment found for project') } - - return await datazoneClient.getEnvironmentDetails(toolingEnvId) + return await this.getEnvironmentDetails(toolingEnvId) } public async getUserId(): Promise { - const derCredProvider = await this.authProvider.getDerCredentialsProvider() - this.logger.debug(`Calling STS GetCallerIdentity using DER credentials of ${this.getDomainId()}`) - const stsClient = new DefaultStsClient(this.getRegion(), await derCredProvider.getCredentials()) + if (!this.credentialsProvider) { + throw new Error('Credentials provider is required for getUserId') + } + const callerCredentials = await this.credentialsProvider.getCredentials() + const stsClient = new DefaultStsClient(this.getRegion(), callerCredentials) const callerIdentity = await stsClient.getCallerIdentity() this.logger.debug(`Retrieved caller identity, UserId: ${callerIdentity.UserId}`) return callerIdentity.UserId } public async getUserProfileId(): Promise { - const activeConnection = this.authProvider.activeConnection! - const smusConnections = (this.authProvider.secondaryAuth.state.get('smus.connections') as any) || {} - const profileName = smusConnections[activeConnection.id].profileName - const credentialsProvider = await this.authProvider.getCredentialsProviderForIamProfile(profileName) + if (!this.credentialsProvider) { + throw new Error('Credentials provider is required for getUserId') + } + const callerCredentials = await this.credentialsProvider.getCredentials() - const stsClient = new DefaultStsClient(this.getRegion(), await credentialsProvider.getCredentials()) + const stsClient = new DefaultStsClient(this.getRegion(), callerCredentials) const callerIdentity = await stsClient.getCallerIdentity() this.logger.debug(`Retrieved caller identity, Arn: ${callerIdentity.Arn}`) const roleArn = SmusUtils.convertAssumedRoleArnToIamRoleArn(callerIdentity.Arn!) - this.logger.debug(`Retrieved user identity, Iam role Arn: ${callerIdentity.Arn}`) + this.logger.debug(`Retrieved user identity, IAM ARN: ${roleArn}`) const datazoneClient = await this.getDataZoneClient() const userProfile = await datazoneClient.getUserProfile({ diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts index 607b6f4c085..7c6ad982e48 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts @@ -257,4 +257,51 @@ export class DataZoneDomainPreferencesClient { throw new Error(`Failed to get domain info: ${(err as Error).message}`) } } + + /** + * Gets a specific domain by its ID + * @param domainId The ID of the domain to retrieve + * @returns Promise resolving to the GetDomainOutput + */ + public async getDomain(domainId: string): Promise { + try { + this.logger.debug(`DataZoneDomainPreferencesClient: Getting domain with ID: ${domainId}`) + + const datazoneDomainPreferencesClient = await this.getDataZoneDomainPreferencesClient() + + const response = await datazoneDomainPreferencesClient + .getDomain({ + identifier: domainId, + }) + .promise() + + this.logger.debug(`DataZoneDomainPreferencesClient: Successfully retrieved domain: ${domainId}`) + return response + } catch (err) { + this.logger.error('DataZoneDomainPreferencesClient: Failed to get domain: %s', (err as Error).message) + throw err + } + } + + /** + * Checks if a specific domain is an EXPRESS domain + * @param domainId The ID of the domain to check + * @returns Promise resolving to true if the domain is EXPRESS, false otherwise + */ + public async isExpressDomain(domainId: string): Promise { + try { + this.logger.debug(`DataZoneDomainPreferencesClient: Checking if domain ${domainId} is EXPRESS`) + + const domain = await this.getDomain(domainId) + const isExpress = domain.preferences?.DOMAIN_MODE === 'EXPRESS' || false + + this.logger.debug( + `DataZoneDomainPreferencesClient: Domain ${domainId} is ${isExpress ? 'EXPRESS' : 'not EXPRESS'}` + ) + return isExpress + } catch (err) { + this.logger.error('DataZoneDomainPreferencesClient: Failed to check if domain is EXPRESS: %s', err as Error) + throw err + } + } } diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts index d86c3904a07..43fbb0a2ff0 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/s3Client.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { S3 } from '@aws-sdk/client-s3' +import { S3, ListBucketsCommand } from '@aws-sdk/client-s3' import { getLogger } from '../../../shared/logger/logger' import { ConnectionCredentialsProvider } from '../../auth/providers/connectionCredentialsProvider' @@ -45,7 +45,7 @@ export class S3Client { continuationToken?: string ): Promise<{ paths: S3Path[]; nextToken?: string }> { try { - this.logger.info(`S3Client: Listing paths in bucket ${bucket} with prefix ${prefix || 'root'}`) + this.logger.info(`S3Client: Listing paths in bucket ${bucket} with prefix ${prefix}`) const s3Client = await this.getS3Client() @@ -116,6 +116,40 @@ export class S3Client { } } + /** + * Lists all S3 buckets accessible to the current credentials + * @returns Array of bucket objects + */ + public async listBuckets(): Promise> { + try { + this.logger.debug('S3Client: Listing all accessible buckets') + + const s3Client = await this.getS3Client() + const allBuckets: Array<{ Name?: string; CreationDate?: Date }> = [] + let continuationToken: string | undefined + + do { + const response = await s3Client.send( + new ListBucketsCommand({ + ContinuationToken: continuationToken, + BucketRegion: this.region, + }) + ) + + if (response.Buckets) { + allBuckets.push(...response.Buckets) + } + continuationToken = response.ContinuationToken + } while (continuationToken) + + this.logger.debug(`S3Client: Found ${allBuckets.length} accessible buckets`) + return allBuckets + } catch (err) { + this.logger.error('S3Client: Failed to list buckets: %s', err as Error) + throw err + } + } + /** * Gets the S3 client, initializing it if necessary */ diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 0e36b8de299..7a48a2761d3 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -8,6 +8,10 @@ import { ToolkitError } from '../../shared/errors' import { isSageMaker } from '../../shared/extensionUtilities' import { getResourceMetadata } from './utils/resourceMetadataUtils' import fetch from 'node-fetch' +import { CredentialsProvider, CredentialsProviderType } from '../../auth/providers/credentials' +import { CredentialType } from '../../shared/telemetry/telemetry' +import { AwsCredentialIdentity } from '@aws-sdk/types' +import { DataZoneDomainPreferencesClient } from './client/datazoneDomainPreferencesClient' /** * Represents SSO instance information retrieved from DataZone @@ -74,6 +78,18 @@ export const SmusErrorCodes = { CredentialProviderInitFailed: 'CredentialProviderInitFailed', /** Error code for when IAM profile type is invalid */ InvalidProfileType: 'InvalidProfileType', + /** Error code for when IAM credential validation fails */ + IamValidationFailed: 'IamValidationFailed', + /** Error code for when sign out operation fails */ + SignOutFailed: 'SignOutFailed', + /** Error code for when domain URL format is invalid */ + InvalidDomainUrl: 'InvalidDomainUrl', + /** Error code for when connection to SMUS fails */ + FailedToConnect: 'FailedToConnect', + /** Error code for when connection is not found */ + ConnectionNotFound: 'ConnectionNotFound', + /** Error code for when connection type is invalid for the operation */ + InvalidConnectionType: 'InvalidConnectionType', } as const /** @@ -381,22 +397,71 @@ export class SmusUtils { } /** - * Converts an STS assumed-role ARN to its corresponding IAM role ARN. - * Example: + * Checks if we're in SMUS Express mode + * @param domainId The DataZone domain ID to check + * @param region The AWS region where the domain is located + * @param credentialsProvider The credentials provider to use for API calls + * @returns Promise resolving to true if the domain is in Express mode + */ + public static async isInSmusExpressMode( + domainId: string, + region: string, + credentialsProvider: CredentialsProvider + ): Promise { + try { + this.logger.info(`SMUS: Checking if domain ${domainId} is Express mode`) + + // Get DataZoneDomainPreferencesClient instance + const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance(credentialsProvider, region) + + // Check if the specific domain is an Express domain + const isExpress = await domainPreferencesClient.isExpressDomain(domainId) + + this.logger.debug(`SMUS: Domain ${domainId} is ${isExpress ? ' Express mode' : 'not Express mode'}`) + return isExpress + } catch (error) { + this.logger.error('SMUS: Failed to check Express mode: %s', error as Error) + return false + } + } + + /** + * Converts an STS assumed-role ARN to its corresponding IAM role ARN, or returns IAM user ARN as-is. + * Supports all AWS partitions (aws, aws-cn, aws-us-gov, etc.) + * Examples: * Input: arn:aws:sts::123456789012:assumed-role/MyRole/MySession * Output: arn:aws:iam::123456789012:role/MyRole + * + * Input: arn:aws:iam::123456789012:user/MyUser + * Output: arn:aws:iam::123456789012:user/MyUser + * + * Input: arn:aws-cn:sts::123456789012:assumed-role/MyRole/MySession + * Output: arn:aws-cn:iam::123456789012:role/MyRole */ public static convertAssumedRoleArnToIamRoleArn(stsArn: string): string { - const arnRegex = /^arn:aws:sts::(\d{12}):assumed-role\/([A-Za-z0-9+=,.@_\/-]+)\/([A-Za-z0-9+=,.@_-]+)$/ + // Check if it's already an IAM user ARN - return as-is + // Supports all AWS partitions: aws, aws-cn, aws-us-gov, etc. + const iamUserRegex = /^arn:(aws[a-z-]*):iam::(\d{12}):user\/([A-Za-z0-9+=,.@_\/-]+)$/ + if (iamUserRegex.test(stsArn)) { + return stsArn + } + // Check if it's already an IAM role ARN - return as-is + const iamRoleRegex = /^arn:(aws[a-z-]*):iam::(\d{12}):role\/([A-Za-z0-9+=,.@_\/-]+)$/ + if (iamRoleRegex.test(stsArn)) { + return stsArn + } + + // Try to convert STS assumed-role ARN to IAM role ARN + const arnRegex = /^arn:(aws[a-z-]*):sts::(\d{12}):assumed-role\/([A-Za-z0-9+=,.@_\/-]+)\/([A-Za-z0-9+=,.@_-]+)$/ const match = stsArn.match(arnRegex) if (!match) { throw new Error(`Invalid STS ARN format: ${stsArn}`) } - const [, accountId, roleName] = match + const [, partition, accountId, roleName] = match - return `arn:aws:iam::${accountId}:role/${roleName}` + return `arn:${partition}:iam::${accountId}:role/${roleName}` } } @@ -448,3 +513,29 @@ export async function extractAccountIdFromResourceMetadata(): Promise { throw new Error('Failed to extract AWS account ID from ResourceArn in SMUS space environment') } } + +/** + * Creates a CredentialsProvider from an AWS credentials function + * @param credentialsFunction Function that returns AWS credentials + * @param credentialTypeId Identifier for the credential type + * @param hashCode Unique hash code for caching + * @param region Domain region + * @returns Complete CredentialsProvider object + */ +export function convertToToolkitCredentialProvider( + credentialsFunction: () => Promise, + credentialTypeId: string, + hashCode: string, + region: string +): CredentialsProvider { + return { + getCredentials: credentialsFunction, + getCredentialsId: () => ({ credentialSource: 'temp' as const, credentialTypeId }), + getProviderType: () => 'temp' as CredentialsProviderType, + getTelemetryType: () => 'other' as CredentialType, + getDefaultRegion: () => region, + getHashCode: () => hashCode, + canAutoConnect: () => Promise.resolve(false), + isAvailable: () => Promise.resolve(true), + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts b/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts index d2963965750..2bdcd3014d9 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/telemetry.ts @@ -18,7 +18,8 @@ import { SmusAuthenticationProvider } from '../auth/providers/smusAuthentication import { getLogger } from '../../shared/logger/logger' import { getContext } from '../../shared/vscode/setContext' import { ConnectionCredentialsProvider } from '../auth/providers/connectionCredentialsProvider' -import { DataZoneConnection, DataZoneClient } from './client/datazoneClient' +import { DataZoneConnection } from './client/datazoneClient' +import { createDZClientBaseOnDomainMode } from '../explorer/nodes/utils' /** * Records space telemetry @@ -43,7 +44,7 @@ export async function recordSpaceTelemetry( projectAccountId = await authProvider.getProjectAccountId(projectId) // Get project region from tooling environment - const dzClient = await DataZoneClient.getInstance(authProvider) + const dzClient = await createDZClientBaseOnDomainMode(authProvider) const toolingEnv = await dzClient.getToolingEnvironment(projectId) projectRegion = toolingEnv.awsAccountRegion } diff --git a/packages/core/src/shared/clients/sagemaker.ts b/packages/core/src/shared/clients/sagemaker.ts index ff086ed1d9e..fda420effef 100644 --- a/packages/core/src/shared/clients/sagemaker.ts +++ b/packages/core/src/shared/clients/sagemaker.ts @@ -52,6 +52,11 @@ import { yes, no, continueText, cancel } from '../localizedText' import { AwsCredentialIdentity } from '@aws-sdk/types' import globals from '../extensionGlobals' +const appTypeSettingsMap: Record = { + [AppType.JupyterLab as string]: 'JupyterLabAppSettings', + [AppType.CodeEditor as string]: 'CodeEditorAppSettings', +} as const + export interface SagemakerSpaceApp extends SpaceDetails { App?: AppDetails DomainSpaceKey: string @@ -136,13 +141,13 @@ export class SagemakerClient extends ClientWrapper { // Get app type const appType = spaceDetails.SpaceSettings?.AppType - if (appType !== 'JupyterLab' && appType !== 'CodeEditor') { + if (!appType || !(appType in appTypeSettingsMap)) { throw new ToolkitError(`Unsupported AppType "${appType}" for space "${spaceName}"`) } // Get app resource spec const requestedResourceSpec = - appType === 'JupyterLab' + appType === AppType.JupyterLab ? spaceDetails.SpaceSettings?.JupyterLabAppSettings?.DefaultResourceSpec : spaceDetails.SpaceSettings?.CodeEditorAppSettings?.DefaultResourceSpec @@ -181,16 +186,30 @@ export class SagemakerClient extends ClientWrapper { instanceType = InstanceTypeMinimum } - // Get remote access flag - if (!spaceDetails.SpaceSettings?.RemoteAccess || spaceDetails.SpaceSettings?.RemoteAccess === 'DISABLED') { + // First, update the space if needed + const needsRemoteAccess = + !spaceDetails.SpaceSettings?.RemoteAccess || spaceDetails.SpaceSettings?.RemoteAccess === 'DISABLED' + const instanceTypeChanged = requestedResourceSpec?.InstanceType !== instanceType + + if (needsRemoteAccess || instanceTypeChanged) { + const updateSpaceRequest: UpdateSpaceCommandInput = { + DomainId: domainId, + SpaceName: spaceName, + SpaceSettings: { + ...(needsRemoteAccess && { RemoteAccess: 'ENABLED' }), + ...(instanceTypeChanged && { + [appTypeSettingsMap[appType]]: { + DefaultResourceSpec: { + InstanceType: instanceType, + }, + }, + }), + }, + } + try { - await this.updateSpace({ - DomainId: domainId, - SpaceName: spaceName, - SpaceSettings: { - RemoteAccess: 'ENABLED', - }, - }) + getLogger().debug('SagemakerClient: Updating space: domainId=%s, spaceName=%s', domainId, spaceName) + await this.updateSpace(updateSpaceRequest) await this.waitForSpaceInService(spaceName, domainId) } catch (err) { throw this.handleStartSpaceError(err) @@ -214,6 +233,7 @@ export class SagemakerClient extends ClientWrapper { ? { ...resourceSpec, EnvironmentArn: undefined, EnvironmentVersionArn: undefined } : resourceSpec + // Second, create the App const createAppRequest: CreateAppCommandInput = { DomainId: domainId, SpaceName: spaceName, @@ -223,6 +243,7 @@ export class SagemakerClient extends ClientWrapper { } try { + getLogger().debug('SagemakerClient: Creating app: domainId=%s, spaceName=%s', domainId, spaceName) await this.createApp(createAppRequest) } catch (err) { throw this.handleStartSpaceError(err) diff --git a/packages/core/src/shared/sshConfig.ts b/packages/core/src/shared/sshConfig.ts index bba23b9a4d8..92b32666b06 100644 --- a/packages/core/src/shared/sshConfig.ts +++ b/packages/core/src/shared/sshConfig.ts @@ -208,7 +208,7 @@ Host ${this.configHostName} protected createSSHConfigSection(proxyCommand: string): string { if (this.scriptPrefix === 'sagemaker_connect') { - return `${this.getSageMakerSSHConfig(proxyCommand)}User '%r'\n` + return `${this.getSageMakerSSHConfig(proxyCommand)}` } else if (this.keyPath) { return `${this.getBaseSSHConfig(proxyCommand)}IdentityFile '${this.keyPath}'\n User '%r'\n` } diff --git a/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts b/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts index 9ff24b2a3f9..f27df1fcb11 100644 --- a/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts +++ b/packages/core/src/test/awsService/sagemaker/uriHandlers.test.ts @@ -44,6 +44,7 @@ describe('SageMaker URI handler', function () { ws_url: 'wss://example.com', 'cell-number': '4', token: 'my-token', + app_type: 'jupyterlab', } const uri = createConnectUri(params) @@ -55,5 +56,24 @@ describe('SageMaker URI handler', function () { assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[3], 'wss://example.com&cell-number=4') assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[4], 'my-token') assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[5], 'my-domain') + assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[6], 'jupyterlab') + }) + + it('calls deeplinkConnect with undefined app_type when not provided', async function () { + const params = { + connection_identifier: 'abc123', + domain: 'my-domain', + user_profile: 'me', + session: 'sess-xyz', + ws_url: 'wss://example.com', + 'cell-number': '4', + token: 'my-token', + } + + const uri = createConnectUri(params) + await handler.handleUri(uri) + + assert.ok(deeplinkConnectStub.calledOnce) + assert.deepStrictEqual(deeplinkConnectStub.firstCall.args[6], undefined) }) }) diff --git a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts index f205f075872..218fa384c1e 100644 --- a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts +++ b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts @@ -65,7 +65,7 @@ dependencyManagement: targetVersion: "3.0.0" originType: "THIRD_PARTY" plugins: - - identifier: "com.example:plugin" + - identifier: "plugin.id" targetVersion: "1.2.0" versionProperty: "plugin.version" # Optional originType: "FIRST_PARTY" # or "THIRD_PARTY"` @@ -503,6 +503,10 @@ dependencyManagement: await fs.mkdir(gitFolder) await fs.writeFile(path.join(gitFolder, 'config'), 'sample content for the test file') + const githubFolder = path.join(tempDir, '.github') + await fs.mkdir(githubFolder) + await fs.writeFile(path.join(githubFolder, 'config'), 'more sample content for the test file') + const zippedFiles = getFilesRecursively(tempDir, false) assert.strictEqual(zippedFiles.length, 1) }) @@ -582,15 +586,21 @@ dependencyManagement: assert.strictEqual(errorMessage, `Missing required key: \`dependencyManagement\``) }) - it(`WHEN validateCustomVersionsFile on .yaml file with invalid identifier format THEN fails validation`, function () { + it(`WHEN validateCustomVersionsFile on .yaml file with invalid dependency identifier format THEN fails validation`, function () { const invalidFile = validCustomVersionsFile.replace('com.example:library1', 'com.example-library1') const errorMessage = validateCustomVersionsFile(invalidFile) assert.strictEqual( errorMessage, - `Invalid identifier format: \`com.example-library1\`. Must be in format \`groupId:artifactId\` without spaces` + `Invalid dependency identifier format: \`com.example-library1\`. Must be in format \`groupId:artifactId\` without spaces` ) }) + it(`WHEN validateCustomVersionsFile on .yaml file with missing plugin identifier format THEN fails validation`, function () { + const invalidFile = validCustomVersionsFile.replace('plugin.id', '') + const errorMessage = validateCustomVersionsFile(invalidFile) + assert.strictEqual(errorMessage, 'Missing `identifier` in plugin') + }) + it(`WHEN validateCustomVersionsFile on .yaml file with invalid originType THEN fails validation`, function () { const invalidFile = validCustomVersionsFile.replace('FIRST_PARTY', 'INVALID_TYPE') const errorMessage = validateCustomVersionsFile(invalidFile) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts index 951e391d181..8d14d21ba57 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/connectionCredentialsProvider.test.ts @@ -16,6 +16,7 @@ describe('ConnectionCredentialsProvider', function () { let connectionProvider: ConnectionCredentialsProvider let dataZoneClientStub: sinon.SinonStub + const testProjectId = 'proj-123456' const testConnectionId = 'conn-123456' const testDomainId = 'dzd_testdomain' const testRegion = 'us-east-2' @@ -42,6 +43,13 @@ describe('ConnectionCredentialsProvider', function () { isConnected: sinon.stub().returns(true), getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns(testRegion), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), activeConnection: { ssoRegion: testRegion, }, @@ -52,10 +60,10 @@ describe('ConnectionCredentialsProvider', function () { getConnection: sinon.stub().resolves(mockGetConnectionResponse), } as any - // Stub DataZoneClient.getInstance - dataZoneClientStub = sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + // Stub DataZoneClient.createWithCredentials + dataZoneClientStub = sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) - connectionProvider = new ConnectionCredentialsProvider(mockAuthProvider as any, testConnectionId) + connectionProvider = new ConnectionCredentialsProvider(mockAuthProvider as any, testConnectionId, testProjectId) }) afterEach(function () { diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts index 6dd206593f8..bef7cc1885d 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/projectRoleCredentialsProvider.test.ts @@ -36,6 +36,25 @@ describe('ProjectRoleCredentialsProvider', function () { getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns(testRegion), isConnected: sinon.stub().returns(true), + activeConnection: { + profileName: 'test-profile', + domainId: testDomainId, + ssoRegion: testRegion, + }, + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + getCredentialsProviderForIamProfile: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'profile-key', + secretAccessKey: 'profile-secret', + sessionToken: 'profile-token', + }), + }), } as any // Mock DataZone client @@ -43,8 +62,7 @@ describe('ProjectRoleCredentialsProvider', function () { getProjectDefaultEnvironmentCreds: sinon.stub().resolves(mockGetEnvironmentCredentialsResponse), } as any - // Stub DataZoneClient.getInstance - dataZoneClientStub = sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + dataZoneClientStub = sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) projectProvider = new ProjectRoleCredentialsProvider(mockSmusAuthProvider, testProjectId) }) @@ -111,8 +129,8 @@ describe('ProjectRoleCredentialsProvider', function () { it('should fetch and cache project credentials', async function () { const credentials = await projectProvider.getCredentials() - // Verify DataZone client getInstance was called - assert.ok(dataZoneClientStub.calledWith(mockSmusAuthProvider)) + // Verify DataZone client createWithCredentials was called with correct parameters + assert.ok(dataZoneClientStub.calledWith(testRegion, testDomainId, sinon.match.any)) // Verify getProjectDefaultEnvironmentCreds was called assert.ok(mockDataZoneClient.getProjectDefaultEnvironmentCreds.called) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 466e7bf8386..b0a5bb8542b 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -31,6 +31,7 @@ describe('SmusAuthenticationProvider', function () { let isInSmusSpaceEnvironmentStub: sinon.SinonStub let executeCommandStub: sinon.SinonStub let setContextStubGlobal: sinon.SinonStub + let getResourceMetadataStub: sinon.SinonStub let mockSecondaryAuthState: { activeConnection: SmusConnection | undefined hasSavedConnection: boolean @@ -103,7 +104,7 @@ describe('SmusAuthenticationProvider', function () { } as any // Stub static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) extractDomainInfoStub = sinon .stub(SmusUtils, 'extractDomainInfoFromUrl') .returns({ domainId: testDomainId, region: testRegion }) @@ -191,8 +192,49 @@ describe('SmusAuthenticationProvider', function () { }) describe('restore', function () { - it('should call secondary auth restoreConnection', async function () { + let mockState: any + let loadSharedCredentialsProfilesStub: sinon.SinonStub + let validateIamProfileStub: sinon.SinonStub + beforeEach(function () { + mockState = { + get: sinon.stub(), + update: sinon.stub().resolves(), + } + mockSecondaryAuth.state = mockState + + loadSharedCredentialsProfilesStub = sinon.stub( + require('../../../auth/credentials/sharedCredentials'), + 'loadSharedCredentialsProfiles' + ) + validateIamProfileStub = sinon.stub(smusAuthProvider, 'validateIamProfile') + }) + + it('should call secondary auth restoreConnection when no saved connection ID', async function () { + mockState.get.withArgs('smus.savedConnectionId').returns(undefined) + + await smusAuthProvider.restore() + + assert.ok(mockSecondaryAuth.restoreConnection.called) + assert.ok(loadSharedCredentialsProfilesStub.notCalled) + }) + + it('should validate IAM profile and restore connection', async function () { + const savedConnectionId = 'test-connection-id' + const connectionMetadata = { + profileName: 'test-profile', + domainId: 'old-domain-id', + region: 'us-west-1', + } + const smusConnections = { [savedConnectionId]: connectionMetadata } + + mockState.get.withArgs('smus.savedConnectionId').returns(savedConnectionId) + mockState.get.withArgs('smus.connections').returns(smusConnections) + loadSharedCredentialsProfilesStub.resolves({ 'test-profile': { region: 'us-east-1' } }) + validateIamProfileStub.resolves({ isValid: true }) + await smusAuthProvider.restore() + + assert.ok(validateIamProfileStub.calledWith('test-profile')) assert.ok(mockSecondaryAuth.restoreConnection.called) }) }) @@ -316,10 +358,16 @@ describe('SmusAuthenticationProvider', function () { }) describe('reauthenticate', function () { - it('should call auth reauthenticate', async function () { + it('should call auth reauthenticate for SSO connection', async function () { const result = await smusAuthProvider.reauthenticate(mockSmusConnection) - assert.strictEqual(result, mockSmusConnection) + // Verify the result has the correct SMUS properties preserved + assert.strictEqual(result.id, mockSmusConnection.id) + assert.strictEqual(result.domainUrl, mockSmusConnection.domainUrl) + assert.strictEqual(result.domainId, mockSmusConnection.domainId) + assert.strictEqual(result.type, mockSmusConnection.type) + assert.strictEqual(result.startUrl, mockSmusConnection.startUrl) + assert.strictEqual(result.label, mockSmusConnection.label) assert.ok(mockAuth.reauthenticate.calledWith(mockSmusConnection)) }) @@ -698,7 +746,7 @@ describe('SmusAuthenticationProvider', function () { assert.strictEqual(smusAuthProvider['cachedProjectAccountIds'].get(testProjectId), testAccountId) assert.ok(getProjectCredentialProviderStub.calledWith(testProjectId)) assert.ok(mockProjectCredentialsProvider.getCredentials.called) - assert.ok((DataZoneClient.getInstance as sinon.SinonStub).called) + assert.ok((DataZoneClient.createWithCredentials as sinon.SinonStub).called) assert.ok(mockDataZoneClientForProject.getToolingEnvironment.calledWith(testProjectId)) assert.ok(mockStsClient.getCallerIdentity.called) }) @@ -1214,4 +1262,232 @@ describe('SmusAuthenticationProvider', function () { assert.strictEqual((result as any)?.type, 'iam') }) }) + + describe('getDerCredentialsProvider', function () { + let getContextStub: sinon.SinonStub + + beforeEach(function () { + getContextStub = sinon.stub(vscodeSetContext, 'getContext') + + // Clear cache + smusAuthProvider['credentialsProviderCache'].clear() + }) + + describe('in SMUS space environment', function () { + beforeEach(function () { + getContextStub.withArgs('aws.smus.inSmusSpaceEnvironment').returns(true) + + // Mock resource metadata for SMUS space environment + getResourceMetadataStub = sinon.stub(resourceMetadataUtils, 'getResourceMetadata').returns({ + ResourceArn: 'arn:aws:sagemaker:us-east-2:123456789012:app/dzd_domainId/test-app', + AdditionalMetadata: { + DataZoneDomainId: testDomainId, + DataZoneDomainRegion: testRegion, + }, + } as any) + }) + + afterEach(function () { + getResourceMetadataStub?.restore() + }) + + it('should return a credentials provider that can retrieve credentials', async function () { + // In SMUS space environment, the method should return a provider + // We can't easily test the internal branching logic without stubbing ES modules + // So we test that it returns a valid provider structure + const provider = await smusAuthProvider.getDerCredentialsProvider() + + assert.ok(provider, 'Provider should be returned') + assert.ok(typeof provider.getCredentials === 'function', 'Provider should have getCredentials method') + }) + + it('should not cache providers in SMUS space environment', async function () { + // Get provider twice + const provider1 = await smusAuthProvider.getDerCredentialsProvider() + const provider2 = await smusAuthProvider.getDerCredentialsProvider() + + // In SMUS space, providers are not cached (new provider each time) + // This is because the logic returns early before caching + assert.ok(provider1) + assert.ok(provider2) + }) + }) + + describe('in non-SMUS space environment', function () { + let getAccessTokenStub: sinon.SinonStub + + beforeEach(function () { + getContextStub.withArgs('aws.smus.inSmusSpaceEnvironment').returns(false) + mockSecondaryAuthState.activeConnection = mockSmusConnection + getAccessTokenStub = sinon.stub(smusAuthProvider, 'getAccessToken').resolves('mock-access-token') + }) + + it('should create and cache DomainExecRoleCredentialsProvider for SSO connection', async function () { + const provider = await smusAuthProvider.getDerCredentialsProvider() + + assert.ok(provider) + assert.ok(getAccessTokenStub.notCalled) // Not called until getCredentials is invoked + + // Verify caching + const cachedProvider = await smusAuthProvider.getDerCredentialsProvider() + assert.strictEqual(provider, cachedProvider) + }) + + it('should throw error when no active connection', async function () { + mockSecondaryAuthState.activeConnection = undefined + + await assert.rejects( + () => smusAuthProvider.getDerCredentialsProvider(), + (err: ToolkitError) => { + return ( + err.code === 'NoActiveConnection' && + err.message.includes('No active SMUS connection available') + ) + } + ) + }) + + it('should throw error for non-SSO connection', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + await assert.rejects( + () => smusAuthProvider.getDerCredentialsProvider(), + (err: ToolkitError) => { + return ( + err.code === 'InvalidConnectionType' && + err.message.includes( + 'Domain Execution Role credentials are only available for SSO connections' + ) + ) + } + ) + }) + + it('should use cached provider for same connection', async function () { + const provider1 = await smusAuthProvider.getDerCredentialsProvider() + const provider2 = await smusAuthProvider.getDerCredentialsProvider() + + assert.strictEqual(provider1, provider2) + }) + + it('should create different providers for different connections', async function () { + const provider1 = await smusAuthProvider.getDerCredentialsProvider() + + // Change connection + const differentConnection = { + ...mockSmusConnection, + id: 'different-connection-id', + domainId: 'different-domain-id', + } + mockSecondaryAuthState.activeConnection = differentConnection + + const provider2 = await smusAuthProvider.getDerCredentialsProvider() + + assert.notStrictEqual(provider1, provider2) + }) + }) + }) + + describe('initExpressModeContextInSpaceEnvironment', function () { + let getResourceMetadataStub: sinon.SinonStub + let getDerCredentialsProviderStub: sinon.SinonStub + let isInSmusExpressModeStub: sinon.SinonStub + let mockCredentialsProvider: any + + const testResourceMetadata = { + AdditionalMetadata: { + DataZoneDomainId: 'test-domain-id', + DataZoneDomainRegion: 'us-east-1', + DataZoneProjectId: 'test-project-id', + }, + } + + beforeEach(function () { + getResourceMetadataStub = sinon.stub(resourceMetadataUtils, 'getResourceMetadata') + isInSmusExpressModeStub = sinon.stub(SmusUtils, 'isInSmusExpressMode') + + // Reset the global setContext stub history for clean test state + setContextStubGlobal.resetHistory() + + mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + }), + } + + getDerCredentialsProviderStub = sinon + .stub(smusAuthProvider, 'getDerCredentialsProvider') + .resolves(mockCredentialsProvider) + }) + + afterEach(function () { + sinon.restore() + }) + + it('should set express mode context to true when domain is express mode', async function () { + getResourceMetadataStub.returns(testResourceMetadata) + isInSmusExpressModeStub.resolves(true) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.called) + assert.ok( + isInSmusExpressModeStub.calledWith( + testResourceMetadata.AdditionalMetadata.DataZoneDomainId, + testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion, + mockCredentialsProvider + ) + ) + assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', true)) + }) + + it('should set express mode context to false when domain is not express mode', async function () { + getResourceMetadataStub.returns(testResourceMetadata) + isInSmusExpressModeStub.resolves(false) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.called) + assert.ok( + isInSmusExpressModeStub.calledWith( + testResourceMetadata.AdditionalMetadata.DataZoneDomainId, + testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion, + mockCredentialsProvider + ) + ) + assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', false)) + }) + + it('should not call express mode check when resource metadata is missing', async function () { + getResourceMetadataStub.returns(undefined) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.notCalled) + assert.ok(isInSmusExpressModeStub.notCalled) + assert.ok(setContextStubGlobal.notCalled) + }) + + it('should handle error when getDerCredentialsProvider fails', async function () { + getResourceMetadataStub.returns(testResourceMetadata) + const testError = new Error('Failed to get credentials provider') + getDerCredentialsProviderStub.rejects(testError) + + await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() + + assert.ok(getResourceMetadataStub.called) + assert.ok(getDerCredentialsProviderStub.called) + assert.ok(isInSmusExpressModeStub.notCalled) + assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', false)) + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts index 982aa481bd3..519f491c742 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/activation.test.ts @@ -11,7 +11,6 @@ import { SmusAuthenticationProvider, setSmusConnectedContext, } from '../../../sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider' -import { DataZoneClient } from '../../../sagemakerunifiedstudio/shared/client/datazoneClient' import { ResourceTreeDataProvider } from '../../../shared/treeview/resourceTreeDataProvider' import { SageMakerUnifiedStudioRootNode } from '../../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode' import { getLogger } from '../../../shared/logger/logger' @@ -19,6 +18,8 @@ import { getTestWindow } from '../../shared/vscode/window' import { SeverityLevel } from '../../shared/vscode/message' import * as extensionUtilities from '../../../shared/extensionUtilities' import { createMockSpaceNode } from '../testUtils' +import { DataZoneClient } from '../../../sagemakerunifiedstudio/shared/client/datazoneClient' +import * as model from '../../../sagemakerunifiedstudio/auth/model' describe('SMUS Explorer Activation', function () { let mockExtensionContext: vscode.ExtensionContext @@ -69,7 +70,7 @@ describe('SMUS Explorer Activation', function () { // Stub SmusAuthenticationProvider sinon.stub(SmusAuthenticationProvider, 'fromContext').returns(mockSmusAuthProvider as any) - // Stub DataZoneClient + // Stub DataZoneClient.dispose dataZoneDisposeStub = sinon.stub(DataZoneClient, 'dispose') // Stub SageMakerUnifiedStudioRootNode constructor @@ -151,7 +152,7 @@ describe('SMUS Explorer Activation', function () { it('should register DataZone client disposal', async function () { await activate(mockExtensionContext) - // Find the DataZone dispose subscription - it should be the last one added + // Find the DataZone dispose subscription const subscriptions = mockExtensionContext.subscriptions assert.ok(subscriptions.length > 0) @@ -261,7 +262,124 @@ describe('SMUS Explorer Activation', function () { // Check that an error message was shown const errorMessages = testWindow.shownMessages.filter((msg) => msg.severity === SeverityLevel.Error) assert.ok(errorMessages.length > 0, 'Should show error message') - assert.ok(errorMessages.some((msg) => msg.message.includes('Failed to reauthenticate'))) + assert.ok(errorMessages.some((msg) => msg.message.includes('Reauthentication failed'))) + }) + + it('should extract detailed error message from ToolkitError cause chain', async function () { + const reauthCommand = registerCommandStub + .getCalls() + .find((call) => call.args[0] === 'aws.smus.reauthenticate') + + assert.ok(reauthCommand) + + const mockConnection = { + id: 'test-connection', + type: 'sso', + startUrl: 'https://identitycenter.amazonaws.com/ssoins-testInstanceId', + ssoRegion: 'us-east-1', + scopes: ['datazone:domain:access'], + label: 'Test Connection', + } as any + + // Create a ToolkitError with a cause chain + const detailedError = new Error('Invalid profile - The security token is expired') + const wrapperError = new Error('Unable to reauthenticate SageMaker Unified Studio connection.') + ;(wrapperError as any).cause = detailedError + mockSmusAuthProvider.reauthenticate.rejects(wrapperError) + + const testWindow = getTestWindow() + + // Execute the command handler + await reauthCommand.args[1](mockConnection) + + // Check that the detailed error message from the cause was shown + const errorMessages = testWindow.shownMessages.filter((msg) => msg.severity === SeverityLevel.Error) + assert.ok(errorMessages.length > 0, 'Should show error message') + const hasDetailedError = errorMessages.some((msg) => + msg.message.includes('Invalid profile - The security token is expired') + ) + assert.ok(hasDetailedError, 'Should show detailed error from cause chain') + }) + + it('should not show success message for IAM connection reauthentication', async function () { + const reauthCommand = registerCommandStub + .getCalls() + .find((call) => call.args[0] === 'aws.smus.reauthenticate') + + assert.ok(reauthCommand) + + // Create an IAM connection + const mockIamConnection = { + id: 'test-iam-connection', + type: 'iam', + profileName: 'test-profile', + region: 'us-east-1', + label: 'Test IAM Connection', + } as any + + // Stub isSmusIamConnection to return true for IAM connection + sinon.stub(model, 'isSmusIamConnection').returns(true) + + // Mock the return value to return the connection (IAM connection handled its own message) + mockSmusAuthProvider.reauthenticate.resolves(mockIamConnection) + + const testWindow = getTestWindow() + + // Execute the command handler + await reauthCommand.args[1](mockIamConnection) + + assert.ok(mockSmusAuthProvider.reauthenticate.calledWith(mockIamConnection)) + assert.ok(mockTreeDataProvider.refresh.called) + + // Check that NO information message was shown (IAM handles its own) + const infoMessages = testWindow.shownMessages.filter( + (msg) => msg.severity === SeverityLevel.Information + ) + assert.ok( + !infoMessages.some((msg) => msg.message.includes('Successfully reauthenticated')), + 'Should not show success message for IAM connection' + ) + }) + + it('should show success message for SSO connection reauthentication', async function () { + const reauthCommand = registerCommandStub + .getCalls() + .find((call) => call.args[0] === 'aws.smus.reauthenticate') + + assert.ok(reauthCommand) + + const mockSsoConnection = { + id: 'test-sso-connection', + type: 'sso', + startUrl: 'https://identitycenter.amazonaws.com/ssoins-testInstanceId', + ssoRegion: 'us-east-1', + scopes: ['datazone:domain:access'], + label: 'Test SSO Connection', + } as any + + // Stub isSmusIamConnection to return false for SSO connection + sinon.stub(model, 'isSmusIamConnection').returns(false) + + // Mock the return value to indicate SSO connection (returns connection object) + mockSmusAuthProvider.reauthenticate.resolves(mockSsoConnection) + + const testWindow = getTestWindow() + + // Execute the command handler + await reauthCommand.args[1](mockSsoConnection) + + assert.ok(mockSmusAuthProvider.reauthenticate.calledWith(mockSsoConnection)) + assert.ok(mockTreeDataProvider.refresh.called) + + // Check that an information message was shown for SSO + const infoMessages = testWindow.shownMessages.filter( + (msg) => msg.severity === SeverityLevel.Information + ) + assert.ok(infoMessages.length > 0, 'Should show information message for SSO') + assert.ok( + infoMessages.some((msg) => msg.message.includes('Successfully reauthenticated')), + 'Should show success message for SSO connection' + ) }) it('should handle aws.smus.refreshProject command', async function () { diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts new file mode 100644 index 00000000000..9aadf68d443 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy.test.ts @@ -0,0 +1,185 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import * as sinon from 'sinon' +import * as vscode from 'vscode' +import { createFederatedConnectionNode } from '../../../../sagemakerunifiedstudio/explorer/nodes/federatedConnectionStrategy' +import { GlueClient, ListEntitiesCommand, DescribeEntityCommand } from '@aws-sdk/client-glue' +import { ConnectionCredentialsProvider } from '../../../../sagemakerunifiedstudio/auth/providers/connectionCredentialsProvider' + +describe('FederatedConnectionStrategy', function () { + let sandbox: sinon.SinonSandbox + let mockGlueClient: sinon.SinonStubbedInstance + let mockCredentialsProvider: ConnectionCredentialsProvider + + const mockConnection = { + connectionId: 'federated-conn-123', + name: 'test-federated-connection', + glueConnectionName: 'test-glue-connection', + } + + beforeEach(function () { + sandbox = sinon.createSandbox() + + mockCredentialsProvider = { + getCredentials: sandbox.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + }), + logger: {} as any, + smusAuthProvider: {} as any, + connectionId: 'test-connection', + projectId: 'test-project', + } as any + + mockGlueClient = sandbox.createStubInstance(GlueClient) + sandbox.stub(GlueClient.prototype, 'send').callsFake(mockGlueClient.send) + }) + + afterEach(function () { + sandbox.restore() + }) + + describe('createFederatedConnectionNode', function () { + it('should create connection node with correct properties', async function () { + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + assert.strictEqual(node.id, 'federated-federated-conn-123') + assert.strictEqual(node.resource, mockConnection) + + const treeItem = await node.getTreeItem() + assert.strictEqual(treeItem.label, 'test-federated-connection') + assert.strictEqual(treeItem.contextValue, 'federatedConnection') + assert.strictEqual(treeItem.collapsibleState, vscode.TreeItemCollapsibleState.Collapsed) + }) + + it('should return error when no glue connection name', async function () { + const connectionWithoutGlue = { ...mockConnection, glueConnectionName: undefined } + + const node = await createFederatedConnectionNode( + connectionWithoutGlue as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + assert.ok(children[0].id.includes('error')) + }) + + it('should return placeholder when no entities found', async function () { + mockGlueClient.send.resolves({ Entities: [] }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + assert.strictEqual(children[0].resource, '[No data found]') + }) + + it('should group tables under Tables container', async function () { + mockGlueClient.send.resolves({ + Entities: [ + { EntityName: 'table1', Category: 'TABLE', Label: 'Table 1' }, + { EntityName: 'table2', Category: 'TABLE', Label: 'Table 2' }, + ], + }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + + const tablesContainer = children[0] + assert.ok(tablesContainer.id.includes('tables')) + + const tableChildren = await tablesContainer.getChildren!() + assert.strictEqual(tableChildren.length, 2) + }) + + it('should handle mixed entity types correctly', async function () { + mockGlueClient.send.resolves({ + Entities: [ + { EntityName: 'schema1', Category: 'SCHEMA', Label: 'Schema 1' }, + { EntityName: 'table1', Category: 'TABLE', Label: 'Table 1' }, + ], + }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 2) // schema + tables container + }) + + it('should handle table columns', async function () { + const mockEntity = { EntityName: 'test-table', Category: 'TABLE' } + + mockGlueClient.send.callsFake((command) => { + if (command instanceof DescribeEntityCommand) { + return Promise.resolve({ + Fields: [ + { FieldName: 'col1', FieldType: 'string', Label: 'Column 1' }, + { FieldName: 'col2', FieldType: 'int', Label: 'Column 2' }, + ], + }) + } + if (command instanceof ListEntitiesCommand) { + return Promise.resolve({ + Entities: [mockEntity], + }) + } + return Promise.resolve({}) + }) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + const tablesContainer = children[0] + const tableNodes = await tablesContainer.getChildren!() + const tableNode = tableNodes[0] + + const columns = await tableNode.getChildren!() + assert.strictEqual(columns.length, 2) + + const columnTreeItem = await columns[0].getTreeItem() + assert.strictEqual(columnTreeItem.description, 'string') + }) + + it('should handle API errors gracefully', async function () { + mockGlueClient.send.rejects(new Error('API Error')) + + const node = await createFederatedConnectionNode( + mockConnection as any, + mockCredentialsProvider, + 'us-east-1' + ) + + const children = await node.getChildren!() + assert.strictEqual(children.length, 1) + assert.ok(children[0].id.includes('error')) + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts index 435397885df..f1350ef9cec 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts @@ -91,8 +91,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = mockConnection }) - it('should return connected tree item', function () { - const treeItem = authInfoNode.getTreeItem() + it('should return connected tree item', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Domain: dzd_domainId') assert.strictEqual(treeItem.description, 'us-east-2') @@ -122,8 +122,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = mockConnection }) - it('should return expired tree item with reauthenticate command', function () { - const treeItem = authInfoNode.getTreeItem() + it('should return expired tree item with reauthenticate command', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Domain: dzd_domainId (Expired) - Click to reauthenticate') assert.strictEqual(treeItem.description, 'us-east-2') @@ -153,8 +153,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = undefined }) - it('should return not connected tree item', function () { - const treeItem = authInfoNode.getTreeItem() + it('should return not connected tree item', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Not Connected') assert.strictEqual(treeItem.description, undefined) @@ -187,8 +187,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { mockAuthProvider.activeConnection = incompleteConnection }) - it('should handle missing domain ID and region gracefully', function () { - const treeItem = authInfoNode.getTreeItem() + it('should handle missing domain ID and region gracefully', async function () { + const treeItem = await authInfoNode.getTreeItem() assert.strictEqual(treeItem.label, 'Domain: Unknown') assert.strictEqual(treeItem.description, 'Unknown') @@ -231,32 +231,32 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { }) describe('theme icon colors', function () { - it('should use green color for connected state', function () { + it('should use green color for connected state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(true) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const icon = treeItem.iconPath as vscode.ThemeIcon assert.ok(icon.color instanceof vscode.ThemeColor) assert.strictEqual((icon.color as any).id, 'charts.green') }) - it('should use yellow color for expired state', function () { + it('should use yellow color for expired state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const icon = treeItem.iconPath as vscode.ThemeIcon assert.ok(icon.color instanceof vscode.ThemeColor) assert.strictEqual((icon.color as any).id, 'charts.yellow') }) - it('should use red color for not connected state', function () { + it('should use red color for not connected state', async function () { mockAuthProvider.isConnected.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const icon = treeItem.iconPath as vscode.ThemeIcon assert.ok(icon.color instanceof vscode.ThemeColor) @@ -265,11 +265,11 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { }) describe('tooltip content', function () { - it('should include all relevant information for connected state', function () { + it('should include all relevant information for connected state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(true) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const tooltip = treeItem.tooltip as string assert.ok(tooltip.includes('Connected to SageMaker Unified Studio')) @@ -278,21 +278,21 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { assert.ok(tooltip.includes('Status: Connected')) }) - it('should include expiration information for expired state', function () { + it('should include expiration information for expired state', async function () { mockAuthProvider.isConnected.returns(true) mockAuthProvider.isConnectionValid.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const tooltip = treeItem.tooltip as string assert.ok(tooltip.includes('Connection to SageMaker Unified Studio has expired')) assert.ok(tooltip.includes('Status: Expired - Click to reauthenticate')) }) - it('should include sign-in prompt for not connected state', function () { + it('should include sign-in prompt for not connected state', async function () { mockAuthProvider.isConnected.returns(false) - const treeItem = authInfoNode.getTreeItem() + const treeItem = await authInfoNode.getTreeItem() const tooltip = treeItem.tooltip as string assert.ok(tooltip.includes('Not connected to SageMaker Unified Studio')) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts index fc74eeab435..137df4fafaf 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioComputeNode.test.ts @@ -11,6 +11,7 @@ import { SageMakerUnifiedStudioProjectNode } from '../../../../sagemakerunifieds import { SageMakerUnifiedStudioSpacesParentNode } from '../../../../sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode' import { SagemakerClient } from '../../../../shared/clients/sagemaker' import { SmusAuthenticationProvider } from '../../../../sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider' +import * as setContext from '../../../../shared/vscode/setContext' describe('SageMakerUnifiedStudioComputeNode', function () { let computeNode: SageMakerUnifiedStudioComputeNode @@ -71,10 +72,13 @@ describe('SageMakerUnifiedStudioComputeNode', function () { assert.deepStrictEqual(children, []) }) - it('returns connection nodes and spaces node when project is selected', async function () { + it('returns connection nodes and spaces node when project is selected (non-express mode)', async function () { const mockProject = { id: 'project-123', name: 'Test Project' } ;(mockParent.getProject as sinon.SinonStub).returns(mockProject) + // Mock express mode to be false + sinon.stub(setContext, 'getContext').returns(false) + const children = await computeNode.getChildren() assert.strictEqual(children.length, 3) @@ -82,6 +86,19 @@ describe('SageMakerUnifiedStudioComputeNode', function () { assert.strictEqual(children[1].id, 'Data processing') assert.ok(children[2] instanceof SageMakerUnifiedStudioSpacesParentNode) }) + + it('returns only spaces node when project is selected (express mode)', async function () { + const mockProject = { id: 'project-123', name: 'Test Project' } + ;(mockParent.getProject as sinon.SinonStub).returns(mockProject) + + // Mock express mode to be true + sinon.stub(setContext, 'getContext').returns(true) + + const children = await computeNode.getChildren() + + assert.strictEqual(children.length, 1) + assert.ok(children[0] instanceof SageMakerUnifiedStudioSpacesParentNode) + }) }) describe('getParent', function () { diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts index 686c85a0055..18778c52664 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioConnectionParentNode.test.ts @@ -50,14 +50,24 @@ describe('SageMakerUnifiedStudioConnectionParentNode', function () { } as any mockComputeNode = { - authProvider: {} as any, + authProvider: { + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + getDomainId: sinon.stub().returns('domain-123'), + getDomainRegion: sinon.stub().returns('us-east-1'), + } as any, parent: { project: mockProject, } as any, } as any // Stub static methods - sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').resolves(mockDataZoneClient as any) sinon.stub(getLogger(), 'debug') connectionParentNode = new SageMakerUnifiedStudioConnectionParentNode( @@ -135,7 +145,17 @@ describe('SageMakerUnifiedStudioConnectionParentNode', function () { it('handles missing project information gracefully', async function () { const nodeWithoutProject = new SageMakerUnifiedStudioConnectionParentNode( { - authProvider: {} as any, + authProvider: { + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + getDomainId: sinon.stub().returns('domain-123'), + getDomainRegion: sinon.stub().returns('us-east-1'), + } as any, parent: { project: undefined, } as any, @@ -164,7 +184,7 @@ describe('SageMakerUnifiedStudioConnectionParentNode', function () { describe('error handling', function () { it('handles DataZoneClient.getInstance error', async function () { sinon.restore() - sinon.stub(DataZoneClient, 'getInstance').rejects(new Error('Client error')) + sinon.stub(DataZoneClient, 'createWithCredentials').rejects(new Error('Client error')) sinon.stub(getLogger(), 'debug') try { diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts index 991e5955989..171564c61c3 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioDataNode.test.ts @@ -13,6 +13,7 @@ import { SmusAuthenticationProvider } from '../../../../sagemakerunifiedstudio/a import * as s3Strategy from '../../../../sagemakerunifiedstudio/explorer/nodes/s3Strategy' import * as redshiftStrategy from '../../../../sagemakerunifiedstudio/explorer/nodes/redshiftStrategy' import * as lakehouseStrategy from '../../../../sagemakerunifiedstudio/explorer/nodes/lakehouseStrategy' +import * as setContext from '../../../../shared/vscode/setContext' describe('SageMakerUnifiedStudioDataNode', function () { let sandbox: sinon.SinonSandbox @@ -50,6 +51,14 @@ describe('SageMakerUnifiedStudioDataNode', function () { getProjectCredentialProvider: sandbox.stub().resolves(mockProjectCredentialProvider), getConnectionCredentialsProvider: sandbox.stub().resolves(mockProjectCredentialProvider), getDomainRegion: sandbox.stub().returns('us-east-1'), + getDomainId: sandbox.stub().returns('domain-123'), + getDerCredentialsProvider: sandbox.stub().resolves({ + getCredentials: sandbox.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any mockDataZoneClient = { @@ -60,7 +69,7 @@ describe('SageMakerUnifiedStudioDataNode', function () { getRegion: sandbox.stub().returns('us-east-1'), } as any - sandbox.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sandbox.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) sandbox.stub(SmusAuthenticationProvider, 'fromContext').returns(mockAuthProvider as any) sandbox.stub(s3Strategy, 'createS3ConnectionNode').returns({ id: 's3-node', @@ -161,6 +170,9 @@ describe('SageMakerUnifiedStudioDataNode', function () { { connectionId: 'redshift-conn', type: 'REDSHIFT', name: 'redshift-connection' }, ] + // Mock express mode to be false so Redshift connections are included + sandbox.stub(setContext, 'getContext').returns(false) + mockDataZoneClient.listConnections.resolves(mockConnections as any) mockDataZoneClient.getConnection .onFirstCall() @@ -209,7 +221,6 @@ describe('SageMakerUnifiedStudioDataNode', function () { const mockConnections = [{ connectionId: 's3-conn', type: 'S3', name: 's3-connection' }] mockDataZoneClient.listConnections.resolves(mockConnections as any) - mockDataZoneClient.getConnection.rejects(new Error('Connection error')) const children = await dataNode.getChildren() @@ -217,6 +228,9 @@ describe('SageMakerUnifiedStudioDataNode', function () { assert.strictEqual(children.length, 1) assert.strictEqual(children[0].id, 'bucket-parent') + // Mock connection credentials provider to reject when bucket is expanded + mockAuthProvider.getConnectionCredentialsProvider.rejects(new Error('Connection error')) + // Error should occur when expanding the Bucket node const bucketChildren = await children[0].getChildren!() assert.strictEqual(bucketChildren.length, 1) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts index 2fd8317fe06..908e869dff7 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioProjectNode.test.ts @@ -38,6 +38,14 @@ describe('SageMakerUnifiedStudioProjectNode', function () { getProjectCredentialProvider: sinon.stub(), getDomainRegion: sinon.stub().returns('us-west-2'), getDomainAccountId: sinon.stub().resolves('123456789012'), + getDomainId: sinon.stub().returns('test-domain'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any // Create mock extension context @@ -63,7 +71,7 @@ describe('SageMakerUnifiedStudioProjectNode', function () { } as any // Stub DataZoneClient static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) // Stub SagemakerClient constructor sinon.stub(SagemakerClient.prototype, 'dispose') diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts index 4c0cad57366..1b9ca657d34 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts @@ -81,7 +81,7 @@ describe('SmusRootNode', function () { } as any // Stub DataZoneClient static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) }) afterEach(function () { @@ -271,7 +271,7 @@ describe('SelectSMUSProject', function () { } as any // Stub DataZoneClient static methods - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) // Stub SmusAuthenticationProvider sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ @@ -281,6 +281,13 @@ describe('SelectSMUSProject', function () { getDomainAccountId: sinon.stub().resolves('123456789012'), getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns('us-west-2'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any) // Stub quickPick - return the project directly (not wrapped in an item) @@ -458,12 +465,19 @@ describe('selectSMUSProject - Additional Tests', function () { setProject: sinon.stub(), } as any - sinon.stub(DataZoneClient, 'getInstance').returns(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ activeConnection: { domainId: testDomainId, ssoRegion: 'us-west-2' }, getDomainAccountId: sinon.stub().resolves('123456789012'), getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns('us-west-2'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any) const mockQuickPick = { diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts index 31481e70953..bac76fa094c 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts @@ -30,6 +30,15 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { } as any mockAuthProvider = { activeConnection: { domainId: 'test-domain', ssoRegion: 'us-west-2' }, + getDomainId: sinon.stub().returns('test-domain'), + getDomainRegion: sinon.stub().returns('us-west-2'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any mockSagemakerClient = sinon.createStubInstance(SagemakerClient) mockSagemakerClient.fetchSpaceAppsAndDomains.resolves([new Map(), new Map()]) @@ -44,7 +53,7 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { getToolingEnvironment: sinon.stub(), } as any - sinon.stub(DataZoneClient, 'getInstance').resolves(mockDataZoneClient as any) + sinon.stub(DataZoneClient, 'createWithCredentials').resolves(mockDataZoneClient as any) sinon.stub(getLogger(), 'debug') sinon.stub(getLogger(), 'error') sinon.stub(SmusUtils, 'extractSSOIdFromUserId').returns('user-12345') @@ -154,7 +163,7 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { }) it('throws error when DataZone client not initialized', async function () { - ;(DataZoneClient.getInstance as sinon.SinonStub).resolves(undefined) + ;(DataZoneClient.createWithCredentials as sinon.SinonStub).resolves(undefined) await assert.rejects( async () => await spacesNode.getSageMakerDomainId(), diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts index 988f360eaf7..bc756ed17ea 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneClient.test.ts @@ -46,40 +46,50 @@ describe('DataZoneClient', () => { getCredentialsProviderForIamProfile: sinon.stub(), } as any - // Set up the DataZoneClient using getInstance since constructor is private - DataZoneClient.dispose() - dataZoneClient = await DataZoneClient.getInstance(mockAuthProvider) + // Create mock credentials provider + const mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + getCredentialsId: () => ({ credentialSource: 'temp' as const, credentialTypeId: 'test' }), + getProviderType: () => 'temp' as const, + getTelemetryType: () => 'other' as any, + getDefaultRegion: () => testRegion, + getHashCode: () => 'test-hash', + canAutoConnect: () => Promise.resolve(false), + isAvailable: () => Promise.resolve(true), + } + + // Set up the DataZoneClient using createWithCredentials + dataZoneClient = DataZoneClient.createWithCredentials(testRegion, testDomainId, mockCredentialsProvider) }) afterEach(() => { sinon.restore() }) - describe('getInstance', () => { - it('should return singleton instance', async () => { - const instance1 = await DataZoneClient.getInstance(mockAuthProvider) - const instance2 = await DataZoneClient.getInstance(mockAuthProvider) - - assert.strictEqual(instance1, instance2) - }) - - it('should create new instance after dispose', async () => { - const instance1 = await DataZoneClient.getInstance(mockAuthProvider) - DataZoneClient.dispose() - const instance2 = await DataZoneClient.getInstance(mockAuthProvider) - - assert.notStrictEqual(instance1, instance2) - }) - }) - - describe('dispose', () => { - it('should clear singleton instance', async () => { - const instance = await DataZoneClient.getInstance(mockAuthProvider) - DataZoneClient.dispose() + describe('createWithCredentials', () => { + it('should create new instance with credentials', () => { + const mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + }), + getCredentialsId: () => ({ credentialSource: 'temp' as const, credentialTypeId: 'test' }), + getProviderType: () => 'temp' as const, + getTelemetryType: () => 'other' as any, + getDefaultRegion: () => testRegion, + getHashCode: () => 'test-hash', + canAutoConnect: () => Promise.resolve(false), + isAvailable: () => Promise.resolve(true), + } - // Should create new instance after dispose - const newInstance = await DataZoneClient.getInstance(mockAuthProvider) - assert.notStrictEqual(instance, newInstance) + const instance = DataZoneClient.createWithCredentials(testRegion, testDomainId, mockCredentialsProvider) + assert.ok(instance) + assert.strictEqual(instance.getRegion(), testRegion) + assert.strictEqual(instance.getDomainId(), testDomainId) }) }) @@ -164,6 +174,9 @@ describe('DataZoneClient', () => { getEnvironmentCredentials: sinon.stub().resolves(mockCredentials), } + // Mock getToolingBlueprintName to return 'Tooling' + sinon.stub(dataZoneClient as any, 'getToolingBlueprintName').returns('Tooling') + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) const result = await dataZoneClient.getProjectDefaultEnvironmentCreds('project-1') @@ -228,9 +241,7 @@ describe('DataZoneClient', () => { describe('fetchAllProjects', function () { it('fetches all projects by handling pagination', async function () { - const client = await DataZoneClient.getInstance(mockAuthProvider) - - // Create a stub for listProjects that returns paginated results + // Create a stub for listProjects that returns paginated resultssults const listProjectsStub = sinon.stub() // First call returns first page with nextToken @@ -260,10 +271,10 @@ describe('DataZoneClient', () => { }) // Replace the listProjects method with our stub - client.listProjects = listProjectsStub + dataZoneClient.listProjects = listProjectsStub // Call fetchAllProjects - const result = await client.fetchAllProjects() + const result = await dataZoneClient.fetchAllProjects() // Verify results assert.strictEqual(result.length, 2) @@ -283,8 +294,6 @@ describe('DataZoneClient', () => { }) it('returns empty array when no projects found', async function () { - const client = await DataZoneClient.getInstance(mockAuthProvider) - // Create a stub for listProjects that returns empty results const listProjectsStub = sinon.stub().resolves({ projects: [], @@ -292,10 +301,10 @@ describe('DataZoneClient', () => { }) // Replace the listProjects method with our stub - client.listProjects = listProjectsStub + dataZoneClient.listProjects = listProjectsStub // Call fetchAllProjects - const result = await client.fetchAllProjects() + const result = await dataZoneClient.fetchAllProjects() // Verify results assert.strictEqual(result.length, 0) @@ -303,16 +312,14 @@ describe('DataZoneClient', () => { }) it('handles errors gracefully', async function () { - const client = await DataZoneClient.getInstance(mockAuthProvider) - // Create a stub for listProjects that throws an error const listProjectsStub = sinon.stub().rejects(new Error('API error')) // Replace the listProjects method with our stub - client.listProjects = listProjectsStub + dataZoneClient.listProjects = listProjectsStub // Call fetchAllProjects and expect it to throw - await assert.rejects(() => client.fetchAllProjects(), /API error/) + await assert.rejects(() => dataZoneClient.fetchAllProjects(), /API error/) }) }) @@ -327,6 +334,9 @@ describe('DataZoneClient', () => { }), } + // Mock getToolingBlueprintName to return 'Tooling' + sinon.stub(dataZoneClient as any, 'getToolingBlueprintName').returns('Tooling') + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) const result = await dataZoneClient.getToolingEnvironmentId('domain-1', 'project-1') @@ -387,6 +397,9 @@ describe('DataZoneClient', () => { getEnvironment: sinon.stub().resolves(mockEnvironment), } + // Mock getToolingBlueprintName to return 'Tooling' + sinon.stub(dataZoneClient as any, 'getToolingBlueprintName').returns('Tooling') + sinon.stub(dataZoneClient as any, 'getDataZoneClient').resolves(mockDataZone) const result = await dataZoneClient.getToolingEnvironment('project-123') @@ -408,7 +421,7 @@ describe('DataZoneClient', () => { await assert.rejects( () => dataZoneClient.getToolingEnvironment('project-123'), - /Failed to get tooling environment ID: No default Tooling environment found for project/ + /No default Tooling environment found for project/ ) }) @@ -518,7 +531,7 @@ describe('DataZoneClient', () => { stsClientStub = sinon.stub(DefaultStsClient.prototype, 'getCallerIdentity') // Stub SmusUtils method - convertAssumedRoleArnStub = sinon.stub(SmusUtils, 'convertAssumedRoleArnToIamRoleArn') + convertAssumedRoleArnStub = sinon.stub(SmusUtils as any, 'convertAssumedRoleArnToIamRoleArn') }) afterEach(() => { @@ -552,7 +565,6 @@ describe('DataZoneClient', () => { assert.strictEqual(result, mockUserProfileId) // Verify the flow - assert.ok(mockAuthProvider.getCredentialsProviderForIamProfile.calledWith('test-profile')) assert.ok(stsClientStub.calledOnce) assert.ok(convertAssumedRoleArnStub.calledWith(mockStsResponse.Arn)) assert.ok( diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts index 59051dad115..a036adb9b7e 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts @@ -342,4 +342,126 @@ describe('DataZoneDomainPreferencesClient', () => { await assert.rejects(() => client.getExpressDomain(), /Failed to get domain info: API error/) }) }) + + describe('getDomain', () => { + it('should get domain by ID successfully', async () => { + const mockDomainId = 'dzd_test123' + const mockResponse = { + id: mockDomainId, + name: 'Test Domain', + description: 'A test domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + portalUrl: 'https://test.datazone.aws', + createdAt: '2023-01-01T00:00:00Z', + lastUpdatedAt: '2023-01-02T00:00:00Z', + domainVersion: '1.0', + preferences: { DOMAIN_MODE: 'EXPRESS' }, + } + const mockDataZoneClient = { + getDomain: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) + + const result = await client.getDomain(mockDomainId) + + assert.strictEqual(result.id, mockDomainId) + assert.strictEqual(result.name, 'Test Domain') + assert.strictEqual(result.description, 'A test domain') + assert.strictEqual(result.arn, `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`) + assert.strictEqual(result.status, 'AVAILABLE') + assert.strictEqual(result.portalUrl, 'https://test.datazone.aws') + assert.strictEqual(result.domainVersion, '1.0') + assert.deepStrictEqual(result.preferences, { DOMAIN_MODE: 'EXPRESS' }) + + // Verify the API was called with correct parameters + assert.ok(mockDataZoneClient.getDomain.calledOnce) + assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { + identifier: mockDomainId, + }) + }) + + it('should handle API errors when getting domain', async () => { + const mockDomainId = 'dzd_test123' + const error = new Error('Domain not found') + + const mockDataZoneClient = { + getDomain: sinon.stub().returns({ + promise: () => Promise.reject(error), + }), + } + + sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) + + await assert.rejects(() => client.getDomain(mockDomainId), error) + + // Verify the API was called with correct parameters + assert.ok(mockDataZoneClient.getDomain.calledOnce) + assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { + identifier: mockDomainId, + }) + }) + }) + + describe('isExpressDomain', () => { + it('should return true for EXPRESS domain', async () => { + const mockDomainId = 'dzd_express123' + const mockResponse = { + id: mockDomainId, + name: 'Express Domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'EXPRESS' }, + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, true) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + + it('should return false for STANDARD domain', async () => { + const mockDomainId = 'dzd_standard123' + const mockResponse = { + id: mockDomainId, + name: 'Standard Domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'STANDARD' }, + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, false) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + + it('should return false for domain without preferences', async () => { + const mockDomainId = 'dzd_no_prefs123' + const mockResponse = { + id: mockDomainId, + name: 'Domain Without Preferences', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + // No preferences field + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, false) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts index 6fed8ae713f..65dc98f415a 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts @@ -463,6 +463,71 @@ describe('SmusUtils', () => { }) }) + describe('isInSmusExpressMode', () => { + let mockCredentialsProvider: any + let mockDomainPreferencesClient: any + let getInstanceStub: sinon.SinonStub + + const testDomainId = 'dzd_test123' + const testRegion = 'us-east-1' + + beforeEach(() => { + // Mock credentials provider + mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + getCredentialsId: sinon.stub().returns({ credentialSource: 'test', credentialTypeId: 'test' }), + getProviderType: sinon.stub().returns('test'), + getTelemetryType: sinon.stub().returns('other'), + getDefaultRegion: sinon.stub().returns(testRegion), + getHashCode: sinon.stub().returns('test-hash'), + canAutoConnect: sinon.stub().resolves(false), + isAvailable: sinon.stub().resolves(true), + } + + // Mock DataZoneDomainPreferencesClient + mockDomainPreferencesClient = { + isExpressDomain: sinon.stub(), + } + + // Stub the getInstance method + getInstanceStub = sinon + .stub( + require('../../../sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient') + .DataZoneDomainPreferencesClient, + 'getInstance' + ) + .returns(mockDomainPreferencesClient) + }) + + afterEach(() => { + sinon.restore() + }) + + it('should return true when domain is in Express mode', async () => { + mockDomainPreferencesClient.isExpressDomain.resolves(true) + + const result = await SmusUtils.isInSmusExpressMode(testDomainId, testRegion, mockCredentialsProvider) + + assert.strictEqual(result, true) + assert.ok(getInstanceStub.calledWith(mockCredentialsProvider, testRegion)) + assert.ok(mockDomainPreferencesClient.isExpressDomain.calledWith(testDomainId)) + }) + + it('should return false when domain is not in Express mode', async () => { + mockDomainPreferencesClient.isExpressDomain.resolves(false) + + const result = await SmusUtils.isInSmusExpressMode(testDomainId, testRegion, mockCredentialsProvider) + + assert.strictEqual(result, false) + assert.ok(getInstanceStub.calledWith(mockCredentialsProvider, testRegion)) + assert.ok(mockDomainPreferencesClient.isExpressDomain.calledWith(testDomainId)) + }) + }) + describe('convertAssumedRoleArnToIamRoleArn', () => { it('should convert basic assumed role ARN to IAM role ARN', () => { const stsArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/MySession' @@ -472,6 +537,58 @@ describe('SmusUtils', () => { assert.strictEqual(result, expected) }) + it('should convert assumed role ARN with aws-cn partition', () => { + const stsArn = 'arn:aws-cn:sts::123456789012:assumed-role/MyRole/MySession' + const expected = 'arn:aws-cn:iam::123456789012:role/MyRole' + + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(stsArn) + assert.strictEqual(result, expected) + }) + + it('should convert assumed role ARN with aws-us-gov partition', () => { + const stsArn = 'arn:aws-us-gov:sts::123456789012:assumed-role/MyRole/MySession' + const expected = 'arn:aws-us-gov:iam::123456789012:role/MyRole' + + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(stsArn) + assert.strictEqual(result, expected) + }) + + it('should return IAM user ARN as-is', () => { + const iamUserArn = 'arn:aws:iam::619071339486:user/vabharga-test' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + + it('should return IAM user ARN with aws-cn partition as-is', () => { + const iamUserArn = 'arn:aws-cn:iam::123456789012:user/my-user' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + + it('should return IAM user ARN with aws-us-gov partition as-is', () => { + const iamUserArn = 'arn:aws-us-gov:iam::123456789012:user/my-user' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + + it('should return IAM role ARN as-is', () => { + const iamRoleArn = 'arn:aws:iam::123456789012:role/MyRole' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamRoleArn) + assert.strictEqual(result, iamRoleArn) + }) + + it('should return IAM role ARN with aws-cn partition as-is', () => { + const iamRoleArn = 'arn:aws-cn:iam::123456789012:role/MyRole' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamRoleArn) + assert.strictEqual(result, iamRoleArn) + }) + + it('should handle IAM user ARN with special characters', () => { + const iamUserArn = 'arn:aws:iam::123456789012:user/path/to/user-name_123' + const result = SmusUtils.convertAssumedRoleArnToIamRoleArn(iamUserArn) + assert.strictEqual(result, iamUserArn) + }) + it('should throw error for invalid ARN format - missing components', () => { const invalidArn = 'arn:aws:sts::123456789012:assumed-role/MyRole' diff --git a/packages/core/src/test/shared/clients/sagemakerClient.test.ts b/packages/core/src/test/shared/clients/sagemakerClient.test.ts index ecd60af5ad1..379cce02d3a 100644 --- a/packages/core/src/test/shared/clients/sagemakerClient.test.ts +++ b/packages/core/src/test/shared/clients/sagemakerClient.test.ts @@ -360,6 +360,7 @@ describe('SagemakerClient.startSpace', function () { getTestWindow().getFirstMessage().selectItem('Yes') await promise + sinon.assert.calledOnce(updateSpaceStub) sinon.assert.calledOnce(createAppStub) }) diff --git a/packages/toolkit/.changes/3.79.0.json b/packages/toolkit/.changes/3.79.0.json new file mode 100644 index 00000000000..ce9c5531853 --- /dev/null +++ b/packages/toolkit/.changes/3.79.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-10", + "version": "3.79.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/3.80.0.json b/packages/toolkit/.changes/3.80.0.json new file mode 100644 index 00000000000..4db49741fa7 --- /dev/null +++ b/packages/toolkit/.changes/3.80.0.json @@ -0,0 +1,10 @@ +{ + "date": "2025-10-16", + "version": "3.80.0", + "entries": [ + { + "type": "Bug Fix", + "description": "The space is updated upon creation of a new app with the requested settings" + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index 6def23f3765..868a46a01a4 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.80.0 2025-10-16 + +- **Bug Fix** The space is updated upon creation of a new app with the requested settings + +## 3.79.0 2025-10-10 + +- Miscellaneous non-user-facing changes + ## 3.78.0 2025-10-02 - **Feature** Refactor and optimize Lambda Remote Invoke UI with enhanced payload management diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index feb4d32a98d..f07d6203d98 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -2,7 +2,7 @@ "name": "aws-toolkit-vscode", "displayName": "AWS Toolkit", "description": "Including CodeCatalyst, Infrastructure Composer, and support for Lambda, S3, CloudWatch Logs, CloudFormation, and many other services.", - "version": "3.79.0-SNAPSHOT", + "version": "3.81.0-SNAPSHOT", "extensionKind": [ "workspace" ], From 732f08720430306902ec900685a365b9ea5a01cc Mon Sep 17 00:00:00 2001 From: Bhargav Date: Fri, 24 Oct 2025 10:14:18 -0700 Subject: [PATCH 18/53] fix(smsus): Scrub profile names from log events (#2266) **Description** We noticed some profile names were getting logged in telemetry during testing. This change should redact those as for customers it can be PII. **Testing Done** Unit tests and tested manually to trigger a failure scenario and validated the telemetry event does not have the profile name --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- packages/core/src/shared/errors.ts | 5 +++ packages/core/src/test/shared/errors.test.ts | 43 ++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/packages/core/src/shared/errors.ts b/packages/core/src/shared/errors.ts index 5d114043be3..5564610c1f6 100644 --- a/packages/core/src/shared/errors.ts +++ b/packages/core/src/shared/errors.ts @@ -375,6 +375,7 @@ export function getTelemetryResult(error: unknown | undefined): Result { * Examples: * - "Failed to save c:/fooß/bar/baz.txt" => "Failed to save c:/xß/x/x.txt" * - "EPERM for dir c:/Users/user1/.aws/sso/cache/abc123.json" => "EPERM for dir c:/Users/x/.aws/sso/cache/x.json" + * - "Error with profile my-profile" => "Error with profile [REDACTED]" */ export function scrubNames(s: string, username?: string) { let r = '' @@ -405,6 +406,10 @@ export function scrubNames(s: string, username?: string) { s = s.replaceAll(username, 'x') } + // Remove profile names that might appear in error messages + // Matches "profile" followed by optional punctuation and the profile name + s = s.replace(/(profile)\s*[:'"]?\s*([\w-]+)['"']?/gi, '$1 [REDACTED]') + // Replace contiguous whitespace with 1 space. s = s.replace(/\s+/g, ' ') diff --git a/packages/core/src/test/shared/errors.test.ts b/packages/core/src/test/shared/errors.test.ts index 32d18186912..093feceb012 100644 --- a/packages/core/src/test/shared/errors.test.ts +++ b/packages/core/src/test/shared/errors.test.ts @@ -683,6 +683,49 @@ describe('util', function () { assert.deepStrictEqual(scrubNames('unix ~jdoe123/.aws/config failed', fakeUser), 'unix ~x/.aws/config failed') assert.deepStrictEqual(scrubNames('unix ../../.aws/config failed', fakeUser), 'unix ../../.aws/config failed') assert.deepStrictEqual(scrubNames('unix ~/.aws/config failed', fakeUser), 'unix ~/.aws/config failed') + + // Profile name scrubbing - tests all three patterns + + // Pattern 1: profile name with space separator + const profileTest1 = scrubNames('Error with profile my-profile', fakeUser) + assert.deepStrictEqual(profileTest1, 'Error with profile [REDACTED]', 'Should handle space-separated profile') + assert.ok(!profileTest1.includes('my-profile'), 'Original profile name should not appear') + + // Pattern 2: profile name with single quotes + const profileTest2 = scrubNames("Failed to load profile 'production-admin'", fakeUser) + assert.deepStrictEqual(profileTest2, 'Failed to load profile [REDACTED]', 'Should handle single-quoted profile') + assert.ok(!profileTest2.includes('production-admin'), 'Original profile name should not appear') + assert.ok(!profileTest2.includes("'"), 'Closing quote should be removed') + + // Pattern 2: profile name with double quotes + const profileTest3 = scrubNames('Using profile "staging-env" for authentication', fakeUser) + assert.deepStrictEqual( + profileTest3, + 'Using profile [REDACTED] for authentication', + 'Should handle double-quoted profile' + ) + assert.ok(!profileTest3.includes('staging-env'), 'Original profile name should not appear') + assert.ok(!profileTest3.includes('"'), 'Closing quote should be removed') + + // Pattern 3: profile name with colon separator + const profileTest4 = scrubNames('Profile: dev-account not found', fakeUser) + assert.deepStrictEqual(profileTest4, 'Profile [REDACTED] not found', 'Should handle colon-separated profile') + assert.ok(!profileTest4.includes('dev-account'), 'Original profile name should not appear') + + // Case preservation tests + const profileTest5 = scrubNames('PROFILE: admin-user failed', fakeUser) + assert.deepStrictEqual(profileTest5, 'PROFILE [REDACTED] failed', 'Should preserve uppercase PROFILE') + + const profileTest6 = scrubNames("Profile 'test-123' is invalid", fakeUser) + assert.deepStrictEqual(profileTest6, 'Profile [REDACTED] is invalid', 'Should preserve capitalized Profile') + + // Multiple profiles in one message + const profileTest7 = scrubNames("Switching from profile 'old-profile' to profile 'new-profile'", fakeUser) + assert.ok( + !profileTest7.includes('old-profile') && !profileTest7.includes('new-profile'), + 'Should redact multiple profiles' + ) + assert.ok(profileTest7.includes('[REDACTED]'), 'Should contain redaction markers') }) }) From 56d3b91e61e27df478382db280c6e3efe42f487d Mon Sep 17 00:00:00 2001 From: Bhargav Date: Tue, 28 Oct 2025 12:18:58 -0700 Subject: [PATCH 19/53] feat(smsus): Add project node and project selection for Express domains (#2269) **Description** Projects are back in express, so bringing them back. The project node and selection is what this PR expects to bring back. The actual filerting of projects will be updated in the next PR. **Motivation Project experience for reInvent. **Testing Done** Tested locally and validated project selection pops up with one project to pick from. ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../auth/authenticationOrchestrator.ts | 19 +- .../providers/smusAuthenticationProvider.ts | 7 +- .../nodes/sageMakerUnifiedStudioRootNode.ts | 27 +-- .../auth/smusAuthenticationProvider.test.ts | 22 -- .../sageMakerUnifiedStudioRootNode.test.ts | 200 +++++++++++++++++- 5 files changed, 227 insertions(+), 48 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index d85d5463bb7..15002f00a25 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -127,8 +127,23 @@ export class SmusAuthenticationOrchestrator { `SMUS Auth: Successfully connected with IAM profile ${profileSelection.profileName} in region ${profileSelection.region} to Express domain` ) - // Ask to remember authentication method preference - await this.askToRememberAuthMethod(context, 'iam') + // Refresh the tree view to show authenticated state + try { + await vscode.commands.executeCommand('aws.smus.rootView.refresh') + } catch (refreshErr) { + logger.debug(`Failed to refresh views after login: ${(refreshErr as Error).message}`) + } + + // After successful IAM authentication (Express mode), automatically open project picker + logger.debug('SMUS Auth: IAM authentication successful, opening project picker') + try { + await vscode.commands.executeCommand('aws.smus.switchProject') + } catch (pickerErr) { + logger.debug(`Failed to open project picker: ${(pickerErr as Error).message}`) + } + + // Ask to remember authentication method preference (non-blocking) + void this.askToRememberAuthMethod(context, 'iam') // Return success to complete the authentication flow gracefully return { status: 'SUCCESS' } diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index 85275398579..6bb9588891a 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -649,9 +649,10 @@ export class SmusAuthenticationProvider { `SMUS: Using existing IAM connection as SMUS connection successfully, id=${existingConn.id}` ) - // Auto-invoke project selection after successful sign-in (but not in SMUS space environment) - if (!SmusUtils.isInSmusSpaceEnvironment()) { - void vscode.commands.executeCommand('aws.smus.switchProject') + // Set Express mode context if this is an Express domain + if (isExpressDomain) { + await setSmusExpressModeContext(true) + logger.debug('SMUS: Set Express mode context to true') } // Return a SMUS IAM connection wrapper for the caller diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index f3bb03e31ea..0778b19df1c 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -136,17 +136,7 @@ export class SageMakerUnifiedStudioRootNode implements TreeNode { ] } - if (getContext('aws.smus.isExpressMode')) { - // In Express mode, immediately show auth node, and project node's children (data and compute nodes) - if (!this.projectNode.project) { - await selectSMUSProject(this.projectNode) - } - - const projectChildren = await this.projectNode.getChildren() - return [this.authInfoNode, ...projectChildren] - } - - // When authenticated, show auth info and projects + // When authenticated, show auth info and projects (same for both Express and non-Express mode) return [this.authInfoNode, this.projectNode] } @@ -475,18 +465,19 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj let selectedProject if (getContext('aws.smus.isExpressMode')) { - // In express mode, automatically select the express project - logger.debug('Auto-selecting the express project') + // Filter items to only show projects created by the current user + logger.debug('Filtering projects to show only those created by the current user') const userProfileId = await client.getUserProfileId() - selectedProject = items.find((item) => item.data.createdBy === userProfileId)?.data - if (!selectedProject) { + const userProjects = items.filter((item) => item.data.createdBy === userProfileId) + + if (userProjects.length === 0) { logger.info(`No project found created by the current user (${userProfileId})`) void vscode.window.showInformationMessage('No accessible projects found') return } - logger.info( - `Selected project ${(selectedProject as DataZoneProject).name} (${(selectedProject as DataZoneProject).id})` - ) + + // Show project picker with filtered projects + selectedProject = await showQuickPick(userProjects) } else { // Show project picker selectedProject = await showQuickPick(items) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index b0a5bb8542b..5f7ca4989a2 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -1018,28 +1018,6 @@ describe('SmusAuthenticationProvider', function () { ) }) - it('should trigger project selection after successful connection', async function () { - isInSmusSpaceEnvironmentStub.returns(false) - extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) - mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) - mockState.get.withArgs('smus.connections').returns({}) - - await smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl) - - assert.ok(executeCommandStub.calledWith('aws.smus.switchProject')) - }) - - it('should not trigger project selection in SMUS space environment', async function () { - isInSmusSpaceEnvironmentStub.returns(true) - extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) - mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) - mockState.get.withArgs('smus.connections').returns({}) - - await smusAuthProvider.connectWithIamProfile(testProfileName, testRegion, testDomainUrl) - - assert.ok(executeCommandStub.notCalled) - }) - it('should merge with existing SMUS connections metadata', async function () { extractDomainInfoStub.returns({ domainId: testDomainId, region: testRegion }) mockAuth.getConnection.withArgs({ id: `profile:${testProfileName}` }).resolves(testIamConnection) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts index 1b9ca657d34..7beb7b0b3ac 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts @@ -237,6 +237,8 @@ describe('SelectSMUSProject', function () { let mockProjectNode: sinon.SinonStubbedInstance let createQuickPickStub: sinon.SinonStub let executeCommandStub: sinon.SinonStub + let getContextStub: sinon.SinonStub + let createDZClientStub: sinon.SinonStub const testDomainId = 'test-domain-123' const mockProject: DataZoneProject = { @@ -270,8 +272,14 @@ describe('SelectSMUSProject', function () { project: undefined, } as any - // Stub DataZoneClient static methods - sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) + // Stub createDZClientBaseOnDomainMode to return our mock client + createDZClientStub = sinon.stub() + createDZClientStub.resolves(mockDataZoneClient) + sinon.replace( + require('../../../../sagemakerunifiedstudio/explorer/nodes/utils'), + 'createDZClientBaseOnDomainMode', + createDZClientStub + ) // Stub SmusAuthenticationProvider sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ @@ -290,6 +298,12 @@ describe('SelectSMUSProject', function () { }), } as any) + // Stub getContext to return false for Express mode by default (non-Express mode) + getContextStub = sinon.stub() + getContextStub.withArgs('aws.smus.isExpressMode').returns(false) + getContextStub.callThrough() + sinon.replace(require('../../../../shared/vscode/setContext'), 'getContext', getContextStub) + // Stub quickPick - return the project directly (not wrapped in an item) const mockQuickPick = { prompt: sinon.stub().resolves(mockProject), @@ -445,6 +459,8 @@ describe('selectSMUSProject - Additional Tests', function () { let mockProjectNode: sinon.SinonStubbedInstance let createQuickPickStub: sinon.SinonStub let executeCommandStub: sinon.SinonStub + let getContextStub: sinon.SinonStub + let createDZClientStub: sinon.SinonStub const testDomainId = 'test-domain-123' const mockProject: DataZoneProject = { @@ -465,7 +481,14 @@ describe('selectSMUSProject - Additional Tests', function () { setProject: sinon.stub(), } as any - sinon.stub(DataZoneClient, 'createWithCredentials').returns(mockDataZoneClient as any) + // Stub createDZClientBaseOnDomainMode to return our mock client + createDZClientStub = sinon.stub() + createDZClientStub.resolves(mockDataZoneClient) + sinon.replace( + require('../../../../sagemakerunifiedstudio/explorer/nodes/utils'), + 'createDZClientBaseOnDomainMode', + createDZClientStub + ) sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ activeConnection: { domainId: testDomainId, ssoRegion: 'us-west-2' }, getDomainAccountId: sinon.stub().resolves('123456789012'), @@ -480,6 +503,12 @@ describe('selectSMUSProject - Additional Tests', function () { }), } as any) + // Stub getContext to return false for Express mode by default (non-Express mode) + getContextStub = sinon.stub() + getContextStub.withArgs('aws.smus.isExpressMode').returns(false) + getContextStub.callThrough() + sinon.replace(require('../../../../shared/vscode/setContext'), 'getContext', getContextStub) + const mockQuickPick = { prompt: sinon.stub().resolves(mockProject), } @@ -545,3 +574,168 @@ describe('selectSMUSProject - Additional Tests', function () { assert.ok(!executeCommandStub.called) }) }) + +describe('selectSMUSProject - Express Mode', function () { + let mockDataZoneClient: sinon.SinonStubbedInstance + let mockProjectNode: sinon.SinonStubbedInstance + let createQuickPickStub: sinon.SinonStub + let executeCommandStub: sinon.SinonStub + let getContextStub: sinon.SinonStub + let createDZClientStub: sinon.SinonStub + + const testDomainId = 'test-domain-123' + const testUserProfileId = 'user-profile-123' + + const userProject: DataZoneProject = { + id: 'project-123', + name: 'User Project', + description: 'Project created by user', + domainId: testDomainId, + createdBy: testUserProfileId, + updatedAt: new Date(), + } + + const otherUserProject: DataZoneProject = { + id: 'project-456', + name: 'Other User Project', + description: 'Project created by another user', + domainId: testDomainId, + createdBy: 'other-user-profile-456', + updatedAt: new Date(Date.now() - 86400000), + } + + beforeEach(function () { + mockDataZoneClient = { + getDomainId: sinon.stub().returns(testDomainId), + fetchAllProjects: sinon.stub(), + getUserProfileId: sinon.stub().resolves(testUserProfileId), + } as any + + mockProjectNode = { + setProject: sinon.stub(), + } as any + + // Stub createDZClientBaseOnDomainMode to return our mock client + createDZClientStub = sinon.stub() + createDZClientStub.resolves(mockDataZoneClient) + sinon.replace( + require('../../../../sagemakerunifiedstudio/explorer/nodes/utils'), + 'createDZClientBaseOnDomainMode', + createDZClientStub + ) + + sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ + activeConnection: { domainId: testDomainId, ssoRegion: 'us-west-2' }, + getDomainAccountId: sinon.stub().resolves('123456789012'), + getDomainId: sinon.stub().returns(testDomainId), + getDomainRegion: sinon.stub().returns('us-west-2'), + getDerCredentialsProvider: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + } as any) + + const mockQuickPick = { + prompt: sinon.stub().resolves(userProject), + } + createQuickPickStub = sinon.stub(pickerPrompter, 'createQuickPick').returns(mockQuickPick as any) + executeCommandStub = sinon.stub(vscode.commands, 'executeCommand') + + // Stub getContext to simulate Express mode + getContextStub = sinon.stub() + getContextStub.withArgs('aws.smus.isExpressMode').returns(true) + getContextStub.callThrough() + sinon.replace(require('../../../../shared/vscode/setContext'), 'getContext', getContextStub) + }) + + afterEach(function () { + sinon.restore() + }) + + it('filters projects to show only user-created projects in Express mode', async function () { + mockDataZoneClient.fetchAllProjects.resolves([userProject, otherUserProject]) + + const result = await selectSMUSProject(mockProjectNode as any) + + // Verify getUserProfileId was called + assert.ok(mockDataZoneClient.getUserProfileId.calledOnce) + + // Verify only user-created projects are shown in quick pick + const quickPickCall = createQuickPickStub.getCall(0) + const items = quickPickCall.args[0] + assert.strictEqual(items.length, 1) + assert.strictEqual(items[0].data.id, userProject.id) + assert.strictEqual(items[0].data.createdBy, testUserProfileId) + + // Verify the user project was selected and set + assert.strictEqual(result, userProject) + assert.ok(mockProjectNode.setProject.calledOnce) + assert.ok(executeCommandStub.calledWith('aws.smus.rootView.refresh')) + }) + + it('shows message when no user-created projects found in Express mode', async function () { + mockDataZoneClient.fetchAllProjects.resolves([otherUserProject]) + + const result = await selectSMUSProject(mockProjectNode as any) + + // Verify getUserProfileId was called + assert.ok(mockDataZoneClient.getUserProfileId.calledOnce) + + // Verify no projects were shown in quick pick + assert.ok(!createQuickPickStub.called) + + // Verify appropriate message was shown + const testWindow = getTestWindow() + assert.ok(testWindow.shownMessages.some((msg) => msg.message === 'No accessible projects found')) + + // Verify no project was set + assert.strictEqual(result, undefined) + assert.ok(!mockProjectNode.setProject.called) + }) + + it('shows all user-created projects when multiple exist in Express mode', async function () { + const userProject2: DataZoneProject = { + id: 'project-789', + name: 'Another User Project', + description: 'Another project created by user', + domainId: testDomainId, + createdBy: testUserProfileId, + updatedAt: new Date(Date.now() - 172800000), // 2 days ago + } + + mockDataZoneClient.fetchAllProjects.resolves([userProject, otherUserProject, userProject2]) + + await selectSMUSProject(mockProjectNode as any) + + // Verify only user-created projects are shown + const quickPickCall = createQuickPickStub.getCall(0) + const items = quickPickCall.args[0] + assert.strictEqual(items.length, 2) + assert.ok(items.every((item: any) => item.data.createdBy === testUserProfileId)) + assert.ok(items.some((item: any) => item.data.id === userProject.id)) + assert.ok(items.some((item: any) => item.data.id === userProject2.id)) + assert.ok(!items.some((item: any) => item.data.id === otherUserProject.id)) + }) + + it('does not filter projects in non-Express mode', async function () { + // Stub getContext to return false for Express mode + getContextStub.withArgs('aws.smus.isExpressMode').returns(false) + + mockDataZoneClient.fetchAllProjects.resolves([userProject, otherUserProject]) + + await selectSMUSProject(mockProjectNode as any) + + // Verify getUserProfileId was NOT called + assert.ok(!mockDataZoneClient.getUserProfileId.called) + + // Verify all projects are shown in quick pick + const quickPickCall = createQuickPickStub.getCall(0) + const items = quickPickCall.args[0] + assert.strictEqual(items.length, 2) + assert.ok(items.some((item: any) => item.data.id === userProject.id)) + assert.ok(items.some((item: any) => item.data.id === otherUserProject.id)) + }) +}) From 03f3914d146fe498f6443dc92227948538fbac58 Mon Sep 17 00:00:00 2001 From: Bhargav Date: Fri, 31 Oct 2025 13:49:00 -0700 Subject: [PATCH 20/53] feat(smus): Add project context menu for IAM auth mode (#2270) **Description** This adds the switch project and refresh project functionality for IAM mode as well. Also added a right click option to refresh project based on prior UX feedback - This was from long ago but thought to do it while at it. **Testing Done** Tested IAM flow locally - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan --- .../nodes/sageMakerUnifiedStudioRootNode.ts | 21 +- .../sageMakerUnifiedStudioRootNode.test.ts | 187 ++++++++++++++++++ packages/toolkit/package.json | 9 +- 3 files changed, 214 insertions(+), 3 deletions(-) diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index 0778b19df1c..637825ea864 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -456,6 +456,7 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj const allProjects = await client.fetchAllProjects() const items = createProjectQuickPickItems(allProjects) + // Handle no projects scenario if (items.length === 0) { logger.info('No projects found in the domain') void vscode.window.showInformationMessage('No projects found in the domain') @@ -467,9 +468,24 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj if (getContext('aws.smus.isExpressMode')) { // Filter items to only show projects created by the current user logger.debug('Filtering projects to show only those created by the current user') - const userProfileId = await client.getUserProfileId() + + let userProfileId: string | undefined + try { + userProfileId = await client.getUserProfileId() + } catch (err) { + // If user profile is not found, it means the IAM principal hasn't created any resources through console + // Even though the error is for UserProfile, since it while we try to filter projects and that is the term exposed + // to use, we word the error message using "project" + logger.error('Failed to get user profile ID: %s', (err as Error).message) + void vscode.window.showErrorMessage( + 'No project found for IAM principal. Ensure you have created a project through console or portal for this IAM principal before attempting access from Toolkit extension.' + ) + return + } + const userProjects = items.filter((item) => item.data.createdBy === userProfileId) + // Task 6.2: Handle no accessible projects in Express mode if (userProjects.length === 0) { logger.info(`No project found created by the current user (${userProfileId})`) void vscode.window.showInformationMessage('No accessible projects found') @@ -505,7 +521,9 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj } catch (err) { const error = err as Error + // Handle access denied scenarios if (isAccessDenied(error)) { + logger.error('Access denied when fetching projects: %s', error.message) await showQuickPick([ { label: '$(error)', @@ -515,6 +533,7 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj return } + // Handle network/API failures logger.error('Failed to select project: %s', error.message) void vscode.window.showErrorMessage(`Failed to select project: ${error.message}`) } diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts index 7beb7b0b3ac..8ee30cc64dc 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts @@ -739,3 +739,190 @@ describe('selectSMUSProject - Express Mode', function () { assert.ok(items.some((item: any) => item.data.id === otherUserProject.id)) }) }) + +describe('selectSMUSProject - Error Handling', function () { + let mockDataZoneClient: sinon.SinonStubbedInstance + let mockProjectNode: sinon.SinonStubbedInstance + let createQuickPickStub: sinon.SinonStub + let getContextStub: sinon.SinonStub + let createDZClientStub: sinon.SinonStub + + const testDomainId = 'test-domain-123' + const testUserProfileId = 'user-profile-123' + + const mockProject: DataZoneProject = { + id: 'project-123', + name: 'Test Project', + description: 'Test Description', + domainId: testDomainId, + createdBy: testUserProfileId, + updatedAt: new Date(), + } + + beforeEach(function () { + mockDataZoneClient = { + getDomainId: sinon.stub().returns(testDomainId), + fetchAllProjects: sinon.stub(), + getUserProfileId: sinon.stub().resolves(testUserProfileId), + } as any + + mockProjectNode = { + setProject: sinon.stub(), + } as any + + createDZClientStub = sinon.stub() + createDZClientStub.resolves(mockDataZoneClient) + sinon.replace( + require('../../../../sagemakerunifiedstudio/explorer/nodes/utils'), + 'createDZClientBaseOnDomainMode', + createDZClientStub + ) + + sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ + activeConnection: { domainId: testDomainId, ssoRegion: 'us-west-2' }, + getDomainAccountId: sinon.stub().resolves('123456789012'), + getDomainId: sinon.stub().returns(testDomainId), + getDomainRegion: sinon.stub().returns('us-west-2'), + } as any) + + getContextStub = sinon.stub() + getContextStub.withArgs('aws.smus.isExpressMode').returns(false) + getContextStub.callThrough() + sinon.replace(require('../../../../shared/vscode/setContext'), 'getContext', getContextStub) + + const mockQuickPick = { + prompt: sinon.stub().resolves(mockProject), + } + createQuickPickStub = sinon.stub(pickerPrompter, 'createQuickPick').returns(mockQuickPick as any) + }) + + afterEach(function () { + sinon.restore() + }) + + describe('No projects scenario', function () { + it('displays "No projects found in the domain" message when user has no projects', async function () { + mockDataZoneClient.fetchAllProjects.resolves([]) + + const result = await selectSMUSProject(mockProjectNode as any) + + assert.strictEqual(result, undefined) + const testWindow = getTestWindow() + assert.ok(testWindow.shownMessages.some((msg) => msg.message === 'No projects found in the domain')) + assert.ok( + createQuickPickStub.calledWith([ + { + label: 'No projects found', + detail: '', + description: '', + data: {}, + }, + ]) + ) + assert.ok(!mockProjectNode.setProject.called) + }) + }) + + describe('No accessible projects in Express mode', function () { + beforeEach(function () { + getContextStub.withArgs('aws.smus.isExpressMode').returns(true) + }) + + it('displays "No accessible projects found" when user has no projects they created', async function () { + const otherUserProject: DataZoneProject = { + id: 'project-456', + name: 'Other User Project', + description: 'Project created by another user', + domainId: testDomainId, + createdBy: 'other-user-profile-456', + updatedAt: new Date(), + } + + mockDataZoneClient.fetchAllProjects.resolves([otherUserProject]) + + const result = await selectSMUSProject(mockProjectNode as any) + + assert.strictEqual(result, undefined) + assert.ok(mockDataZoneClient.getUserProfileId.calledOnce) + const testWindow = getTestWindow() + assert.ok(testWindow.shownMessages.some((msg) => msg.message === 'No accessible projects found')) + assert.ok(!mockProjectNode.setProject.called) + }) + + it('handles getUserProfileId failure with appropriate error message', async function () { + const profileError = new Error('User profile not found') + mockDataZoneClient.getUserProfileId.rejects(profileError) + mockDataZoneClient.fetchAllProjects.resolves([mockProject]) + + const result = await selectSMUSProject(mockProjectNode as any) + + assert.strictEqual(result, undefined) + const testWindow = getTestWindow() + assert.ok( + testWindow.shownMessages.some( + (msg) => + msg.message === + 'No project found for IAM principal. Ensure you have created a project through console or portal for this IAM principal before attempting access from Toolkit extension.' + ) + ) + assert.ok(!mockProjectNode.setProject.called) + }) + }) + + describe('Access denied scenarios', function () { + it('displays appropriate error message when user lacks permissions to view projects', async function () { + const accessDeniedError = new Error('Access denied to list projects') + accessDeniedError.name = 'AccessDeniedException' + mockDataZoneClient.fetchAllProjects.rejects(accessDeniedError) + + const result = await selectSMUSProject(mockProjectNode as any) + + assert.strictEqual(result, undefined) + assert.ok( + createQuickPickStub.calledWith([ + { + label: '$(error)', + description: "You don't have permissions to view projects. Please contact your administrator", + }, + ]) + ) + assert.ok(!mockProjectNode.setProject.called) + }) + + it('handles AccessDenied error name variations', async function () { + const accessDeniedError = new Error('Access denied') + accessDeniedError.name = 'AccessDeniedError' + mockDataZoneClient.fetchAllProjects.rejects(accessDeniedError) + + const result = await selectSMUSProject(mockProjectNode as any) + + assert.strictEqual(result, undefined) + assert.ok( + createQuickPickStub.calledWith([ + { + label: '$(error)', + description: "You don't have permissions to view projects. Please contact your administrator", + }, + ]) + ) + }) + + it('handles UnauthorizedOperation error as access denied', async function () { + const unauthorizedError = new Error('Unauthorized operation') + unauthorizedError.name = 'UnauthorizedOperationAccessDenied' + mockDataZoneClient.fetchAllProjects.rejects(unauthorizedError) + + const result = await selectSMUSProject(mockProjectNode as any) + + assert.strictEqual(result, undefined) + assert.ok( + createQuickPickStub.calledWith([ + { + label: '$(error)', + description: "You don't have permissions to view projects. Please contact your administrator", + }, + ]) + ) + }) + }) +}) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index e27ccb0ae8c..7b676c20db5 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -1338,12 +1338,12 @@ "view/title": [ { "command": "aws.smus.switchProject", - "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && !aws.smus.inSmusSpaceEnvironment && !aws.smus.isExpressMode", + "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && !aws.smus.inSmusSpaceEnvironment", "group": "smus@0" }, { "command": "aws.smus.refreshProject", - "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && !aws.smus.isExpressMode", + "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected", "group": "smus@1" }, { @@ -1690,6 +1690,11 @@ "when": "view == aws.explorer && viewItem == awsSagemakerParentNode", "group": "inline@1" }, + { + "command": "aws.smus.switchProject", + "when": "view == aws.smus.rootView && viewItem == smusSelectedProject", + "group": "0_project@1" + }, { "command": "aws.smus.refreshProject", "when": "view == aws.smus.rootView && viewItem == smusSelectedProject", From 4bfa63fe9a8b2682b3261ac3d5d72d5ba384ec2b Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Fri, 31 Oct 2025 14:12:30 -0700 Subject: [PATCH 21/53] feat(sagemaker): Support remote access deep link for Kiro (#2263) ## Problem When a user initiates remote access to their SageMaker Space from a web page (such as from the SageMaker AI web portal), known as the "deep link" feature, depending on the user's browser, they can choose to open the link in Kiro instead of in VS Code. When the user opens the link in Kiro, the remote connection logic checks for the Microsoft Remote - SSH extension which can't be installed in Kiro, resulting in the connection attempt being aborted. ## Solution In the deep link case, apply the same branching logic that is used when initiating remote access from the AWS Toolkit, in order to use the SageMaker Kiro SSH extension instead. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> --- .../core/src/awsService/sagemaker/commands.ts | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index ce0b7edd7db..d9b838bfc65 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -13,7 +13,12 @@ import { getLogger } from '../../shared/logger/logger' import { SagemakerSpaceNode, tryRefreshNode } from './explorer/sagemakerSpaceNode' import { isRemoteWorkspace } from '../../shared/vscode/env' import _ from 'lodash' -import { prepareDevEnvConnection, tryRemoteConnection } from './model' +import { + prepareDevEnvConnection, + startRemoteViaSageMakerSshKiro, + tryRemoteConnection, + useSageMakerSshKiroExtension, +} from './model' import { ExtContext } from '../../shared/extensions' import { SagemakerClient } from '../../shared/clients/sagemaker' import { ToolkitError } from '../../shared/errors' @@ -112,13 +117,20 @@ export async function deeplinkConnect( appType ) - await startVscodeRemote( - remoteEnv.SessionProcess, - remoteEnv.hostname, - '/home/sagemaker-user', - remoteEnv.vscPath, - 'sagemaker-user' - ) + const path = '/home/sagemaker-user' + const username = 'sagemaker-user' + + if (useSageMakerSshKiroExtension()) { + await startRemoteViaSageMakerSshKiro( + remoteEnv.SessionProcess, + remoteEnv.hostname, + path, + remoteEnv.vscPath, + username + ) + } else { + await startVscodeRemote(remoteEnv.SessionProcess, remoteEnv.hostname, path, remoteEnv.vscPath, username) + } } catch (err: any) { getLogger().error( `sm:OpenRemoteConnect: Unable to connect to target space with arn: ${connectionIdentifier} error: ${err}` From f7c6969a5ad42c94a5e0d2e5ef0f3f2d446c6dff Mon Sep 17 00:00:00 2001 From: Bhavya Sharma Date: Fri, 31 Oct 2025 16:23:14 -0700 Subject: [PATCH 22/53] fix(sagemakerunifiedstudio): Add accountId telemetry for IAM flow (#2274) ## Problem - The IAM authentication flow in SMUS was not recording the Domain Account ID in telemetry. ## Solution - IAM auth flow now records smus DomainAccountId ## Testing - Added log statements to test. Output : ``` 2025-10-31 10:12:51.409 [info] DataZoneDomainPreferencesClient: Getting the domain info 2025-10-31 10:12:51.409 [info] DataZoneDomainPreferencesClient: Listing domains in region us-east-1 2025-10-31 10:12:51.799 [info] DataZoneDomainPreferencesClient: Found EXPRESS domain, id: dzd-3jnsfl1uidry3r (BETA_10032025_Domain) 2025-10-31 10:12:51.800 [info] SMUS Auth: Discovered Express domain URL: https://dzd-3jnsfl1uidry3r.sagemaker.us-east-1.on.aws 2025-10-31 10:12:51.800 [info] SMUS: Connecting with IAM profile testing-kiro-light to domain dzd-3jnsfl1uidry3r in region us-east-1 2025-10-31 10:12:51.818 [info] SMUS: Found existing IAM profile connection profile:testing-kiro-light 2025-10-31 10:12:51.823 [info] SMUS Connection: Clearing all cached clients 2025-10-31 10:12:51.832 [info] auth: Updating connection state of profile:testing-kiro-light to valid 2025-10-31 10:12:51.836 [info] SMUS Auth: Successfully connected with IAM profile testing-kiro-light in region us-east-1 to Express domain 2025-10-31 10:12:51.836 [info] Connected to SageMaker Unified Studio domain: dzd-3jnsfl1uidry3r in region us-east-1 2025-10-31 10:12:51.836 [info] SMUS Auth: About to record telemetry for IAM authentication 2025-10-31 10:12:52.166 [info] SMUS Auth Telemetry: Recording accountId=619071339486 for domain=dzd-3jnsfl1uidry3r region=us-east-1 2025-10-31 10:12:52.166 [info] SMUS Auth Telemetry: Successfully recorded smusDomainAccountId telemetry 2025-10-31 10:12:52.166 [info] SMUS Auth: Completed telemetry recording for IAM authentication 2025-10-31 10:12:52.187 [info] DataZoneClient: Listing projects for domain dzd-3jnsfl1uidry3r in region us-east-1 2025-10-31 10:12:52.187 [info] DataZoneClient: Successfully created authenticated DataZone client ``` --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> --- .../auth/authenticationOrchestrator.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index 15002f00a25..0586901067e 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -127,6 +127,13 @@ export class SmusAuthenticationOrchestrator { `SMUS Auth: Successfully connected with IAM profile ${profileSelection.profileName} in region ${profileSelection.region} to Express domain` ) + // Extract domain ID and region for telemetry logging + const domainId = connection.domainId + const region = authProvider.getDomainRegion() + + logger.info(`Connected to SageMaker Unified Studio domain: ${domainId} in region ${region}`) + await this.recordAuthTelemetry(span, authProvider, domainId, region) + // Refresh the tree view to show authenticated state try { await vscode.commands.executeCommand('aws.smus.rootView.refresh') From 7db8e6ee1f80c5b4e116dcaea44e9d4fadadc473 Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Fri, 31 Oct 2025 16:40:41 -0700 Subject: [PATCH 23/53] fix(sagemaker): Fix path resolution for `kiro` executable (#2271) ## Problem When a user tries to connect to a SageMaker Space in Kiro on Mac, the remote workspace window is not able to be opened unless the user has `kiro` on their `$PATH`. Ideally, we want to directly find the `kiro` executable rather than rely on the user's `$PATH`. The problem is that the existing path finding logic is not able to locate the `kiro` executable on Mac because it's actually named `code` (though confirmed to be named `kiro` on Windows and Linux). ## Solution Update the path finding logic to fall back to `code` executables in relevant Kiro application directories if the `kiro` executable is not found. Invoking `kiro` on the `$PATH` will only be done as a last resort. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- packages/core/src/shared/utilities/pathFind.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/core/src/shared/utilities/pathFind.ts b/packages/core/src/shared/utilities/pathFind.ts index 56ccc236800..61f114f3017 100644 --- a/packages/core/src/shared/utilities/pathFind.ts +++ b/packages/core/src/shared/utilities/pathFind.ts @@ -111,8 +111,18 @@ function getKiroCliPaths(vscExe: string): string[] { path.resolve(`${vscode.env.appRoot}/kiro`), path.resolve(vscExe, '../bin/kiro'), path.resolve(vscExe, '../../bin/kiro'), + + // When no `kiro` file is found in the application directories, search for a `code` file in the same locations. + // This is necessary for Mac because the executable is called `code`. Though `kiro` on the $PATH may resolve to + // /usr/local/bin/kiro, that is just a symlink to /Applications/Kiro.app/Contents/Resources/app/bin/code. + path.resolve(`${vscode.env.appRoot}/bin/code`), + path.resolve(`${vscode.env.appRoot}/../../bin/code`), + path.resolve(`${vscode.env.appRoot}/code`), + path.resolve(vscExe, '../bin/code'), + path.resolve(vscExe, '../../bin/code'), + '/usr/bin/kiro', - 'kiro', + 'kiro', // $PATH ] } From c26d83e9ee8576253048663503c548bd5e44309a Mon Sep 17 00:00:00 2001 From: Bhargav Date: Fri, 31 Oct 2025 18:22:49 -0700 Subject: [PATCH 24/53] feat(smus): Add role session support for IAM roles (#2273) **Description** Adding support to filter resources using IAM roles and IAM role sessions. IAM role = GroupProfile. IAM role session = UserProfile. Changes in PR: 1. Refactored custom model to ony include operations and shapes needed by it. 2. Created new client based on the model and renamed to reflect current state. 3. Add a client wrapper that helps provide helper functions for these APIs. 4. Updated project filtering for IAM roles to use GroupProfile filtering and space filtering to use IAM role session user profiles. Pending : Handle IAM user. IAM user will be same as before, so need to handle that. Will raise another PR for it. **Motivation** Support upcoming role session changes. **Testing Done** Unit tests updated. Manually tested flow for role sessions. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargava Varadharajan Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> --- .gitignore | 2 +- .../scripts/build/generateServiceClient.ts | 4 +- .../auth/authenticationOrchestrator.ts | 8 +- .../providers/smusAuthenticationProvider.ts | 14 +- .../nodes/sageMakerUnifiedStudioRootNode.ts | 136 +- .../sageMakerUnifiedStudioSpacesParentNode.ts | 96 +- .../shared/client/datazoneClient.ts | 19 +- .../client/datazoneCustomClientHelper.ts | 519 + .../client/datazoneDomainPreferencesClient.ts | 307 - .../shared/client/datazonecustomclient.json | 919 + .../client/datazonedomainpreferences.json | 24917 ---------------- .../shared/smusUtils.ts | 47 +- packages/core/src/shared/clients/sagemaker.ts | 3 +- .../auth/smusAuthenticationProvider.test.ts | 45 +- .../sageMakerUnifiedStudioRootNode.test.ts | 275 +- ...MakerUnifiedStudioSpacesParentNode.test.ts | 53 +- .../client/datazoneCustomClientHelper.test.ts | 1270 + .../datazoneDomainPreferencesClient.test.ts | 467 - .../shared/smusUtils.test.ts | 65 - 19 files changed, 3245 insertions(+), 25921 deletions(-) create mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts delete mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts create mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json delete mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json create mode 100644 packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts delete mode 100644 packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts diff --git a/.gitignore b/.gitignore index 7d3ab3dd558..8a8b0fbe406 100644 --- a/.gitignore +++ b/.gitignore @@ -34,7 +34,7 @@ src.gen/* **/src/auth/sso/oidcclientpkce.d.ts **/src/sagemakerunifiedstudio/shared/client/gluecatalogapi.d.ts **/src/sagemakerunifiedstudio/shared/client/sqlworkbench.d.ts -**/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.d.ts +**/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.d.ts # Generated by tests **/src/testFixtures/**/bin diff --git a/packages/core/scripts/build/generateServiceClient.ts b/packages/core/scripts/build/generateServiceClient.ts index dbffa213de6..ac46c307a0f 100644 --- a/packages/core/scripts/build/generateServiceClient.ts +++ b/packages/core/scripts/build/generateServiceClient.ts @@ -250,8 +250,8 @@ void (async () => { serviceName: 'SQLWorkbench', }, { - serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json', - serviceName: 'DataZoneDomainPreferences', + serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json', + serviceName: 'DataZoneCustomClient', }, ] await generateServiceClients(serviceClientDefinitions) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts index 0586901067e..ffcb93e29ce 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/authenticationOrchestrator.ts @@ -17,7 +17,7 @@ import { IamProfileBackNavigation, } from './ui/iamProfileSelection' import { SmusAuthenticationPreferencesManager } from './preferences/authenticationPreferences' -import { DataZoneDomainPreferencesClient } from '../shared/client/datazoneDomainPreferencesClient' +import { DataZoneCustomClientHelper } from '../shared/client/datazoneCustomClientHelper' import { recordAuthTelemetry } from '../shared/telemetry' export type SmusAuthenticationMethod = 'sso' | 'iam' @@ -288,14 +288,14 @@ export class SmusAuthenticationOrchestrator { try { logger.debug(`SMUS Auth: Finding Express domain in region ${region} using profile ${profileName}`) - // Get DataZoneDomainPreferencesClient instance - const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance( + // Get DataZoneCustomClientHelper instance + const datazoneCustomClientHelper = DataZoneCustomClientHelper.getInstance( await authProvider.getCredentialsProviderForIamProfile(profileName), region ) // Find the Express domain using the client - const expressDomain = await domainPreferencesClient.getExpressDomain() + const expressDomain = await datazoneCustomClientHelper.getExpressDomain() if (!expressDomain) { logger.warn(`SMUS Auth: No Express domain found in region ${region}`) diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index 6bb9588891a..606adfd3733 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -43,7 +43,7 @@ import globals from '../../../shared/extensionGlobals' import { fromContainerMetadata, fromIni, fromNodeProviderChain } from '@aws-sdk/credential-providers' import { randomUUID } from '../../../shared/crypto' import { DefaultStsClient } from '../../../shared/clients/stsClient' -import { DataZoneDomainPreferencesClient } from '../../shared/client/datazoneDomainPreferencesClient' +import { DataZoneCustomClientHelper } from '../../shared/client/datazoneCustomClientHelper' import { createDZClientBaseOnDomainMode } from '../../explorer/nodes/utils' import { DataZoneClient } from '../../shared/client/datazoneClient' import { loadSharedConfigFiles } from '@smithy/shared-ini-file-loader' @@ -209,7 +209,9 @@ export class SmusAuthenticationProvider { const credentialsProvider = (await this.getDerCredentialsProvider()) as CredentialsProvider - const isExpress = await SmusUtils.isInSmusExpressMode(domainId, region, credentialsProvider) + // Get DataZoneCustomClientHelper instance and check if domain is Express mode + const datazoneCustomClientHelper = DataZoneCustomClientHelper.getInstance(credentialsProvider, region) + const isExpress = await datazoneCustomClientHelper.isExpressDomain(domainId) this.logger.debug(`SMUS Auth: is in express mode ${isExpress}`) await setSmusExpressModeContext(isExpress) } @@ -363,14 +365,14 @@ export class SmusAuthenticationProvider { try { logger.debug(`SMUS Auth: Finding Express domain in region using profile ${savedProfileName}`) - // Get DataZoneDomainPreferencesClient instance - const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance( + // Get DataZoneCustomClientHelper instance + const datazoneCustomClientHelper = DataZoneCustomClientHelper.getInstance( await this.getCredentialsProviderForIamProfile(savedProfileName), region ) // Find the Express domain using the client - const expressDomain = await domainPreferencesClient.getExpressDomain() + const expressDomain = await datazoneCustomClientHelper.getExpressDomain() if (!expressDomain) { logger.warn(`SMUS Auth: No Express domain found in region ${region}, proceeding with normal restore`) @@ -1381,7 +1383,7 @@ export class SmusAuthenticationProvider { this.cachedProjectAccountIds.clear() DataZoneClient.dispose() - DataZoneDomainPreferencesClient.dispose() + DataZoneCustomClientHelper.dispose() this.logger.debug('SMUS Auth: Successfully disposed authentication provider') } diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts index 637825ea864..e336bd58225 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.ts @@ -7,20 +7,22 @@ import * as vscode from 'vscode' import { TreeNode } from '../../../shared/treeview/resourceTreeDataProvider' import { getIcon } from '../../../shared/icons' import { getLogger } from '../../../shared/logger/logger' -import { DataZoneProject } from '../../shared/client/datazoneClient' +import { DataZoneProject, DataZoneClient } from '../../shared/client/datazoneClient' import { Commands } from '../../../shared/vscode/commands2' import { telemetry } from '../../../shared/telemetry/telemetry' import { createQuickPick } from '../../../shared/ui/pickerPrompter' import { SageMakerUnifiedStudioProjectNode } from './sageMakerUnifiedStudioProjectNode' import { SageMakerUnifiedStudioAuthInfoNode } from './sageMakerUnifiedStudioAuthInfoNode' -import { SmusErrorCodes } from '../../shared/smusUtils' +import { SmusErrorCodes, SmusUtils } from '../../shared/smusUtils' import { SmusAuthenticationProvider } from '../../auth/providers/smusAuthenticationProvider' import { ToolkitError } from '../../../../src/shared/errors' import { SmusAuthenticationMethod } from '../../auth/ui/authenticationMethodSelection' import { SmusAuthenticationOrchestrator } from '../../auth/authenticationOrchestrator' -import { isSmusSsoConnection } from '../../auth/model' +import { isSmusSsoConnection, isSmusIamConnection } from '../../auth/model' import { getContext } from '../../../shared/vscode/setContext' import { createDZClientBaseOnDomainMode } from './utils' +import { DataZoneCustomClientHelper } from '../../shared/client/datazoneCustomClientHelper' +import { DefaultStsClient } from '../../../shared/clients/stsClient' const contextValueSmusRoot = 'sageMakerUnifiedStudioRoot' const contextValueSmusLogin = 'sageMakerUnifiedStudioLogin' @@ -439,6 +441,52 @@ async function showQuickPick(items: any[]) { return await quickPick.prompt() } +/** + * Fetches projects filtered by group profile for Express mode IAM authentication + * @param authProvider The SMUS authentication provider + * @param client The DataZone client instance + * @returns Promise resolving to filtered projects array + * @throws Error if group profile retrieval fails + */ +async function fetchProjectsByGroupProfile( + authProvider: SmusAuthenticationProvider, + client: DataZoneClient +): Promise { + const logger = getLogger() + + // Get credentials provider for IAM profile + const activeConnection = authProvider.activeConnection + if (!isSmusIamConnection(activeConnection)) { + throw new Error('Active connection is not a valid IAM connection') + } + const credentialsProvider = await authProvider.getCredentialsProviderForIamProfile(activeConnection.profileName) + + const datazoneCustomClientHelper = DataZoneCustomClientHelper.getInstance( + credentialsProvider, + authProvider.getDomainRegion() + ) + + // Get caller identity to extract role ARN + const callerCredentials = await credentialsProvider.getCredentials() + const stsClient = new DefaultStsClient(authProvider.getDomainRegion(), callerCredentials) + const callerIdentity = await stsClient.getCallerIdentity() + logger.debug(`Retrieved caller identity, Arn: ${callerIdentity.Arn}`) + + // Convert assumed role ARN to IAM role ARN for group profile matching + const roleArn = SmusUtils.convertAssumedRoleArnToIamRoleArn(callerIdentity.Arn!) + logger.debug(`Converted to IAM role ARN: ${roleArn}`) + + // Get group profile ID for the current role + const groupProfileId = await datazoneCustomClientHelper.getGroupProfileId(authProvider.getDomainId(), roleArn) + logger.info(`Retrieved group profile ID: ${groupProfileId}`) + + // Fetch projects filtered by group profile + const projects = await client.fetchAllProjects({ groupIdentifier: groupProfileId }) + logger.debug(`Fetched ${projects.length} projects for group profile ${groupProfileId}`) + + return projects +} + export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProjectNode) { const logger = getLogger() @@ -450,55 +498,63 @@ export async function selectSMUSProject(projectNode?: SageMakerUnifiedStudioProj return } - const client = await createDZClientBaseOnDomainMode(authProvider) + const datazoneClient = await createDZClientBaseOnDomainMode(authProvider) logger.debug('DataZone client instance obtained successfully') - const allProjects = await client.fetchAllProjects() - const items = createProjectQuickPickItems(allProjects) - - // Handle no projects scenario - if (items.length === 0) { - logger.info('No projects found in the domain') - void vscode.window.showInformationMessage('No projects found in the domain') - await showQuickPick([{ label: 'No projects found', detail: '', description: '', data: {} }]) - return - } + let allProjects: DataZoneProject[] - let selectedProject if (getContext('aws.smus.isExpressMode')) { - // Filter items to only show projects created by the current user - logger.debug('Filtering projects to show only those created by the current user') - - let userProfileId: string | undefined + // In Express mode, filter projects by group profile try { - userProfileId = await client.getUserProfileId() + allProjects = await fetchProjectsByGroupProfile(authProvider, datazoneClient) } catch (err) { - // If user profile is not found, it means the IAM principal hasn't created any resources through console - // Even though the error is for UserProfile, since it while we try to filter projects and that is the term exposed - // to use, we word the error message using "project" - logger.error('Failed to get user profile ID: %s', (err as Error).message) - void vscode.window.showErrorMessage( - 'No project found for IAM principal. Ensure you have created a project through console or portal for this IAM principal before attempting access from Toolkit extension.' - ) - return - } + const error = err as Error + + // Handle no group profile found + if (error instanceof ToolkitError && error.message.includes('No group profile found')) { + logger.error('No group profile found for IAM role: %s', error.message) + void vscode.window.showErrorMessage( + 'No resources found for your IAM principal. Ensure SageMaker Unified Studio resources exist for this IAM principal.' + ) + return error + } - const userProjects = items.filter((item) => item.data.createdBy === userProfileId) + // Handle access denied + if (isAccessDenied(error)) { + logger.error('Access denied when retrieving group profile: %s', error.message) + void vscode.window.showErrorMessage( + "You don't have permissions to access this resource. Please contact your administrator" + ) + return error + } - // Task 6.2: Handle no accessible projects in Express mode - if (userProjects.length === 0) { - logger.info(`No project found created by the current user (${userProfileId})`) - void vscode.window.showInformationMessage('No accessible projects found') - return + // Handle other errors + logger.error('Failed to retrieve group profile information: %s', error.message) + void vscode.window.showErrorMessage('Failed to fetch IAM prinicpal information. Try again.') + return error } - - // Show project picker with filtered projects - selectedProject = await showQuickPick(userProjects) } else { - // Show project picker - selectedProject = await showQuickPick(items) + // In non-Express mode, fetch all projects without filtering + allProjects = await datazoneClient.fetchAllProjects() } + const items = createProjectQuickPickItems(allProjects) + + // Handle no projects scenario + if (items.length === 0) { + if (getContext('aws.smus.isExpressMode')) { + logger.debug('No accessible projects found for IAM principal') + void vscode.window.showInformationMessage('No accessible projects found for your IAM principal') + } else { + logger.debug('No projects found in the domain') + void vscode.window.showInformationMessage('No projects found in the domain') + } + return + } + + // Show project picker + const selectedProject = await showQuickPick(items) + const accountId = await authProvider.getDomainAccountId() span.record({ smusDomainId: authProvider.getDomainId(), diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts index 3c17f0d7ff2..2a5c43c8897 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.ts @@ -20,6 +20,9 @@ import { getIcon } from '../../../shared/icons' import { PENDING_NODE_POLLING_INTERVAL_MS } from './utils' import { getContext } from '../../../shared/vscode/setContext' import { createDZClientBaseOnDomainMode } from './utils' +import { SmusIamConnection } from '../../auth/model' +import { DataZoneCustomClientHelper } from '../../shared/client/datazoneCustomClientHelper' +import { DefaultStsClient } from '../../../shared/clients/stsClient' export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { public readonly id = 'smusSpacesParentNode' @@ -71,6 +74,12 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { if (error.name === 'AccessDeniedException') { return this.getAccessDeniedChildren() } + if (error.message.includes('No user profile found')) { + return this.getNoUserProfileChildren() + } + if (error.message.includes('Failed to retrieve user profile information')) { + return this.getUserProfileErrorChildren(error.message) + } return this.getNoSpacesFoundChildren() } const nodes = [...this.sagemakerSpaceNodes.values()] @@ -109,6 +118,42 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { ] } + private getNoUserProfileChildren(): TreeNode[] { + return [ + { + id: 'smusNoUserProfile', + resource: {}, + getTreeItem: () => { + const item = new vscode.TreeItem( + 'No spaces found for your IAM principal', + vscode.TreeItemCollapsibleState.None + ) + item.iconPath = getIcon('vscode-error') + return item + }, + getParent: () => this, + }, + ] + } + + private getUserProfileErrorChildren(message: string): TreeNode[] { + return [ + { + id: 'smusUserProfileError', + resource: {}, + getTreeItem: () => { + const item = new vscode.TreeItem( + 'Failed to retrieve spaces. Please try again.', + vscode.TreeItemCollapsibleState.None + ) + item.iconPath = getIcon('vscode-error') + return item + }, + getParent: () => this, + }, + ] + } + public getParent(): TreeNode | undefined { return this.parent } @@ -182,12 +227,60 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { } } + /** + * Retrieves the user profile ID for Express mode (IAM authentication) + * @returns Promise resolving to the user profile ID + * @throws Error if user profile retrieval fails + */ + private async getUserProfileIdForExpressMode(): Promise { + try { + // Get DataZoneCustomClientHelper instance + const credentialsProvider = await this.authProvider.getCredentialsProviderForIamProfile( + (this.authProvider.activeConnection as SmusIamConnection).profileName + ) + const datazoneCustomClientHelper = DataZoneCustomClientHelper.getInstance( + credentialsProvider, + this.authProvider.getDomainRegion() + ) + + // Get caller identity to extract role ARN with session + const credentials = await credentialsProvider.getCredentials() + const stsClient = new DefaultStsClient(this.authProvider.getDomainRegion(), credentials) + const callerIdentity = await stsClient.getCallerIdentity() + const roleArnWithSession = callerIdentity.Arn + + if (!roleArnWithSession) { + throw new Error('Unable to retrieve caller identity ARN') + } + + this.logger.debug(`SMUS: Retrieved role ARN with session: ${roleArnWithSession}`) + + // Call getUserProfileIdForSession with domain identifier and role ARN + const userProfileId = await datazoneCustomClientHelper.getUserProfileIdForSession( + this.authProvider.getDomainId(), + roleArnWithSession + ) + + this.logger.debug(`SMUS: Retrieved user profile ID for session: ${userProfileId}`) + return userProfileId + } catch (err) { + const error = err as Error + this.logger.error(`SMUS: Failed to retrieve user profile information: ${error.message}`) + + // Display appropriate error message based on error type + if (error.name === 'AccessDeniedException') { + throw new Error("You don't have permissions to access this resource. Please contact your administrator") + } + throw err + } + } + private async updateChildren(): Promise { const datazoneClient = await createDZClientBaseOnDomainMode(this.authProvider) let userProfileId if (getContext('aws.smus.isExpressMode')) { - userProfileId = await datazoneClient?.getUserProfileId() + userProfileId = await this.getUserProfileIdForExpressMode() } else { // Will be of format: 'ABCA4NU3S7PEOLDQPLXYZ:user-12345678-d061-70a4-0bf2-eeee67a6ab12' const userId = await datazoneClient.getUserId() @@ -199,6 +292,7 @@ export class SageMakerUnifiedStudioSpacesParentNode implements TreeNode { sagemakerDomainId, false /* filterSmusDomains */ ) + // Filter spaceApps to only show spaces owned by current user this.logger.debug(`SMUS: Filtering spaces for user profile ID: ${userProfileId}`) const filteredSpaceApps = new Map() diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts index c29b0a5fb07..e653662ad9a 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts @@ -244,7 +244,6 @@ export class DataZoneClient { managed: true, name: this.getToolingBlueprintName(), }) - const toolingBlueprint = domainBlueprints.items?.[0] if (!toolingBlueprint) { this.logger.error('Failed to get tooling blueprint') @@ -259,7 +258,7 @@ export class DataZoneClient { provider: sageMakerProviderName, }) - const defaultEnv = listEnvs.items?.find((env) => env.name === this.getToolingBlueprintName()) + const defaultEnv = listEnvs.items?.[0] if (!defaultEnv) { this.logger.error('Failed to find default Tooling environment') throw new Error('Failed to find default Tooling environment') @@ -294,10 +293,20 @@ export class DataZoneClient { expiration: credentials.expiration, } } - this.datazoneClient = new DataZone({ + + const clientConfig: any = { region: this.region, credentials: awsCredentialProvider, - }) + } + + // Use environment variable for endpoint if provided + const endpoint = process.env.DATAZONE_ENDPOINT + if (endpoint) { + clientConfig.endpoint = endpoint + this.logger.debug(`DataZoneClient: Using environment variable DataZone endpoint: ${endpoint}`) + } + + this.datazoneClient = new DataZone(clientConfig) } else { throw new Error('No credentials provider provided') } @@ -742,7 +751,7 @@ export class DataZoneClient { throw err } - const defaultEnv = listEnvs.items?.find((env) => env.name === this.getToolingBlueprintName()) + const defaultEnv = listEnvs.items?.[0] if (!defaultEnv || !defaultEnv.id) { this.logger.error( 'No default Tooling environment found for domainId: %s, projectId: %s', diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts new file mode 100644 index 00000000000..50b94ee25c5 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts @@ -0,0 +1,519 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { getLogger } from '../../../shared/logger/logger' +import apiConfig = require('./datazonecustomclient.json') +import globals from '../../../shared/extensionGlobals' +import { Service } from 'aws-sdk' +import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' +import * as DataZoneCustomClient from './datazonecustomclient' +import { adaptConnectionCredentialsProvider } from './credentialsAdapter' +import { CredentialsProvider } from '../../../auth/providers/credentials' +import { ToolkitError } from '../../../shared/errors' +import { SmusUtils } from '../smusUtils' + +/** + * Error codes for DataZone operations + */ +export const DataZoneErrorCode = { + NoGroupProfileFound: 'NoGroupProfileFound', + NoUserProfileFound: 'NoUserProfileFound', +} as const + +/** + * Helper client for interacting with AWS DataZone Custom API + */ +export class DataZoneCustomClientHelper { + private datazoneCustomClient: DataZoneCustomClient | undefined + private static instances = new Map() + private readonly logger = getLogger() + + private constructor( + private readonly credentialProvider: CredentialsProvider, + private readonly region: string + ) {} + + /** + * Gets a singleton instance of the DataZoneCustomClientHelper + * @returns DataZoneCustomClientHelper instance + */ + public static getInstance(credentialProvider: CredentialsProvider, region: string): DataZoneCustomClientHelper { + const logger = getLogger() + + const instanceKey = `${region}` + + // Check if we already have an instance for this instanceKey + if (DataZoneCustomClientHelper.instances.has(instanceKey)) { + const existingInstance = DataZoneCustomClientHelper.instances.get(instanceKey)! + logger.debug(`DataZoneCustomClientHelper: Using existing instance for instanceKey ${instanceKey}`) + return existingInstance + } + + // Create new instance + logger.debug('DataZoneCustomClientHelper: Creating new instance') + const instance = new DataZoneCustomClientHelper(credentialProvider, region) + DataZoneCustomClientHelper.instances.set(instanceKey, instance) + + logger.debug(`DataZoneCustomClientHelper: Created instance with instanceKey ${instanceKey}`) + + return instance + } + + /** + * Disposes all instances and cleans up resources + */ + public static dispose(): void { + const logger = getLogger() + logger.debug('DataZoneCustomClientHelper: Disposing all instances') + + for (const [key, instance] of DataZoneCustomClientHelper.instances.entries()) { + instance.datazoneCustomClient = undefined + logger.debug(`DataZoneCustomClientHelper: Disposed instance for: ${key}`) + } + + DataZoneCustomClientHelper.instances.clear() + } + + /** + * Gets the AWS region + * @returns AWS region + */ + public getRegion(): string { + return this.region + } + + /** + * Gets the DataZone client, initializing it if necessary + */ + private async getDataZoneCustomClient(): Promise { + if (!this.datazoneCustomClient) { + try { + this.logger.info('DataZoneCustomClientHelper: Creating authenticated DataZone client') + + // Use environment variable for endpoint if provided, otherwise use default + const endpoint = process.env.DATAZONE_ENDPOINT || `https://datazone.${this.region}.api.aws` + + if (process.env.DATAZONE_ENDPOINT) { + this.logger.debug( + `DataZoneCustomClientHelper: Using environment variable DataZone endpoint: ${endpoint}` + ) + } + + this.datazoneCustomClient = (await globals.sdkClientBuilder.createAwsService( + Service, + { + apiConfig: apiConfig, + endpoint: endpoint, + region: this.region, + credentialProvider: adaptConnectionCredentialsProvider(this.credentialProvider), + } as ServiceConfigurationOptions, + undefined, + false + )) as DataZoneCustomClient + + this.logger.info('DataZoneCustomClientHelper: Successfully created authenticated DataZone client') + } catch (err) { + this.logger.error('DataZoneCustomClientHelper: Failed to create DataZone client: %s', err as Error) + throw err + } + } + return this.datazoneCustomClient + } + + /** + * Lists domains in DataZone with pagination support + * @param options Options for listing domains + * @returns Paginated list of DataZone domains with nextToken + */ + public async listDomains(options?: { + maxResults?: number + status?: string + nextToken?: string + }): Promise<{ domains: DataZoneCustomClient.Types.DomainSummary[]; nextToken?: string }> { + try { + this.logger.info(`DataZoneCustomClientHelper: Listing domains in region ${this.region}`) + + const datazoneCustomClient = await this.getDataZoneCustomClient() + + // Call DataZone API to list domains with pagination + const response = await datazoneCustomClient + .listDomains({ + maxResults: options?.maxResults, + status: options?.status, + nextToken: options?.nextToken, + }) + .promise() + + const domains = response.items || [] + + if (domains.length === 0) { + this.logger.info(`DataZoneCustomClientHelper: No domains found`) + } else { + this.logger.debug(`DataZoneCustomClientHelper: Found ${domains.length} domains`) + } + + return { domains, nextToken: response.nextToken } + } catch (err) { + this.logger.error('DataZoneCustomClientHelper: Failed to list domains: %s', (err as Error).message) + throw err + } + } + + /** + * Fetches all domains by handling pagination automatically + * @param options Options for listing domains (excluding nextToken which is handled internally) + * @returns Promise resolving to an array of all DataZone domains + */ + public async fetchAllDomains(options?: { status?: string }): Promise { + try { + let allDomains: DataZoneCustomClient.Types.DomainSummary[] = [] + let nextToken: string | undefined + do { + const maxResultsPerPage = 25 + const response = await this.listDomains({ + ...options, + nextToken, + maxResults: maxResultsPerPage, + }) + allDomains = [...allDomains, ...response.domains] + nextToken = response.nextToken + } while (nextToken) + + this.logger.debug(`DataZoneCustomClientHelper: Fetched a total of ${allDomains.length} domains`) + return allDomains + } catch (err) { + this.logger.error('DataZoneCustomClientHelper: Failed to fetch all domains: %s', (err as Error).message) + throw err + } + } + + /** + * Gets the domain with EXPRESS mode in preferences using pagination with early termination + * @returns Promise resolving to the DataZone domain or undefined if not found + */ + public async getExpressDomain(): Promise { + const logger = getLogger() + + try { + logger.info('DataZoneCustomClientHelper: Getting the domain info') + + let nextToken: string | undefined + let totalDomainsChecked = 0 + const maxResultsPerPage = 25 + + // Paginate through domains and check each page for EXPRESS domain + do { + const response = await this.listDomains({ + status: 'AVAILABLE', + nextToken, + maxResults: maxResultsPerPage, + }) + + const { domains } = response + totalDomainsChecked += domains.length + + logger.debug( + `DataZoneCustomClientHelper: Checking ${domains.length} domains in current page (total checked: ${totalDomainsChecked})` + ) + + // Check each domain in the current page for EXPRESS mode + for (const domain of domains) { + if (domain.preferences && domain.preferences.DOMAIN_MODE === 'EXPRESS') { + logger.info( + `DataZoneCustomClientHelper: Found EXPRESS domain, id: ${domain.id} (${domain.name})` + ) + return domain + } + } + + nextToken = response.nextToken + } while (nextToken) + + logger.info( + `DataZoneCustomClientHelper: No domain with (DOMAIN_MODE: EXPRESS) found after checking all ${totalDomainsChecked} domains` + ) + return undefined + } catch (err) { + logger.error('DataZoneCustomClientHelper: Failed to get domain info: %s', err as Error) + throw new Error(`Failed to get domain info: ${(err as Error).message}`) + } + } + + /** + * Gets a specific domain by its ID + * @param domainId The ID of the domain to retrieve + * @returns Promise resolving to the GetDomainOutput + */ + public async getDomain(domainId: string): Promise { + try { + this.logger.debug(`DataZoneCustomClientHelper: Getting domain with ID: ${domainId}`) + + const datazoneCustomClient = await this.getDataZoneCustomClient() + + const response = await datazoneCustomClient + .getDomain({ + identifier: domainId, + }) + .promise() + + this.logger.debug(`DataZoneCustomClientHelper: Successfully retrieved domain: ${domainId}`) + return response + } catch (err) { + this.logger.error('DataZoneCustomClientHelper: Failed to get domain: %s', (err as Error).message) + throw err + } + } + + /** + * Checks if a specific domain is an EXPRESS domain + * @param domainId The ID of the domain to check + * @returns Promise resolving to true if the domain is EXPRESS, false otherwise + */ + public async isExpressDomain(domainId: string): Promise { + try { + this.logger.debug(`DataZoneCustomClientHelper: Checking if domain ${domainId} is EXPRESS`) + + const domain = await this.getDomain(domainId) + const isExpress = domain.preferences?.DOMAIN_MODE === 'EXPRESS' || false + + this.logger.debug( + `DataZoneCustomClientHelper: Domain ${domainId} is ${isExpress ? 'EXPRESS' : 'not EXPRESS'}` + ) + return isExpress + } catch (err) { + this.logger.error('DataZoneCustomClientHelper: Failed to check if domain is EXPRESS: %s', err as Error) + throw err + } + } + + /** + * Searches for group profiles in the DataZone domain + * @param domainIdentifier The domain identifier to search in + * @param options Options for searching group profiles + * @returns Promise resolving to group profile search results with pagination + */ + public async searchGroupProfiles( + domainIdentifier: string, + options?: { + groupType?: string + searchText?: string + maxResults?: number + nextToken?: string + } + ): Promise<{ items: DataZoneCustomClient.Types.GroupProfileSummary[]; nextToken?: string }> { + try { + this.logger.debug( + `DataZoneCustomClientHelper: Searching group profiles in domain ${domainIdentifier} with groupType: ${options?.groupType}, searchText: ${options?.searchText}` + ) + + const datazoneCustomClient = await this.getDataZoneCustomClient() + + // Build the request parameters + const params: DataZoneCustomClient.Types.SearchGroupProfilesInput = { + domainIdentifier, + groupType: options?.groupType as DataZoneCustomClient.Types.GroupSearchType, + searchText: options?.searchText, + maxResults: options?.maxResults, + nextToken: options?.nextToken, + } + + // Call DataZone API to search group profiles + const response = await datazoneCustomClient.searchGroupProfiles(params).promise() + + const items = response.items || [] + + if (items.length === 0) { + this.logger.debug(`DataZoneCustomClientHelper: No group profiles found`) + } else { + this.logger.debug(`DataZoneCustomClientHelper: Found ${items.length} group profiles`) + } + + return { items, nextToken: response.nextToken } + } catch (err) { + this.logger.error('DataZoneCustomClientHelper: Failed to search group profiles: %s', (err as Error).message) + throw err + } + } + + /** + * Searches for user profiles in the DataZone domain + * @param domainIdentifier The domain identifier to search in + * @param options Options for searching user profiles + * @returns Promise resolving to user profile search results with pagination + */ + public async searchUserProfiles( + domainIdentifier: string, + options: { + userType: string + searchText?: string + maxResults?: number + nextToken?: string + } + ): Promise<{ items: DataZoneCustomClient.Types.UserProfileSummary[]; nextToken?: string }> { + try { + this.logger.debug( + `DataZoneCustomClientHelper: Searching user profiles in domain ${domainIdentifier} with userType: ${options.userType}, searchText: ${options.searchText}` + ) + + const datazoneCustomClient = await this.getDataZoneCustomClient() + + // Build the request parameters + const params: DataZoneCustomClient.Types.SearchUserProfilesInput = { + domainIdentifier, + userType: options.userType as DataZoneCustomClient.Types.UserSearchType, + searchText: options.searchText, + maxResults: options.maxResults, + nextToken: options.nextToken, + } + + // Call DataZone API to search user profiles + const response = await datazoneCustomClient.searchUserProfiles(params).promise() + + const items = response.items || [] + + if (items.length === 0) { + this.logger.debug(`DataZoneCustomClientHelper: No user profiles found`) + } else { + this.logger.debug(`DataZoneCustomClientHelper: Found ${items.length} user profiles`) + } + + return { items, nextToken: response.nextToken } + } catch (err) { + this.logger.error('DataZoneCustomClientHelper: Failed to search user profiles: %s', (err as Error).message) + throw err + } + } + + /** + * Gets the group profile ID for a given IAM role ARN + * @param domainIdentifier The domain identifier to search in + * @param roleArn The base IAM role ARN (format: arn:aws:iam::ACCOUNT:role/ROLE_NAME) + * @returns Promise resolving to the group profile ID + * @throws ToolkitError with appropriate error code + */ + public async getGroupProfileId(domainIdentifier: string, roleArn: string): Promise { + try { + this.logger.debug( + `DataZoneCustomClientHelper: Getting group profile ID for role ARN: ${roleArn} in domain ${domainIdentifier}` + ) + + // Use searchText to filter server-side for better performance + const response = await this.searchGroupProfiles(domainIdentifier, { + groupType: 'IAM_ROLE_SESSION_GROUP', + searchText: roleArn, + maxResults: 50, + }) + + this.logger.debug( + `DataZoneCustomClientHelper: Received ${response.items.length} group profiles from search` + ) + + // Find exact match in filtered results + for (const profile of response.items) { + this.logger.debug( + `DataZoneCustomClientHelper: Checking group profile - ID: ${profile.id}, rolePrincipalArn: ${profile.rolePrincipalArn}, status: ${profile.status}` + ) + + if (profile.rolePrincipalArn === roleArn) { + this.logger.info(`DataZoneCustomClientHelper: Found matching group profile with ID: ${profile.id}`) + return profile.id! + } + } + + // No matching profile found + this.logger.error(`DataZoneCustomClientHelper: No group profile found for IAM role: ${roleArn}`) + throw new ToolkitError(`No group profile found for IAM role: ${roleArn}`, { + code: DataZoneErrorCode.NoGroupProfileFound, + }) + } catch (err) { + // Re-throw if it's already a ToolkitError + if (err instanceof ToolkitError) { + throw err + } + + // Log and wrap other errors + this.logger.error('DataZoneCustomClientHelper: Failed to get group profile ID: %s', (err as Error).message) + throw ToolkitError.chain(err, 'Failed to get group profile ID') + } + } + + /** + * Gets the user profile ID for a given IAM role session + * @param domainIdentifier The domain identifier to search in + * @param roleArnWithSession The assumed role ARN with session name (format: arn:aws:sts::ACCOUNT:assumed-role/ROLE_NAME/SESSION_NAME) + * @returns Promise resolving to the user profile ID + * @throws ToolkitError with appropriate error code + */ + public async getUserProfileIdForSession(domainIdentifier: string, roleArnWithSession: string): Promise { + try { + this.logger.debug( + `DataZoneCustomClientHelper: Getting user profile ID for role ARN with session: ${roleArnWithSession} in domain ${domainIdentifier}` + ) + + // Extract session name from the assumed role ARN + // Format: arn:aws:sts::ACCOUNT:assumed-role/ROLE_NAME/SESSION_NAME + const sessionName = SmusUtils.extractSessionNameFromArn(roleArnWithSession) + if (!sessionName) { + throw new ToolkitError(`Unable to extract session name from ARN: ${roleArnWithSession}`, { + code: DataZoneErrorCode.NoUserProfileFound, + }) + } + + this.logger.debug(`DataZoneCustomClientHelper: Extracted session name: ${sessionName}`) + + // Paginate through all user profiles and do client-side filtering + let nextToken: string | undefined + let totalProfilesChecked = 0 + + do { + const response = await this.searchUserProfiles(domainIdentifier, { + userType: 'DATAZONE_IAM_USER', + maxResults: 50, + nextToken, + }) + + totalProfilesChecked += response.items.length + this.logger.debug( + `DataZoneCustomClientHelper: Received ${response.items.length} user profiles in current page (total checked: ${totalProfilesChecked})` + ) + + // Find exact match in current page using client-side filtering + for (const profile of response.items) { + this.logger.debug( + `DataZoneCustomClientHelper: Checking profile - ID: ${profile.id}, principalId: ${profile.details?.iam?.principalId}, status: ${profile.status}` + ) + + // Match based on principalId which contains the session name + // principalId format: PRINCIPAL_ID:SESSION_NAME + if (profile.details?.iam?.principalId?.includes(sessionName)) { + this.logger.info( + `DataZoneCustomClientHelper: Found matching user profile with ID: ${profile.id} after checking ${totalProfilesChecked} profiles` + ) + return profile.id! + } + } + + nextToken = response.nextToken + } while (nextToken) + + // No matching profile found after checking all pages + this.logger.error( + `DataZoneCustomClientHelper: No user profile found for session: ${sessionName} after checking ${totalProfilesChecked} profiles` + ) + throw new ToolkitError(`No user profile found for session: ${sessionName}`, { + code: DataZoneErrorCode.NoUserProfileFound, + }) + } catch (err) { + // Re-throw if it's already a ToolkitError + if (err instanceof ToolkitError) { + throw err + } + + // Log and wrap other errors + this.logger.error('DataZoneCustomClientHelper: Failed to get user profile ID: %s', (err as Error).message) + throw ToolkitError.chain(err, 'Failed to get user profile ID') + } + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts deleted file mode 100644 index 7c6ad982e48..00000000000 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.ts +++ /dev/null @@ -1,307 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import { getLogger } from '../../../shared/logger/logger' -import apiConfig = require('./datazonedomainpreferences.json') -import globals from '../../../shared/extensionGlobals' -import { Service } from 'aws-sdk' -import { ServiceConfigurationOptions } from 'aws-sdk/lib/service' -import * as DataZoneDomainPreferences from './datazonedomainpreferences' -import { adaptConnectionCredentialsProvider } from './credentialsAdapter' -import { CredentialsProvider } from '../../../auth/providers/credentials' - -export type ListDomainsOutput = DataZoneDomainPreferences.Types.ListDomainsOutput -export type GetDomainOutput = DataZoneDomainPreferences.Types.GetDomainOutput - -export interface DataZoneDomain { - id: string - name: string - description?: string - arn: string - managedAccountId: string - status: string - portalUrl?: string - createdAt?: Date - lastUpdatedAt?: Date - domainVersion?: string - preferences?: any -} - -/** - * Client for interacting with AWS DataZone API - */ -export class DataZoneDomainPreferencesClient { - private datazoneDomainPreferencesClient: DataZoneDomainPreferences | undefined - private static instances = new Map() - private readonly logger = getLogger() - - private constructor( - private readonly credentialProvider: CredentialsProvider, - private readonly region: string - ) {} - - /** - * Gets a singleton instance of the DataZoneDomainPreferencesClient - * @returns DataZoneDomainPreferencesClient instance - */ - public static getInstance( - credentialProvider: CredentialsProvider, - region: string - ): DataZoneDomainPreferencesClient { - const logger = getLogger() - - const instanceKey = `${region}` - - // Check if we already have an instance for this instanceKey - if (DataZoneDomainPreferencesClient.instances.has(instanceKey)) { - const existingInstance = DataZoneDomainPreferencesClient.instances.get(instanceKey)! - logger.debug(`DataZoneDomainPreferencesClient: Using existing instance for instanceKey ${instanceKey}`) - return existingInstance - } - - // Create new instance - logger.debug('DataZoneDomainPreferencesClient: Creating new instance') - const instance = new DataZoneDomainPreferencesClient(credentialProvider, region) - DataZoneDomainPreferencesClient.instances.set(instanceKey, instance) - - logger.debug(`DataZoneDomainPreferencesClient: Created instance with instanceKey ${instanceKey}`) - - return instance - } - - /** - * Disposes all instances and cleans up resources - */ - public static dispose(): void { - const logger = getLogger() - logger.debug('DataZoneDomainPreferencesClient: Disposing all instances') - - for (const [key, instance] of DataZoneDomainPreferencesClient.instances.entries()) { - instance.datazoneDomainPreferencesClient = undefined - logger.debug(`DataZoneDomainPreferencesClient: Disposed instance for: ${key}`) - } - - DataZoneDomainPreferencesClient.instances.clear() - } - - /** - * Gets the AWS region - * @returns AWS region - */ - public getRegion(): string { - return this.region - } - - /** - * Gets the DataZone client, initializing it if necessary - */ - private async getDataZoneDomainPreferencesClient(): Promise { - if (!this.datazoneDomainPreferencesClient) { - try { - this.logger.info('DataZoneDomainPreferencesClient: Creating authenticated DataZone client') - - this.datazoneDomainPreferencesClient = (await globals.sdkClientBuilder.createAwsService( - Service, - { - apiConfig: apiConfig, - endpoint: `https://datazone.${this.region}.api.aws`, - region: this.region, - credentialProvider: adaptConnectionCredentialsProvider(this.credentialProvider), - } as ServiceConfigurationOptions, - undefined, - false - )) as DataZoneDomainPreferences - - this.logger.info('DataZonePreferencesClient: Successfully created authenticated DataZone client') - } catch (err) { - this.logger.error('DataZonePreferencesClient: Failed to create DataZone client: %s', err as Error) - throw err - } - } - return this.datazoneDomainPreferencesClient - } - - /** - * Lists domains in DataZone with pagination support - * @param options Options for listing domains - * @returns Paginated list of DataZone domains with nextToken - */ - public async listDomains(options?: { - maxResults?: number - status?: string - nextToken?: string - }): Promise<{ domains: DataZoneDomain[]; nextToken?: string }> { - try { - this.logger.info(`DataZoneDomainPreferencesClient: Listing domains in region ${this.region}`) - - const datazoneDomainPreferencesClient = await this.getDataZoneDomainPreferencesClient() - - // Call DataZone API to list domains with pagination - const response = await datazoneDomainPreferencesClient - .listDomains({ - maxResults: options?.maxResults, - status: options?.status, - nextToken: options?.nextToken, - }) - .promise() - - if (!response.items || response.items.length === 0) { - this.logger.info(`DataZoneDomainPreferencesClient: No domains found`) - return { domains: [] } - } - - // Map the response to our DataZoneDomain interface - const domains: DataZoneDomain[] = response.items.map((domain) => ({ - id: domain.id || '', - name: domain.name || '', - description: domain.description, - arn: domain.arn || '', - managedAccountId: domain.managedAccountId || '', - status: domain.status || '', - portalUrl: domain.portalUrl, - createdAt: domain.createdAt ? new Date(domain.createdAt) : undefined, - lastUpdatedAt: domain.lastUpdatedAt ? new Date(domain.lastUpdatedAt) : undefined, - domainVersion: domain.domainVersion, - preferences: domain.preferences, - })) - - this.logger.debug(`DataZoneDomainPreferencesClient: Found ${domains.length} domains`) - return { domains, nextToken: response.nextToken } - } catch (err) { - this.logger.error('DataZoneDomainPreferencesClient: Failed to list domains: %s', (err as Error).message) - throw err - } - } - - /** - * Fetches all domains by handling pagination automatically - * @param options Options for listing domains (excluding nextToken which is handled internally) - * @returns Promise resolving to an array of all DataZone domains - */ - public async fetchAllDomains(options?: { status?: string }): Promise { - try { - let allDomains: DataZoneDomain[] = [] - let nextToken: string | undefined - do { - const maxResultsPerPage = 25 - const response = await this.listDomains({ - ...options, - nextToken, - maxResults: maxResultsPerPage, - }) - allDomains = [...allDomains, ...response.domains] - nextToken = response.nextToken - } while (nextToken) - - this.logger.debug(`DataZoneDomainPreferencesClient: Fetched a total of ${allDomains.length} domains`) - return allDomains - } catch (err) { - this.logger.error( - 'DataZoneDomainPreferencesClient: Failed to fetch all domains: %s', - (err as Error).message - ) - throw err - } - } - - /** - * Gets the domain with EXPRESS mode in preferences using pagination with early termination - * @returns Promise resolving to the DataZone domain or undefined if not found - */ - public async getExpressDomain(): Promise { - const logger = getLogger() - - try { - logger.info('DataZoneDomainPreferencesClient: Getting the domain info') - - let nextToken: string | undefined - let totalDomainsChecked = 0 - const maxResultsPerPage = 25 - - // Paginate through domains and check each page for EXPRESS domain - do { - const response = await this.listDomains({ - status: 'AVAILABLE', - nextToken, - maxResults: maxResultsPerPage, - }) - - const { domains } = response - totalDomainsChecked += domains.length - - logger.debug( - `DataZoneDomainPreferencesClient: Checking ${domains.length} domains in current page (total checked: ${totalDomainsChecked})` - ) - - // Check each domain in the current page for EXPRESS mode - for (const domain of domains) { - if (domain.preferences && domain.preferences.DOMAIN_MODE === 'EXPRESS') { - logger.info( - `DataZoneDomainPreferencesClient: Found EXPRESS domain, id: ${domain.id} (${domain.name})` - ) - return domain - } - } - - nextToken = response.nextToken - } while (nextToken) - - logger.info( - `DataZoneDomainPreferencesClient: No domain with (DOMAIN_MODE: EXPRESS) found after checking all ${totalDomainsChecked} domains` - ) - return undefined - } catch (err) { - logger.error('DataZoneDomainPreferencesClient: Failed to get domain info: %s', err as Error) - throw new Error(`Failed to get domain info: ${(err as Error).message}`) - } - } - - /** - * Gets a specific domain by its ID - * @param domainId The ID of the domain to retrieve - * @returns Promise resolving to the GetDomainOutput - */ - public async getDomain(domainId: string): Promise { - try { - this.logger.debug(`DataZoneDomainPreferencesClient: Getting domain with ID: ${domainId}`) - - const datazoneDomainPreferencesClient = await this.getDataZoneDomainPreferencesClient() - - const response = await datazoneDomainPreferencesClient - .getDomain({ - identifier: domainId, - }) - .promise() - - this.logger.debug(`DataZoneDomainPreferencesClient: Successfully retrieved domain: ${domainId}`) - return response - } catch (err) { - this.logger.error('DataZoneDomainPreferencesClient: Failed to get domain: %s', (err as Error).message) - throw err - } - } - - /** - * Checks if a specific domain is an EXPRESS domain - * @param domainId The ID of the domain to check - * @returns Promise resolving to true if the domain is EXPRESS, false otherwise - */ - public async isExpressDomain(domainId: string): Promise { - try { - this.logger.debug(`DataZoneDomainPreferencesClient: Checking if domain ${domainId} is EXPRESS`) - - const domain = await this.getDomain(domainId) - const isExpress = domain.preferences?.DOMAIN_MODE === 'EXPRESS' || false - - this.logger.debug( - `DataZoneDomainPreferencesClient: Domain ${domainId} is ${isExpress ? 'EXPRESS' : 'not EXPRESS'}` - ) - return isExpress - } catch (err) { - this.logger.error('DataZoneDomainPreferencesClient: Failed to check if domain is EXPRESS: %s', err as Error) - throw err - } - } -} diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json b/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json new file mode 100644 index 00000000000..8414d3340b8 --- /dev/null +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazonecustomclient.json @@ -0,0 +1,919 @@ +{ + "version": "2.0", + "metadata": { + "apiVersion": "2018-05-10", + "auth": ["aws.auth#sigv4"], + "endpointPrefix": "datazone", + "protocol": "rest-json", + "protocols": ["rest-json"], + "serviceFullName": "Amazon DataZone", + "serviceId": "DataZone", + "signatureVersion": "v4", + "signingName": "datazone", + "uid": "datazone-2018-05-10" + }, + "operations": { + "GetDomain": { + "name": "GetDomain", + "http": { + "method": "GET", + "requestUri": "/v2/domains/{identifier}", + "responseCode": 200 + }, + "input": { + "shape": "GetDomainInput" + }, + "output": { + "shape": "GetDomainOutput" + }, + "errors": [ + { + "shape": "InternalServerException" + }, + { + "shape": "ResourceNotFoundException" + }, + { + "shape": "AccessDeniedException" + }, + { + "shape": "ThrottlingException" + }, + { + "shape": "ServiceQuotaExceededException" + }, + { + "shape": "ValidationException" + }, + { + "shape": "UnauthorizedException" + } + ], + "readonly": true + }, + "ListDomains": { + "name": "ListDomains", + "http": { + "method": "GET", + "requestUri": "/v2/domains", + "responseCode": 200 + }, + "input": { + "shape": "ListDomainsInput" + }, + "output": { + "shape": "ListDomainsOutput" + }, + "errors": [ + { + "shape": "InternalServerException" + }, + { + "shape": "ResourceNotFoundException" + }, + { + "shape": "AccessDeniedException" + }, + { + "shape": "ThrottlingException" + }, + { + "shape": "ServiceQuotaExceededException" + }, + { + "shape": "ConflictException" + }, + { + "shape": "ValidationException" + }, + { + "shape": "UnauthorizedException" + } + ], + "readonly": true + }, + "SearchGroupProfiles": { + "name": "SearchGroupProfiles", + "http": { + "method": "POST", + "requestUri": "/v2/domains/{domainIdentifier}/search-group-profiles", + "responseCode": 200 + }, + "input": { + "shape": "SearchGroupProfilesInput" + }, + "output": { + "shape": "SearchGroupProfilesOutput" + }, + "errors": [ + { + "shape": "InternalServerException" + }, + { + "shape": "ResourceNotFoundException" + }, + { + "shape": "AccessDeniedException" + }, + { + "shape": "ThrottlingException" + }, + { + "shape": "ConflictException" + }, + { + "shape": "ValidationException" + }, + { + "shape": "UnauthorizedException" + } + ] + }, + "SearchUserProfiles": { + "name": "SearchUserProfiles", + "http": { + "method": "POST", + "requestUri": "/v2/domains/{domainIdentifier}/search-user-profiles", + "responseCode": 200 + }, + "input": { + "shape": "SearchUserProfilesInput" + }, + "output": { + "shape": "SearchUserProfilesOutput" + }, + "errors": [ + { + "shape": "InternalServerException" + }, + { + "shape": "ResourceNotFoundException" + }, + { + "shape": "AccessDeniedException" + }, + { + "shape": "ThrottlingException" + }, + { + "shape": "ConflictException" + }, + { + "shape": "ValidationException" + }, + { + "shape": "UnauthorizedException" + } + ] + } + }, + "shapes": { + "GetDomainInput": { + "type": "structure", + "required": ["identifier"], + "members": { + "identifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "identifier" + } + } + }, + "DomainId": { + "type": "string", + "pattern": "dzd[-_][a-zA-Z0-9_-]{1,36}" + }, + "GetDomainOutput": { + "type": "structure", + "required": ["id", "status"], + "members": { + "id": { + "shape": "DomainId" + }, + "rootDomainUnitId": { + "shape": "DomainUnitId" + }, + "name": { + "shape": "String" + }, + "description": { + "shape": "String" + }, + "singleSignOn": { + "shape": "SingleSignOn" + }, + "domainExecutionRole": { + "shape": "RoleArn" + }, + "arn": { + "shape": "String" + }, + "kmsKeyIdentifier": { + "shape": "KmsKeyArn" + }, + "status": { + "shape": "DomainStatus" + }, + "failureReasons": { + "shape": "FailureReasonsList" + }, + "portalUrl": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "tags": { + "shape": "Tags" + }, + "provisionStatus": { + "shape": "ProvisionStatus", + "internalonly": true + }, + "domainVersion": { + "shape": "DomainVersion" + }, + "domainServiceRole": { + "shape": "RoleArn", + "deprecated": true, + "internalonly": true + }, + "serviceRole": { + "shape": "RoleArn" + }, + "supportedDomainVersions": { + "shape": "SupportedDomainVersions", + "internalonly": true + }, + "iamSignIns": { + "shape": "IamSignIns", + "internalonly": true + }, + "preferences": { + "shape": "Preferences", + "internalonly": true + } + } + }, + "DomainUnitId": { + "type": "string", + "max": 256, + "min": 1, + "pattern": "[a-z0-9_\\-]+" + }, + "String": { + "type": "string" + }, + "SingleSignOn": { + "type": "structure", + "members": { + "type": { + "shape": "AuthType" + }, + "userAssignment": { + "shape": "UserAssignment" + }, + "idcInstanceArn": { + "shape": "SingleSignOnIdcInstanceArnString" + }, + "ssoUrl": { + "shape": "String", + "internalonly": true + }, + "idcApplicationArn": { + "shape": "String", + "internalonly": true + } + } + }, + "AuthType": { + "type": "string", + "enum": ["IAM_IDC", "DISABLED", "SAML"] + }, + "UserAssignment": { + "type": "string", + "enum": ["AUTOMATIC", "MANUAL"] + }, + "SingleSignOnIdcInstanceArnString": { + "type": "string", + "pattern": ".*arn:(aws|aws-us-gov|aws-cn|aws-iso|aws-iso-b):sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}.*" + }, + "RoleArn": { + "type": "string", + "pattern": "arn:aws[^:]*:iam::\\d{12}:role(/[a-zA-Z0-9+=,.@_-]+)*/[a-zA-Z0-9+=,.@_-]+" + }, + "KmsKeyArn": { + "type": "string", + "max": 1024, + "min": 1, + "pattern": "arn:aws(|-cn|-us-gov):kms:[a-zA-Z0-9-]*:[0-9]{12}:key/[a-zA-Z0-9-]{36}" + }, + "DomainStatus": { + "type": "string", + "enum": ["CREATING", "AVAILABLE", "CREATION_FAILED", "DELETING", "DELETED", "DELETION_FAILED"] + }, + "FailureReasonsList": { + "type": "list", + "member": { + "shape": "FailureReason" + } + }, + "FailureReason": { + "type": "structure", + "members": { + "code": { + "shape": "String" + }, + "message": { + "shape": "String" + } + } + }, + "CreatedAt": { + "type": "timestamp" + }, + "UpdatedAt": { + "type": "timestamp" + }, + "Tags": { + "type": "map", + "key": { + "shape": "TagKey" + }, + "value": { + "shape": "TagValue" + } + }, + "TagKey": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "[\\w \\.:/=+@-]+" + }, + "TagValue": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\w \\.:/=+@-]*" + }, + "ProvisionStatus": { + "type": "string", + "enum": [ + "PROVISIONING", + "PROVISIONING_PROJECT_PROFILES", + "PROVISIONING_MODEL_ASSETS", + "PROVISION_FAILED", + "PROVISION_COMPLETE" + ] + }, + "DomainVersion": { + "type": "string", + "enum": ["V1", "V2"] + }, + "SupportedDomainVersions": { + "type": "list", + "member": { + "shape": "DomainVersion" + } + }, + "IamSignIns": { + "type": "list", + "member": { + "shape": "IamSignIn" + }, + "internalonly": true + }, + "IamSignIn": { + "type": "string", + "enum": ["IAM_ROLE", "IAM_USER"], + "internalonly": true + }, + "Preferences": { + "type": "map", + "key": { + "shape": "PreferenceKey" + }, + "value": { + "shape": "PreferenceValue" + }, + "max": 10, + "min": 0 + }, + "PreferenceKey": { + "type": "string", + "max": 128, + "min": 1, + "pattern": "[\\w \\.:/=+@-]+" + }, + "PreferenceValue": { + "type": "string", + "max": 256, + "min": 0, + "pattern": "[\\w \\.:/=+@-]*" + }, + "InternalServerException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 500 + }, + "exception": true, + "fault": true, + "retryable": { + "throttling": false + } + }, + "ErrorMessage": { + "type": "string" + }, + "ResourceNotFoundException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 404, + "senderFault": true + }, + "exception": true + }, + "AccessDeniedException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 403, + "senderFault": true + }, + "exception": true + }, + "ThrottlingException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 429, + "senderFault": true + }, + "exception": true, + "retryable": { + "throttling": false + } + }, + "ServiceQuotaExceededException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 402, + "senderFault": true + }, + "exception": true + }, + "ValidationException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 400, + "senderFault": true + }, + "exception": true + }, + "UnauthorizedException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + } + }, + "error": { + "httpStatusCode": 401, + "senderFault": true + }, + "exception": true + }, + "ListDomainsInput": { + "type": "structure", + "members": { + "status": { + "shape": "DomainStatus", + "location": "querystring", + "locationName": "status" + }, + "maxResults": { + "shape": "MaxResultsForListDomains", + "location": "querystring", + "locationName": "maxResults" + }, + "nextToken": { + "shape": "PaginationToken", + "location": "querystring", + "locationName": "nextToken" + } + } + }, + "MaxResultsForListDomains": { + "type": "integer", + "box": true, + "max": 25, + "min": 1 + }, + "PaginationToken": { + "type": "string", + "max": 8192, + "min": 1 + }, + "ListDomainsOutput": { + "type": "structure", + "required": ["items"], + "members": { + "items": { + "shape": "DomainSummaries" + }, + "domains": { + "shape": "DomainSummaries", + "internalonly": true + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "DomainSummaries": { + "type": "list", + "member": { + "shape": "DomainSummary" + } + }, + "DomainSummary": { + "type": "structure", + "required": ["id", "name", "arn", "managedAccountId", "status", "createdAt"], + "members": { + "id": { + "shape": "DomainId" + }, + "name": { + "shape": "DomainName" + }, + "description": { + "shape": "DomainDescription" + }, + "arn": { + "shape": "String" + }, + "managedAccountId": { + "shape": "String" + }, + "status": { + "shape": "DomainStatus" + }, + "portalUrl": { + "shape": "String" + }, + "createdAt": { + "shape": "CreatedAt" + }, + "lastUpdatedAt": { + "shape": "UpdatedAt" + }, + "domainVersion": { + "shape": "DomainVersion" + }, + "iamSignIns": { + "shape": "IamSignIns", + "internalonly": true + }, + "preferences": { + "shape": "Preferences", + "internalonly": true + } + } + }, + "DomainName": { + "type": "string", + "sensitive": true + }, + "DomainDescription": { + "type": "string", + "sensitive": true + }, + "ConflictException": { + "type": "structure", + "required": ["message"], + "members": { + "message": { + "shape": "ErrorMessage" + }, + "reason": { + "shape": "ConflictReason" + }, + "details": { + "shape": "ConflictDetails" + } + }, + "error": { + "httpStatusCode": 409, + "senderFault": true + }, + "exception": true + }, + "ConflictReason": { + "type": "string", + "enum": ["RESOURCE_LOCKED"] + }, + "ConflictDetails": { + "type": "structure", + "members": { + "lock": { + "shape": "LockDetails" + } + }, + "union": true + }, + "LockDetails": { + "type": "structure", + "required": ["lockedBy", "lockedAt", "lockExpiresAt"], + "members": { + "lockedBy": { + "shape": "String" + }, + "lockedAt": { + "shape": "Timestamp" + }, + "lockExpiresAt": { + "shape": "Timestamp" + } + } + }, + "Timestamp": { + "type": "timestamp" + }, + "SearchGroupProfilesInput": { + "type": "structure", + "required": ["domainIdentifier", "groupType"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "groupType": { + "shape": "GroupSearchType" + }, + "searchText": { + "shape": "GroupSearchText" + }, + "maxResults": { + "shape": "MaxResults" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "GroupSearchType": { + "type": "string", + "enum": ["SSO_GROUP", "DATAZONE_SSO_GROUP", "IAM_ROLE_SESSION_GROUP"] + }, + "GroupSearchText": { + "type": "string", + "max": 1024, + "min": 0, + "sensitive": true + }, + "MaxResults": { + "type": "integer", + "box": true, + "max": 50, + "min": 1 + }, + "SearchGroupProfilesOutput": { + "type": "structure", + "members": { + "items": { + "shape": "GroupProfileSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "GroupProfileSummaries": { + "type": "list", + "member": { + "shape": "GroupProfileSummary" + } + }, + "GroupProfileSummary": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "GroupProfileId" + }, + "status": { + "shape": "GroupProfileStatus" + }, + "groupName": { + "shape": "GroupProfileName" + }, + "rolePrincipalArn": { + "shape": "String", + "internalonly": true + }, + "rolePrincipalId": { + "shape": "String", + "internalonly": true + } + } + }, + "GroupProfileId": { + "type": "string", + "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + }, + "GroupProfileStatus": { + "type": "string", + "enum": ["ASSIGNED", "NOT_ASSIGNED"] + }, + "GroupProfileName": { + "type": "string", + "max": 1024, + "min": 1, + "pattern": "[a-zA-Z_0-9+=,.@-]+", + "sensitive": true + }, + "SearchUserProfilesInput": { + "type": "structure", + "required": ["domainIdentifier", "userType"], + "members": { + "domainIdentifier": { + "shape": "DomainId", + "location": "uri", + "locationName": "domainIdentifier" + }, + "userType": { + "shape": "UserSearchType" + }, + "searchText": { + "shape": "UserSearchText" + }, + "maxResults": { + "shape": "MaxResults" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "UserSearchType": { + "type": "string", + "enum": ["SSO_USER", "DATAZONE_USER", "DATAZONE_SSO_USER", "DATAZONE_IAM_USER"] + }, + "UserSearchText": { + "type": "string", + "max": 1024, + "min": 0, + "sensitive": true + }, + "SearchUserProfilesOutput": { + "type": "structure", + "members": { + "items": { + "shape": "UserProfileSummaries" + }, + "nextToken": { + "shape": "PaginationToken" + } + } + }, + "UserProfileSummaries": { + "type": "list", + "member": { + "shape": "UserProfileSummary" + } + }, + "UserProfileSummary": { + "type": "structure", + "members": { + "domainId": { + "shape": "DomainId" + }, + "id": { + "shape": "UserProfileId" + }, + "type": { + "shape": "UserProfileType" + }, + "status": { + "shape": "UserProfileStatus" + }, + "details": { + "shape": "UserProfileDetails" + } + } + }, + "UserProfileId": { + "type": "string", + "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" + }, + "UserProfileType": { + "type": "string", + "enum": ["IAM", "SSO", "SAML"] + }, + "UserProfileStatus": { + "type": "string", + "enum": ["ASSIGNED", "NOT_ASSIGNED", "ACTIVATED", "DEACTIVATED", "ARCHIVED"] + }, + "UserProfileDetails": { + "type": "structure", + "members": { + "iam": { + "shape": "IamUserProfileDetails" + }, + "sso": { + "shape": "SsoUserProfileDetails" + } + }, + "union": true + }, + "IamUserProfileDetails": { + "type": "structure", + "members": { + "arn": { + "shape": "String" + }, + "principalId": { + "shape": "String" + } + } + }, + "SsoUserProfileDetails": { + "type": "structure", + "members": { + "username": { + "shape": "UserProfileName" + }, + "firstName": { + "shape": "FirstName" + }, + "lastName": { + "shape": "LastName" + }, + "email": { + "shape": "String", + "internalonly": true + }, + "userId": { + "shape": "String", + "internalonly": true + } + } + }, + "UserProfileName": { + "type": "string", + "max": 1024, + "min": 1, + "pattern": "[a-zA-Z_0-9+=,.@-]+", + "sensitive": true + }, + "FirstName": { + "type": "string", + "sensitive": true + }, + "LastName": { + "type": "string", + "sensitive": true + } + } +} diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json b/packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json deleted file mode 100644 index 00ef0fbd044..00000000000 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazonedomainpreferences.json +++ /dev/null @@ -1,24917 +0,0 @@ -{ - "version": "2.0", - "metadata": { - "apiVersion": "2018-05-10", - "auth": ["aws.auth#sigv4"], - "endpointPrefix": "datazone", - "protocol": "rest-json", - "protocols": ["rest-json"], - "serviceFullName": "Amazon DataZone", - "serviceId": "DataZone", - "signatureVersion": "v4", - "signingName": "datazone", - "uid": "datazone-2018-05-10" - }, - "operations": { - "GetDomain": { - "name": "GetDomain", - "http": { - "method": "GET", - "requestUri": "/v2/domains/{identifier}", - "responseCode": 200 - }, - "input": { - "shape": "GetDomainInput" - }, - "output": { - "shape": "GetDomainOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ServiceQuotaExceededException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ], - "readonly": true - }, - "ListDomains": { - "name": "ListDomains", - "http": { - "method": "GET", - "requestUri": "/v2/domains", - "responseCode": 200 - }, - "input": { - "shape": "ListDomainsInput" - }, - "output": { - "shape": "ListDomainsOutput" - }, - "errors": [ - { - "shape": "InternalServerException" - }, - { - "shape": "ResourceNotFoundException" - }, - { - "shape": "AccessDeniedException" - }, - { - "shape": "ThrottlingException" - }, - { - "shape": "ServiceQuotaExceededException" - }, - { - "shape": "ConflictException" - }, - { - "shape": "ValidationException" - }, - { - "shape": "UnauthorizedException" - } - ], - "readonly": true - } - }, - "shapes": { - "AcceptChoice": { - "type": "structure", - "required": ["predictionTarget"], - "members": { - "predictionTarget": { - "shape": "String" - }, - "predictionChoice": { - "shape": "Integer" - }, - "editedValue": { - "shape": "EditedValue" - } - } - }, - "AcceptChoices": { - "type": "list", - "member": { - "shape": "AcceptChoice" - } - }, - "AcceptPredictionsInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "revision": { - "shape": "Revision", - "location": "querystring", - "locationName": "revision" - }, - "acceptRule": { - "shape": "AcceptRule" - }, - "acceptChoices": { - "shape": "AcceptChoices" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "AcceptPredictionsOutput": { - "type": "structure", - "required": ["domainId", "assetId", "revision"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "assetId": { - "shape": "AssetId" - }, - "revision": { - "shape": "Revision" - } - } - }, - "AcceptRule": { - "type": "structure", - "members": { - "rule": { - "shape": "AcceptRuleBehavior" - }, - "threshold": { - "shape": "Float" - } - } - }, - "AcceptRuleBehavior": { - "type": "string", - "enum": ["ALL", "NONE"] - }, - "AcceptSubscriptionRequestInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionRequestId", - "location": "uri", - "locationName": "identifier" - }, - "decisionComment": { - "shape": "DecisionComment" - }, - "assetScopes": { - "shape": "AcceptedAssetScopes" - }, - "expirationTimestamp": { - "shape": "SyntheticTimestamp_date_time" - }, - "assetPermissions": { - "shape": "AssetPermissions" - } - } - }, - "AcceptSubscriptionRequestOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "requestReason", - "subscribedPrincipals", - "subscribedListings" - ], - "members": { - "id": { - "shape": "SubscriptionRequestId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionRequestStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "requestReason": { - "shape": "RequestReason" - }, - "subscribedPrincipals": { - "shape": "AcceptSubscriptionRequestOutputSubscribedPrincipalsList" - }, - "subscribedListings": { - "shape": "AcceptSubscriptionRequestOutputSubscribedListingsList" - }, - "reviewerId": { - "shape": "String" - }, - "decisionComment": { - "shape": "DecisionComment" - }, - "existingSubscriptionId": { - "shape": "SubscriptionId" - }, - "metadataForms": { - "shape": "MetadataForms" - } - } - }, - "AcceptSubscriptionRequestOutputSubscribedListingsList": { - "type": "list", - "member": { - "shape": "SubscribedListing" - }, - "max": 1, - "min": 1 - }, - "AcceptSubscriptionRequestOutputSubscribedPrincipalsList": { - "type": "list", - "member": { - "shape": "SubscribedPrincipal" - }, - "max": 1, - "min": 1 - }, - "AcceptedAssetScope": { - "type": "structure", - "required": ["assetId", "filterIds"], - "members": { - "assetId": { - "shape": "AssetId" - }, - "filterIds": { - "shape": "FilterIds" - } - } - }, - "AcceptedAssetScopes": { - "type": "list", - "member": { - "shape": "AcceptedAssetScope" - } - }, - "AccessDeniedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 403, - "senderFault": true - }, - "exception": true - }, - "AccessKeyId": { - "type": "string", - "sensitive": true - }, - "AccountIdList": { - "type": "list", - "member": { - "shape": "AwsAccountId" - } - }, - "AccountInfo": { - "type": "structure", - "required": ["awsAccountId", "supportedRegions"], - "members": { - "awsAccountId": { - "shape": "AwsAccountId" - }, - "supportedRegions": { - "shape": "AwsRegionList" - }, - "awsAccountName": { - "shape": "AwsAccountName" - } - } - }, - "AccountInfoList": { - "type": "list", - "member": { - "shape": "AccountInfo" - }, - "max": 25, - "min": 1 - }, - "AccountPoolId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "AccountPoolList": { - "type": "list", - "member": { - "shape": "AccountPoolId" - }, - "max": 10, - "min": 1 - }, - "AccountPoolName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "AccountPoolSummaries": { - "type": "list", - "member": { - "shape": "AccountPoolSummary" - } - }, - "AccountPoolSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "AccountPoolId" - }, - "name": { - "shape": "AccountPoolName" - }, - "resolutionStrategy": { - "shape": "ResolutionStrategy" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - } - } - }, - "AccountSource": { - "type": "structure", - "members": { - "accounts": { - "shape": "AccountInfoList" - }, - "customAccountPoolHandler": { - "shape": "CustomAccountPoolHandler" - } - }, - "union": true - }, - "Action": { - "type": "string", - "enum": ["ADD_RESOURCE_TYPE", "REMOVE_RESOURCE_TYPE"] - }, - "ActionLink": { - "type": "string", - "sensitive": true - }, - "ActionParameters": { - "type": "structure", - "members": { - "awsConsoleLink": { - "shape": "AwsConsoleLinkParameters" - }, - "sageMaker": { - "shape": "SageMakerParameters", - "internalonly": true - } - }, - "union": true - }, - "AddEntityOwnerInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "owner"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "DataZoneEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "String", - "location": "uri", - "locationName": "entityIdentifier" - }, - "owner": { - "shape": "OwnerProperties" - }, - "overridePolicyConfiguration": { - "shape": "Boolean", - "internalonly": true - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "AddEntityOwnerOutput": { - "type": "structure", - "members": {} - }, - "AddPolicyGrantInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "policyType", "principal", "detail"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "TargetEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "String", - "location": "uri", - "locationName": "entityIdentifier" - }, - "policyType": { - "shape": "ManagedPolicyType" - }, - "principal": { - "shape": "PolicyGrantPrincipal" - }, - "detail": { - "shape": "PolicyGrantDetail" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "AddPolicyGrantOutput": { - "type": "structure", - "members": { - "grantId": { - "shape": "GrantIdentifier" - } - } - }, - "AddToProjectMemberPoolPolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "AdminApiRoleArn": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role|role/aws-reserved/sso\\.amazonaws\\.com)/[\\w+=,.@-]*" - }, - "AggregationAttributeDisplayValue": { - "type": "string" - }, - "AggregationAttributeValue": { - "type": "string" - }, - "AggregationDisplayValue": { - "type": "string", - "max": 100, - "min": 1 - }, - "AggregationList": { - "type": "list", - "member": { - "shape": "AggregationListItem" - }, - "max": 10, - "min": 1 - }, - "AggregationListItem": { - "type": "structure", - "required": ["attribute"], - "members": { - "attribute": { - "shape": "Attribute" - }, - "displayValue": { - "shape": "AggregationDisplayValue" - } - } - }, - "AggregationOutput": { - "type": "structure", - "members": { - "attribute": { - "shape": "Attribute" - }, - "displayValue": { - "shape": "AggregationDisplayValue" - }, - "items": { - "shape": "AggregationOutputItems" - } - } - }, - "AggregationOutputItem": { - "type": "structure", - "members": { - "value": { - "shape": "AggregationAttributeValue" - }, - "count": { - "shape": "Integer" - }, - "displayValue": { - "shape": "AggregationAttributeDisplayValue", - "internalonly": true - }, - "id": { - "shape": "AggregationAttributeValue", - "deprecated": true, - "deprecatedMessage": "Please use displayValue instead", - "internalonly": true - }, - "parentDisplayValue": { - "shape": "AggregationAttributeDisplayValue", - "internalonly": true - }, - "parentValue": { - "shape": "AggregationAttributeValue", - "internalonly": true - }, - "parentId": { - "shape": "AggregationAttributeValue", - "deprecated": true, - "deprecatedMessage": "Please use parentDisplayValue instead", - "internalonly": true - } - } - }, - "AggregationOutputItems": { - "type": "list", - "member": { - "shape": "AggregationOutputItem" - } - }, - "AggregationOutputList": { - "type": "list", - "member": { - "shape": "AggregationOutput" - } - }, - "AllDomainUnitsGrantFilter": { - "type": "structure", - "members": {} - }, - "AllUsersGrantFilter": { - "type": "structure", - "members": {} - }, - "AllowedDataZoneActions": { - "type": "list", - "member": { - "shape": "DataZoneAction" - } - }, - "AmazonQPropertiesInput": { - "type": "structure", - "required": ["isEnabled"], - "members": { - "isEnabled": { - "shape": "Boolean" - }, - "profileArn": { - "shape": "AmazonQPropertiesInputProfileArnString" - }, - "authMode": { - "shape": "AmazonQPropertiesInputAuthModeString" - } - } - }, - "AmazonQPropertiesInputAuthModeString": { - "type": "string", - "max": 128, - "min": 0 - }, - "AmazonQPropertiesInputProfileArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws[a-z\\-]*:[a-z0-9\\-]+:[a-z0-9\\-]*:[0-9]*:.*" - }, - "AmazonQPropertiesOutput": { - "type": "structure", - "required": ["isEnabled"], - "members": { - "isEnabled": { - "shape": "Boolean" - }, - "profileArn": { - "shape": "AmazonQPropertiesOutputProfileArnString" - }, - "authMode": { - "shape": "AmazonQPropertiesOutputAuthModeString" - } - } - }, - "AmazonQPropertiesOutputAuthModeString": { - "type": "string", - "max": 128, - "min": 0 - }, - "AmazonQPropertiesOutputProfileArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws[a-z\\-]*:[a-z0-9\\-]+:[a-z0-9\\-]*:[0-9]*:.*" - }, - "AmazonQPropertiesPatch": { - "type": "structure", - "required": ["isEnabled"], - "members": { - "isEnabled": { - "shape": "Boolean" - }, - "profileArn": { - "shape": "AmazonQPropertiesPatchProfileArnString" - }, - "authMode": { - "shape": "AmazonQPropertiesPatchAuthModeString" - } - } - }, - "AmazonQPropertiesPatchAuthModeString": { - "type": "string", - "max": 128, - "min": 0 - }, - "AmazonQPropertiesPatchProfileArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws[a-z\\-]*:[a-z0-9\\-]+:[a-z0-9\\-]*:[0-9]*:.*" - }, - "ApplicableAssetTypes": { - "type": "list", - "member": { - "shape": "TypeName" - } - }, - "ApplicablePrincipal": { - "type": "string", - "enum": ["USER", "PRODUCT", "DOMAIN"] - }, - "ApplicablePrincipalList": { - "type": "list", - "member": { - "shape": "ApplicablePrincipal" - } - }, - "ApplicableResource": { - "type": "string", - "enum": ["ZONE", "PROJECT", "PRODUCT", "ASSET", "DOMAIN"] - }, - "ApplicableResourceList": { - "type": "list", - "member": { - "shape": "ApplicableResource" - } - }, - "ApplicableScopeList": { - "type": "list", - "member": { - "shape": "String" - } - }, - "AssetFilterConfiguration": { - "type": "structure", - "members": { - "columnConfiguration": { - "shape": "ColumnFilterConfiguration" - }, - "rowConfiguration": { - "shape": "RowFilterConfiguration" - } - }, - "union": true - }, - "AssetFilterSummary": { - "type": "structure", - "required": ["id", "domainId", "assetId", "name"], - "members": { - "id": { - "shape": "FilterId" - }, - "domainId": { - "shape": "DomainId" - }, - "assetId": { - "shape": "AssetId" - }, - "name": { - "shape": "FilterName" - }, - "description": { - "shape": "Description" - }, - "status": { - "shape": "FilterStatus" - }, - "effectiveColumnNames": { - "shape": "ColumnNameList" - }, - "effectiveRowFilter": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "errorMessage": { - "shape": "String" - } - } - }, - "AssetFilters": { - "type": "list", - "member": { - "shape": "AssetFilterSummary" - } - }, - "AssetFormMetadata": { - "type": "structure", - "required": ["formName"], - "members": { - "formName": { - "shape": "FormName" - }, - "typeName": { - "shape": "FormTypeName" - }, - "typeRevision": { - "shape": "Revision" - }, - "renderingConfig": { - "shape": "RenderingConfig", - "internalonly": true - } - } - }, - "AssetFormMetadataList": { - "type": "list", - "member": { - "shape": "AssetFormMetadata" - }, - "max": 10, - "min": 0 - }, - "AssetId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "AssetIdentifier": { - "type": "string", - "pattern": "([a-zA-Z0-9_-]{1,36})(/.{1,600})?" - }, - "AssetInDataProductListingItem": { - "type": "structure", - "members": { - "entityId": { - "shape": "String" - }, - "entityRevision": { - "shape": "String" - }, - "entityType": { - "shape": "String" - } - } - }, - "AssetInDataProductListingItems": { - "type": "list", - "member": { - "shape": "AssetInDataProductListingItem" - } - }, - "AssetItem": { - "type": "structure", - "required": ["domainId", "identifier", "name", "typeIdentifier", "typeRevision", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "identifier": { - "shape": "AssetIdentifier" - }, - "name": { - "shape": "AssetName" - }, - "typeIdentifier": { - "shape": "AssetTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "externalIdentifier": { - "shape": "ExternalIdentifier" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "additionalAttributes": { - "shape": "AssetItemAdditionalAttributes" - }, - "governedGlossaryTerms": { - "shape": "AssetItemGovernedGlossaryTermsList" - } - } - }, - "AssetItemAdditionalAttributes": { - "type": "structure", - "members": { - "formsOutput": { - "shape": "AssetItemAdditionalAttributesFormsOutputList" - }, - "readOnlyFormsOutput": { - "shape": "FormOutputList" - }, - "latestTimeSeriesDataPointFormsOutput": { - "shape": "TimeSeriesDataPointSummaryFormOutputList" - }, - "matchRationale": { - "shape": "MatchRationale" - } - } - }, - "AssetItemAdditionalAttributesFormsOutputList": { - "type": "list", - "member": { - "shape": "FormOutput" - }, - "max": 20, - "min": 0 - }, - "AssetItemGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 20, - "min": 0 - }, - "AssetListing": { - "type": "structure", - "members": { - "assetId": { - "shape": "AssetId" - }, - "assetRevision": { - "shape": "Revision" - }, - "assetType": { - "shape": "TypeName" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "forms": { - "shape": "Forms" - }, - "assetFormsMetadata": { - "shape": "AssetFormMetadataList", - "internalonly": true - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - }, - "governedGlossaryTerms": { - "shape": "AssetListingGovernedGlossaryTermsList" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "latestTimeSeriesDataPointForms": { - "shape": "TimeSeriesDataPointSummaryFormOutputList" - } - } - }, - "AssetListingDetails": { - "type": "structure", - "required": ["listingId", "listingStatus"], - "members": { - "listingId": { - "shape": "ListingId" - }, - "listingStatus": { - "shape": "ListingStatus" - } - } - }, - "AssetListingGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "DetailedGlossaryTerm" - }, - "max": 20, - "min": 0 - }, - "AssetListingItem": { - "type": "structure", - "members": { - "listingId": { - "shape": "ListingId" - }, - "listingRevision": { - "shape": "Revision" - }, - "name": { - "shape": "AssetName" - }, - "entityId": { - "shape": "AssetId" - }, - "entityRevision": { - "shape": "Revision" - }, - "entityType": { - "shape": "TypeName" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "listingCreatedAt": { - "shape": "CreatedAt", - "internalonly": true - }, - "listingUpdatedAt": { - "shape": "UpdatedAt", - "internalonly": true - }, - "listingCreatedBy": { - "shape": "CreatedBy" - }, - "listingUpdatedBy": { - "shape": "UpdatedBy" - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - }, - "governedGlossaryTerms": { - "shape": "AssetListingItemGovernedGlossaryTermsList" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "additionalAttributes": { - "shape": "AssetListingItemAdditionalAttributes" - } - } - }, - "AssetListingItemAdditionalAttributes": { - "type": "structure", - "members": { - "forms": { - "shape": "Forms" - }, - "matchRationale": { - "shape": "MatchRationale" - }, - "latestTimeSeriesDataPointForms": { - "shape": "TimeSeriesDataPointSummaryFormOutputList" - } - }, - "sensitive": true - }, - "AssetListingItemGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "DetailedGlossaryTerm" - }, - "max": 20, - "min": 0 - }, - "AssetName": { - "type": "string", - "max": 256, - "min": 1, - "sensitive": true - }, - "AssetPermission": { - "type": "structure", - "required": ["assetId", "permissions"], - "members": { - "assetId": { - "shape": "AssetId" - }, - "permissions": { - "shape": "Permissions" - } - } - }, - "AssetPermissions": { - "type": "list", - "member": { - "shape": "AssetPermission" - } - }, - "AssetRevision": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "AssetId" - }, - "revision": { - "shape": "Revision" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - } - } - }, - "AssetRevisions": { - "type": "list", - "member": { - "shape": "AssetRevision" - } - }, - "AssetScope": { - "type": "structure", - "required": ["assetId", "filterIds", "status"], - "members": { - "assetId": { - "shape": "AssetId" - }, - "filterIds": { - "shape": "FilterIds" - }, - "status": { - "shape": "String" - }, - "errorMessage": { - "shape": "String" - } - } - }, - "AssetTargetNameMap": { - "type": "structure", - "required": ["assetId", "targetName"], - "members": { - "assetId": { - "shape": "AssetId" - }, - "targetName": { - "shape": "String" - } - } - }, - "AssetTargetNames": { - "type": "list", - "member": { - "shape": "AssetTargetNameMap" - } - }, - "AssetTypeIdentifier": { - "type": "string", - "max": 513, - "min": 1, - "pattern": "(?!\\.)[\\w\\.]*\\w" - }, - "AssetTypeIdentifiers": { - "type": "list", - "member": { - "shape": "AssetTypeIdentifier" - } - }, - "AssetTypeItem": { - "type": "structure", - "required": ["domainId", "name", "revision", "formsOutput", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "TypeName" - }, - "revision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "formsOutput": { - "shape": "FormsOutputMap" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "originDomainId": { - "shape": "DomainId" - }, - "originProjectId": { - "shape": "ProjectId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - } - } - }, - "AssetTypeList": { - "type": "list", - "member": { - "shape": "AssetTypeItem" - } - }, - "AssetTypesForRule": { - "type": "structure", - "required": ["selectionMode"], - "members": { - "selectionMode": { - "shape": "RuleScopeSelectionMode" - }, - "specificAssetTypes": { - "shape": "RuleAssetTypeList" - } - } - }, - "AssociateEnvironmentRoleInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "environmentRoleArn": { - "shape": "String", - "location": "uri", - "locationName": "environmentRoleArn" - }, - "roleTag": { - "shape": "RoleTag", - "internalonly": true - }, - "type": { - "shape": "EnvironmentRoleType", - "internalonly": true - } - } - }, - "AssociateEnvironmentRoleOutput": { - "type": "structure", - "members": {} - }, - "AssociateGovernedTermsInput": { - "type": "structure", - "required": ["domainIdentifier", "entityIdentifier", "entityType", "governedGlossaryTerms"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityIdentifier": { - "shape": "EntityIdentifier", - "location": "uri", - "locationName": "entityIdentifier" - }, - "entityType": { - "shape": "GovernedEntityType", - "location": "uri", - "locationName": "entityType" - }, - "governedGlossaryTerms": { - "shape": "AssociateGovernedTermsInputGovernedGlossaryTermsList" - } - } - }, - "AssociateGovernedTermsInputGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 5, - "min": 1 - }, - "AssociateGovernedTermsOutput": { - "type": "structure", - "members": {} - }, - "AthenaPropertiesInput": { - "type": "structure", - "required": ["workgroupName"], - "members": { - "workgroupName": { - "shape": "AthenaPropertiesInputWorkgroupNameString" - } - } - }, - "AthenaPropertiesInputWorkgroupNameString": { - "type": "string", - "max": 128, - "min": 0, - "pattern": "[a-zA-Z0-9._-]+" - }, - "AthenaPropertiesOutput": { - "type": "structure", - "required": ["workgroupName"], - "members": { - "workgroupName": { - "shape": "AthenaPropertiesOutputWorkgroupNameString" - } - } - }, - "AthenaPropertiesOutputWorkgroupNameString": { - "type": "string", - "max": 128, - "min": 0, - "pattern": "[a-zA-Z0-9._-]+" - }, - "AthenaPropertiesPatch": { - "type": "structure", - "required": ["workgroupName"], - "members": { - "workgroupName": { - "shape": "AthenaPropertiesPatchWorkgroupNameString" - } - } - }, - "AthenaPropertiesPatchWorkgroupNameString": { - "type": "string", - "max": 128, - "min": 0, - "pattern": "[a-zA-Z0-9._-]+" - }, - "AttachGovernedGlossaryTermsPolicyGrantDetail": { - "type": "structure", - "members": { - "domainUnitId": { - "shape": "DomainUnitId" - } - }, - "internalonly": true - }, - "Attribute": { - "type": "string", - "max": 128, - "min": 1 - }, - "AttributeEntityType": { - "type": "string", - "enum": ["ASSET", "LISTING"] - }, - "AttributeIdentifier": { - "type": "string", - "max": 256, - "min": 1 - }, - "AttributeIdentifierList": { - "type": "list", - "member": { - "shape": "AttributeIdentifier" - }, - "internalonly": true, - "max": 5, - "min": 0 - }, - "AttributeList": { - "type": "list", - "member": { - "shape": "GetAttributeOutput" - }, - "internalonly": true - }, - "AuthCodeUrl": { - "type": "string", - "sensitive": true - }, - "AuthType": { - "type": "string", - "enum": ["IAM_IDC", "DISABLED", "SAML"] - }, - "AuthenticationConfiguration": { - "type": "structure", - "members": { - "authenticationType": { - "shape": "AuthenticationType" - }, - "secretArn": { - "shape": "AuthenticationConfigurationSecretArnString" - }, - "oAuth2Properties": { - "shape": "OAuth2Properties" - } - } - }, - "AuthenticationConfigurationInput": { - "type": "structure", - "members": { - "authenticationType": { - "shape": "AuthenticationType" - }, - "oAuth2Properties": { - "shape": "OAuth2Properties" - }, - "secretArn": { - "shape": "AuthenticationConfigurationInputSecretArnString" - }, - "kmsKeyArn": { - "shape": "AuthenticationConfigurationInputKmsKeyArnString" - }, - "basicAuthenticationCredentials": { - "shape": "BasicAuthenticationCredentials" - }, - "customAuthenticationCredentials": { - "shape": "CredentialMap" - } - } - }, - "AuthenticationConfigurationInputKmsKeyArnString": { - "type": "string", - "pattern": "$|arn:aws[a-z0-9-]*:kms:.*" - }, - "AuthenticationConfigurationInputSecretArnString": { - "type": "string", - "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:secretsmanager:.*" - }, - "AuthenticationConfigurationPatch": { - "type": "structure", - "members": { - "secretArn": { - "shape": "AuthenticationConfigurationPatchSecretArnString" - }, - "basicAuthenticationCredentials": { - "shape": "BasicAuthenticationCredentials" - }, - "customAuthenticationCredentials": { - "shape": "CredentialMap" - } - } - }, - "AuthenticationConfigurationPatchSecretArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:secretsmanager:.*" - }, - "AuthenticationConfigurationSecretArnString": { - "type": "string", - "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:secretsmanager:.*" - }, - "AuthenticationType": { - "type": "string", - "enum": ["BASIC", "OAUTH2", "CUSTOM", "IAM"] - }, - "AuthorizationCodeProperties": { - "type": "structure", - "members": { - "authorizationCode": { - "shape": "AuthorizationCodePropertiesAuthorizationCodeString" - }, - "redirectUri": { - "shape": "AuthorizationCodePropertiesRedirectUriString" - } - } - }, - "AuthorizationCodePropertiesAuthorizationCodeString": { - "type": "string", - "max": 4096, - "min": 1 - }, - "AuthorizationCodePropertiesRedirectUriString": { - "type": "string", - "max": 512, - "min": 0 - }, - "AuthorizationPolicy": { - "type": "structure", - "members": { - "statement": { - "shape": "String" - }, - "applicableResources": { - "shape": "ApplicableResourceList" - }, - "applicablePrincipals": { - "shape": "ApplicablePrincipalList" - } - } - }, - "AuthorizedDesignations": { - "type": "list", - "member": { - "shape": "DesignationName" - } - }, - "AuthorizedPrincipal": { - "type": "structure", - "members": { - "principalIdentifier": { - "shape": "String" - }, - "principalType": { - "shape": "AuthorizedPrincipalType" - } - } - }, - "AuthorizedPrincipalIdentifier": { - "type": "string", - "pattern": "[a-zA-Z0-9:/._-]*" - }, - "AuthorizedPrincipalIdentifiers": { - "type": "list", - "member": { - "shape": "AuthorizedPrincipalIdentifier" - }, - "max": 20, - "min": 1 - }, - "AuthorizedPrincipalType": { - "type": "string", - "enum": ["SERVICE_PRINCIPAL", "DATAZONE_USER_PROFILE"] - }, - "AwsAccount": { - "type": "structure", - "members": { - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountIdPath": { - "shape": "ParameterStorePath" - } - }, - "union": true - }, - "AwsAccountId": { - "type": "string", - "pattern": "\\d{12}" - }, - "AwsAccountName": { - "type": "string", - "max": 256, - "min": 1, - "sensitive": true - }, - "AwsConsoleLinkParameters": { - "type": "structure", - "members": { - "uri": { - "shape": "EnvironmentActionURI" - } - } - }, - "AwsCredentials": { - "type": "structure", - "members": { - "accessKeyId": { - "shape": "AccessKeyId" - }, - "secretAccessKey": { - "shape": "SecretAccessKey" - }, - "sessionToken": { - "shape": "SessionToken" - }, - "expiration": { - "shape": "Timestamp" - } - } - }, - "AwsLocation": { - "type": "structure", - "members": { - "accessRole": { - "shape": "ServiceRole" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsRegion": { - "shape": "AwsRegion" - }, - "iamConnectionId": { - "shape": "ConnectionId" - } - } - }, - "AwsRegion": { - "type": "string", - "pattern": "[a-z]{2}-[a-z]{4,10}-\\d" - }, - "AwsRegionList": { - "type": "list", - "member": { - "shape": "AwsRegion" - }, - "max": 3, - "min": 1 - }, - "BasicAuthenticationCredentials": { - "type": "structure", - "members": { - "userName": { - "shape": "BasicUsername" - }, - "password": { - "shape": "BasicPassword" - } - }, - "sensitive": true - }, - "BasicPassword": { - "type": "string", - "max": 512, - "min": 0, - "pattern": ".*", - "sensitive": true - }, - "BasicUsername": { - "type": "string", - "max": 512, - "min": 0, - "pattern": "\\S+", - "sensitive": true - }, - "BatchDeleteLinkedTypesErrors": { - "type": "list", - "member": { - "shape": "LinkedTypeError" - } - }, - "BatchDeleteLinkedTypesInput": { - "type": "structure", - "required": ["domainIdentifier", "itemIdentifiers"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "projectIdentifier" - }, - "itemIdentifiers": { - "shape": "LinkedTypeItemIdentifiers", - "location": "querystring", - "locationName": "itemIdentifiers" - } - } - }, - "BatchDeleteLinkedTypesOutput": { - "type": "structure", - "required": ["errors"], - "members": { - "errors": { - "shape": "BatchDeleteLinkedTypesErrors" - } - } - }, - "BatchGetAttributesInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "attributeIdentifiers"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "AttributeEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "EntityId", - "location": "uri", - "locationName": "entityIdentifier" - }, - "entityRevision": { - "shape": "Revision", - "location": "querystring", - "locationName": "entityRevision" - }, - "attributeIdentifiers": { - "shape": "AttributeIdentifierList" - } - }, - "internalonly": true - }, - "BatchGetAttributesOutput": { - "type": "structure", - "members": { - "attributes": { - "shape": "AttributeList" - }, - "attributesNotFound": { - "shape": "AttributeIdentifierList" - } - }, - "internalonly": true - }, - "BatchPutAttributesError": { - "type": "structure", - "required": ["attributeIdentifier", "code", "message"], - "members": { - "attributeIdentifier": { - "shape": "String" - }, - "code": { - "shape": "String" - }, - "message": { - "shape": "String" - } - }, - "internalonly": true - }, - "BatchPutAttributesErrors": { - "type": "list", - "member": { - "shape": "BatchPutAttributesError" - }, - "internalonly": true - }, - "BatchPutAttributesInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "putAttributeEntries"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "AttributeEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "EntityId", - "location": "uri", - "locationName": "entityIdentifier" - }, - "putAttributeEntries": { - "shape": "PutAttributeEntries" - } - }, - "internalonly": true - }, - "BatchPutAttributesItems": { - "type": "list", - "member": { - "shape": "PutAttributeOutput" - }, - "internalonly": true - }, - "BatchPutAttributesOutput": { - "type": "structure", - "required": ["errors"], - "members": { - "errors": { - "shape": "BatchPutAttributesErrors" - }, - "items": { - "shape": "BatchPutAttributesItems" - } - }, - "internalonly": true - }, - "BatchPutLinkedTypesErrors": { - "type": "list", - "member": { - "shape": "LinkedTypeError" - } - }, - "BatchPutLinkedTypesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId" - }, - "environmentIdentifier": { - "shape": "EnvironmentId" - }, - "items": { - "shape": "BatchPutLinkedTypesInputItemsList" - } - } - }, - "BatchPutLinkedTypesInputItemsList": { - "type": "list", - "member": { - "shape": "PutLinkedTypeItem" - }, - "max": 10, - "min": 1 - }, - "BatchPutLinkedTypesOutput": { - "type": "structure", - "required": ["errors"], - "members": { - "errors": { - "shape": "BatchPutLinkedTypesErrors" - } - } - }, - "BedrockModelArn": { - "type": "string", - "pattern": "arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:(|[0-9]{12}):[0-9a-zA-Z-]+/.{1,2028}" - }, - "BedrockS3BucketArn": { - "type": "string", - "pattern": "arn:aws(|-cn|-us-gov):s3:::[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]" - }, - "Boolean": { - "type": "boolean", - "box": true - }, - "BootstrapConfiguration": { - "type": "structure", - "required": ["environmentBlueprintId"], - "members": { - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "projectName": { - "shape": "ProjectName" - }, - "projectOwners": { - "shape": "ProjectOwners" - }, - "environmentConfiguration": { - "shape": "EnvironmentParametersList" - } - } - }, - "BootstrapConfigurationList": { - "type": "list", - "member": { - "shape": "BootstrapConfiguration" - }, - "max": 3, - "min": 1 - }, - "BusinessNameGenerationConfiguration": { - "type": "structure", - "members": { - "enabled": { - "shape": "Boolean" - } - } - }, - "CancelMetadataGenerationRunInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "MetadataGenerationRunIdentifier", - "location": "uri", - "locationName": "identifier" - } - } - }, - "CancelMetadataGenerationRunOutput": { - "type": "structure", - "members": {} - }, - "CancelSubscriptionInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "CancelSubscriptionOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "subscribedPrincipal", - "subscribedListing" - ], - "members": { - "id": { - "shape": "SubscriptionId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "subscribedPrincipal": { - "shape": "SubscribedPrincipal" - }, - "subscribedListing": { - "shape": "SubscribedListing" - }, - "subscriptionRequestId": { - "shape": "SubscriptionRequestId" - }, - "retainPermissions": { - "shape": "Boolean" - }, - "pushedSubscription": { - "shape": "Boolean" - }, - "expirationTimestamp": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "ChangeAction": { - "type": "string", - "enum": ["PUBLISH", "UNPUBLISH", "CREATE_UNPUBLISHED"] - }, - "ClientToken": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\x21-\\x7E]+" - }, - "CloudFormationProperties": { - "type": "structure", - "required": ["templateUrl"], - "members": { - "templateUrl": { - "shape": "String" - } - } - }, - "Clusters": { - "type": "list", - "member": { - "shape": "String" - }, - "max": 20, - "min": 1 - }, - "ColumnFilterConfiguration": { - "type": "structure", - "members": { - "includedColumnNames": { - "shape": "ColumnNameList" - } - } - }, - "ColumnNameList": { - "type": "list", - "member": { - "shape": "String" - } - }, - "ColumnNames": { - "type": "list", - "member": { - "shape": "String" - } - }, - "ComputeEnvironments": { - "type": "string", - "enum": ["SPARK", "ATHENA", "PYTHON"] - }, - "ComputeEnvironmentsList": { - "type": "list", - "member": { - "shape": "ComputeEnvironments" - }, - "max": 50, - "min": 1 - }, - "ConfigurableActionParameter": { - "type": "structure", - "members": { - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "ConfigurableActionParameterList": { - "type": "list", - "member": { - "shape": "ConfigurableActionParameter" - } - }, - "ConfigurableActionTypeAuthorization": { - "type": "string", - "enum": ["IAM", "HTTPS"] - }, - "ConfigurableEnvironmentAction": { - "type": "structure", - "required": ["type", "parameters"], - "members": { - "type": { - "shape": "String" - }, - "auth": { - "shape": "ConfigurableActionTypeAuthorization" - }, - "parameters": { - "shape": "ConfigurableActionParameterList" - } - } - }, - "Configuration": { - "type": "structure", - "members": { - "classification": { - "shape": "ConfigurationClassificationString" - }, - "properties": { - "shape": "PropertyMap" - } - } - }, - "ConfigurationClassificationString": { - "type": "string", - "max": 64, - "min": 0, - "pattern": "[\\w][\\w\\.\\-\\_]*" - }, - "ConfigurationMap": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - }, - "Configurations": { - "type": "list", - "member": { - "shape": "Configuration" - } - }, - "ConflictException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 409, - "senderFault": true - }, - "exception": true - }, - "ConnectedEntities": { - "type": "list", - "member": { - "shape": "ConnectedEntity" - }, - "max": 10, - "min": 1 - }, - "ConnectedEntity": { - "type": "structure", - "members": { - "connectedEntityIdentifier": { - "shape": "String" - }, - "connectedEntityType": { - "shape": "ConnectedEntityType" - }, - "connectedEntityConnectionType": { - "shape": "ConnectedEntityConnectionType" - } - } - }, - "ConnectedEntityConnectionType": { - "type": "string", - "enum": ["BELONGS_TO", "CONSUMED_BY", "CUSTOM"] - }, - "ConnectedEntityType": { - "type": "string", - "enum": ["ENVIRONMENT", "SAGEMAKER_DOMAIN", "SAGEMAKER_USER_PROFILE", "CUSTOM"] - }, - "ConnectionCredentials": { - "type": "structure", - "members": { - "accessKeyId": { - "shape": "String" - }, - "secretAccessKey": { - "shape": "String" - }, - "sessionToken": { - "shape": "String" - }, - "expiration": { - "shape": "SyntheticTimestamp_date_time" - }, - "identityEnhancedCredentials": { - "shape": "IdentityEnhancedCredentials", - "internalonly": true - } - }, - "sensitive": true - }, - "ConnectionId": { - "type": "string", - "max": 128, - "min": 0, - "pattern": "[a-zA-Z0-9]+" - }, - "ConnectionName": { - "type": "string", - "max": 64, - "min": 0, - "pattern": "[\\w][\\w\\.\\-\\_]*" - }, - "ConnectionOptions": { - "type": "structure", - "members": { - "enableTrustedIdentityPropagation": { - "shape": "Boolean" - } - } - }, - "ConnectionProperties": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "ConnectionPropertiesValueString" - } - }, - "ConnectionPropertiesInput": { - "type": "structure", - "members": { - "athenaProperties": { - "shape": "AthenaPropertiesInput" - }, - "databricksProperties": { - "shape": "DatabricksPropertiesInput", - "internalonly": true - }, - "gitProperties": { - "shape": "GitPropertiesInput" - }, - "glueProperties": { - "shape": "GluePropertiesInput" - }, - "hyperPodProperties": { - "shape": "HyperPodPropertiesInput" - }, - "iamProperties": { - "shape": "IamPropertiesInput" - }, - "jdbcProperties": { - "shape": "JdbcPropertiesInput" - }, - "lakehouseProperties": { - "shape": "LakehousePropertiesInput" - }, - "redshiftProperties": { - "shape": "RedshiftPropertiesInput" - }, - "s3Properties": { - "shape": "S3PropertiesInput" - }, - "s3FolderProperties": { - "shape": "S3FolderPropertiesInput" - }, - "snowflakeProperties": { - "shape": "SnowflakePropertiesInput", - "internalonly": true - }, - "sparkEmrProperties": { - "shape": "SparkEmrPropertiesInput" - }, - "sparkGlueProperties": { - "shape": "SparkGluePropertiesInput" - }, - "workflowsMwaaProperties": { - "shape": "WorkflowsMwaaPropertiesInput" - }, - "mlflowProperties": { - "shape": "MlflowPropertiesInput" - }, - "workflowsServerlessProperties": { - "shape": "WorkflowsServerlessPropertiesInput" - }, - "enableTrustedIdentityPropagation": { - "shape": "Boolean", - "internalonly": true - }, - "kinesisProperties": { - "shape": "KinesisPropertiesInput", - "internalonly": true - }, - "mskProperties": { - "shape": "MskPropertiesInput", - "internalonly": true - }, - "amazonQProperties": { - "shape": "AmazonQPropertiesInput", - "internalonly": true - } - }, - "union": true - }, - "ConnectionPropertiesOutput": { - "type": "structure", - "members": { - "athenaProperties": { - "shape": "AthenaPropertiesOutput" - }, - "databricksProperties": { - "shape": "DatabricksPropertiesOutput", - "internalonly": true - }, - "gitProperties": { - "shape": "GitPropertiesOutput" - }, - "glueProperties": { - "shape": "GluePropertiesOutput" - }, - "hyperPodProperties": { - "shape": "HyperPodPropertiesOutput" - }, - "jdbcProperties": { - "shape": "JdbcPropertiesOutput" - }, - "lakehouseProperties": { - "shape": "LakehousePropertiesOutput" - }, - "redshiftProperties": { - "shape": "RedshiftPropertiesOutput" - }, - "s3Properties": { - "shape": "S3PropertiesOutput" - }, - "s3FolderProperties": { - "shape": "S3FolderPropertiesOutput" - }, - "snowflakeProperties": { - "shape": "SnowflakePropertiesOutput", - "internalonly": true - }, - "sparkEmrProperties": { - "shape": "SparkEmrPropertiesOutput" - }, - "sparkGlueProperties": { - "shape": "SparkGluePropertiesOutput" - }, - "workflowsMwaaProperties": { - "shape": "WorkflowsMwaaPropertiesOutput" - }, - "mlflowProperties": { - "shape": "MlflowPropertiesOutput" - }, - "workflowsServerlessProperties": { - "shape": "WorkflowsServerlessPropertiesOutput" - }, - "iamRoleProperties": { - "shape": "IamRolePropertiesOutput" - }, - "iamProperties": { - "shape": "IamPropertiesOutput" - }, - "kinesisProperties": { - "shape": "KinesisPropertiesOutput", - "internalonly": true - }, - "mskProperties": { - "shape": "MskPropertiesOutput", - "internalonly": true - }, - "amazonQProperties": { - "shape": "AmazonQPropertiesOutput", - "internalonly": true - } - }, - "union": true - }, - "ConnectionPropertiesPatch": { - "type": "structure", - "members": { - "athenaProperties": { - "shape": "AthenaPropertiesPatch" - }, - "jdbcProperties": { - "shape": "JdbcPropertiesPatch" - }, - "glueProperties": { - "shape": "GluePropertiesPatch" - }, - "iamProperties": { - "shape": "IamPropertiesPatch" - }, - "lakehouseProperties": { - "shape": "LakehousePropertiesPatch" - }, - "redshiftProperties": { - "shape": "RedshiftPropertiesPatch" - }, - "s3Properties": { - "shape": "S3PropertiesPatch" - }, - "s3FolderProperties": { - "shape": "S3FolderPropertiesPatch" - }, - "snowflakeProperties": { - "shape": "SnowflakePropertiesPatch", - "internalonly": true - }, - "sparkEmrProperties": { - "shape": "SparkEmrPropertiesPatch" - }, - "amazonQProperties": { - "shape": "AmazonQPropertiesPatch", - "internalonly": true - } - }, - "union": true - }, - "ConnectionPropertiesValueString": { - "type": "string", - "max": 2048, - "min": 1 - }, - "ConnectionScope": { - "type": "string", - "enum": ["DOMAIN", "PROJECT"] - }, - "ConnectionStatus": { - "type": "string", - "enum": [ - "CREATING", - "CREATE_FAILED", - "DELETING", - "DELETE_FAILED", - "READY", - "UPDATING", - "UPDATE_FAILED", - "DELETED", - "PLANNED" - ] - }, - "ConnectionSummaries": { - "type": "list", - "member": { - "shape": "ConnectionSummary" - } - }, - "ConnectionSummary": { - "type": "structure", - "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], - "members": { - "configurations": { - "shape": "Configurations", - "internalonly": true - }, - "connectionId": { - "shape": "ConnectionId" - }, - "domainId": { - "shape": "DomainId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "ConnectionName" - }, - "physicalEndpoints": { - "shape": "PhysicalEndpoints" - }, - "projectId": { - "shape": "ProjectId" - }, - "props": { - "shape": "ConnectionPropertiesOutput" - }, - "credentialId": { - "shape": "CredentialId", - "internalonly": true - }, - "type": { - "shape": "ConnectionType" - }, - "scope": { - "shape": "ConnectionScope", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "ConnectionType": { - "type": "string", - "enum": [ - "ATHENA", - "BIGQUERY", - "DATABRICKS", - "DOCUMENTDB", - "DYNAMODB", - "GIT", - "HYPERPOD", - "IAM", - "MYSQL", - "OPENSEARCH", - "ORACLE", - "POSTGRESQL", - "REDSHIFT", - "SAPHANA", - "SNOWFLAKE", - "SPARK", - "SQL", - "SQLSERVER", - "TERADATA", - "VERTICA", - "WORKFLOWS_MWAA", - "S3_FOLDER", - "LAKEHOUSE", - "S3", - "KINESIS", - "MSK", - "AMAZON_Q", - "ICEBERGRESTCATALOG", - "SNOWFLAKEICEBERGRESTCATALOG", - "DATABRICKSICEBERGRESTCATALOG", - "MLFLOW" - ] - }, - "ConnectivityProperties": { - "type": "structure", - "members": { - "connectionProperties": { - "shape": "ConnectionProperties" - }, - "physicalConnectionRequirements": { - "shape": "PhysicalConnectionRequirements" - }, - "name": { - "shape": "ConnectivityPropertiesNameString" - }, - "description": { - "shape": "ConnectivityPropertiesDescriptionString" - }, - "matchCriteria": { - "shape": "ConnectivityPropertiesMatchCriteriaString" - }, - "validateCredentials": { - "shape": "Boolean" - }, - "validateForComputeEnvironments": { - "shape": "ComputeEnvironmentsList" - }, - "sparkProperties": { - "shape": "PropertyMap" - }, - "athenaProperties": { - "shape": "PropertyMap" - }, - "pythonProperties": { - "shape": "PropertyMap" - }, - "authenticationConfiguration": { - "shape": "AuthenticationConfigurationInput" - } - } - }, - "ConnectivityPropertiesDescriptionString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\r\\n\\t]*" - }, - "ConnectivityPropertiesMatchCriteriaString": { - "type": "string", - "max": 10, - "min": 0 - }, - "ConnectivityPropertiesNameString": { - "type": "string", - "max": 41, - "min": 1, - "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" - }, - "ConnectivityPropertiesPatch": { - "type": "structure", - "members": { - "description": { - "shape": "ConnectivityPropertiesPatchDescriptionString" - }, - "connectionProperties": { - "shape": "ConnectionProperties" - }, - "authenticationConfiguration": { - "shape": "AuthenticationConfigurationPatch" - } - } - }, - "ConnectivityPropertiesPatchDescriptionString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "[\\S\\s]*", - "sensitive": true - }, - "ConsumersEnabledRegionList": { - "type": "list", - "member": { - "shape": "AwsRegion" - }, - "min": 0 - }, - "Cookie": { - "type": "string", - "max": 4096, - "min": 1, - "sensitive": true - }, - "CreateAccountPoolInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "resolutionStrategy", "accountSource"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "AccountPoolName" - }, - "description": { - "shape": "Description" - }, - "resolutionStrategy": { - "shape": "ResolutionStrategy" - }, - "accountSource": { - "shape": "AccountSource" - } - } - }, - "CreateAccountPoolOutput": { - "type": "structure", - "required": ["accountSource", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "AccountPoolName" - }, - "id": { - "shape": "AccountPoolId" - }, - "description": { - "shape": "Description" - }, - "resolutionStrategy": { - "shape": "ResolutionStrategy" - }, - "accountSource": { - "shape": "AccountSource" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainUnitId": { - "shape": "DomainUnitId" - } - } - }, - "CreateAssetFilterInput": { - "type": "structure", - "required": ["domainIdentifier", "assetIdentifier", "name", "configuration"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "assetIdentifier": { - "shape": "AssetId", - "location": "uri", - "locationName": "assetIdentifier" - }, - "name": { - "shape": "FilterName" - }, - "description": { - "shape": "Description" - }, - "configuration": { - "shape": "AssetFilterConfiguration" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "CreateAssetFilterOutput": { - "type": "structure", - "required": ["id", "domainId", "assetId", "name", "configuration"], - "members": { - "id": { - "shape": "FilterId" - }, - "domainId": { - "shape": "DomainId" - }, - "assetId": { - "shape": "AssetId" - }, - "name": { - "shape": "FilterName" - }, - "description": { - "shape": "Description" - }, - "status": { - "shape": "FilterStatus" - }, - "configuration": { - "shape": "AssetFilterConfiguration" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "errorMessage": { - "shape": "String" - }, - "effectiveColumnNames": { - "shape": "ColumnNameList" - }, - "effectiveRowFilter": { - "shape": "String" - } - } - }, - "CreateAssetInput": { - "type": "structure", - "required": ["name", "domainIdentifier", "typeIdentifier", "owningProjectIdentifier"], - "members": { - "name": { - "shape": "AssetName" - }, - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "externalIdentifier": { - "shape": "ExternalIdentifier" - }, - "typeIdentifier": { - "shape": "AssetTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "formsInput": { - "shape": "CreateAssetInputFormsInputList" - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - }, - "predictionConfiguration": { - "shape": "PredictionConfiguration" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateAssetInputFormsInputList": { - "type": "list", - "member": { - "shape": "FormInput" - }, - "max": 20, - "min": 0, - "sensitive": true - }, - "CreateAssetOutput": { - "type": "structure", - "required": [ - "id", - "name", - "typeIdentifier", - "typeRevision", - "revision", - "owningProjectId", - "domainId", - "formsOutput" - ], - "members": { - "id": { - "shape": "AssetId" - }, - "name": { - "shape": "AssetName" - }, - "typeIdentifier": { - "shape": "AssetTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "externalIdentifier": { - "shape": "ExternalIdentifier" - }, - "revision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "governedGlossaryTerms": { - "shape": "CreateAssetOutputGovernedGlossaryTermsList" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "domainId": { - "shape": "DomainId" - }, - "listing": { - "shape": "AssetListingDetails" - }, - "formsOutput": { - "shape": "CreateAssetOutputFormsOutputList" - }, - "readOnlyFormsOutput": { - "shape": "FormOutputList" - }, - "latestTimeSeriesDataPointFormsOutput": { - "shape": "TimeSeriesDataPointSummaryFormOutputList" - }, - "predictionConfiguration": { - "shape": "PredictionConfiguration" - } - } - }, - "CreateAssetOutputFormsOutputList": { - "type": "list", - "member": { - "shape": "FormOutput" - }, - "max": 20, - "min": 0 - }, - "CreateAssetOutputGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 20, - "min": 0 - }, - "CreateAssetRevisionInput": { - "type": "structure", - "required": ["name", "domainIdentifier", "identifier"], - "members": { - "name": { - "shape": "AssetName" - }, - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "formsInput": { - "shape": "CreateAssetRevisionInputFormsInputList" - }, - "predictionConfiguration": { - "shape": "PredictionConfiguration" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateAssetRevisionInputFormsInputList": { - "type": "list", - "member": { - "shape": "FormInput" - }, - "max": 20, - "min": 0, - "sensitive": true - }, - "CreateAssetRevisionOutput": { - "type": "structure", - "required": [ - "id", - "name", - "typeIdentifier", - "typeRevision", - "revision", - "owningProjectId", - "domainId", - "formsOutput" - ], - "members": { - "id": { - "shape": "AssetId" - }, - "name": { - "shape": "AssetName" - }, - "typeIdentifier": { - "shape": "AssetTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "externalIdentifier": { - "shape": "ExternalIdentifier" - }, - "revision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "governedGlossaryTerms": { - "shape": "CreateAssetRevisionOutputGovernedGlossaryTermsList" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "domainId": { - "shape": "DomainId" - }, - "listing": { - "shape": "AssetListingDetails" - }, - "formsOutput": { - "shape": "CreateAssetRevisionOutputFormsOutputList" - }, - "readOnlyFormsOutput": { - "shape": "FormOutputList" - }, - "latestTimeSeriesDataPointFormsOutput": { - "shape": "TimeSeriesDataPointSummaryFormOutputList" - }, - "predictionConfiguration": { - "shape": "PredictionConfiguration" - } - } - }, - "CreateAssetRevisionOutputFormsOutputList": { - "type": "list", - "member": { - "shape": "FormOutput" - }, - "max": 20, - "min": 0 - }, - "CreateAssetRevisionOutputGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 20, - "min": 0 - }, - "CreateAssetTypeInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "formsInput", "owningProjectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "TypeName" - }, - "description": { - "shape": "Description" - }, - "formsInput": { - "shape": "FormsInputMap" - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - } - } - }, - "CreateAssetTypeOutput": { - "type": "structure", - "required": ["domainId", "name", "revision", "formsOutput"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "TypeName" - }, - "revision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "formsOutput": { - "shape": "FormsOutputMap" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "originDomainId": { - "shape": "DomainId" - }, - "originProjectId": { - "shape": "ProjectId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - } - } - }, - "CreateAssetTypePolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateConnectionInput": { - "type": "structure", - "required": ["domainIdentifier", "name"], - "members": { - "awsLocation": { - "shape": "AwsLocation" - }, - "clientToken": { - "shape": "CreateConnectionInputClientTokenString", - "idempotencyToken": true - }, - "configurations": { - "shape": "Configurations", - "internalonly": true - }, - "description": { - "shape": "CreateConnectionInputDescriptionString" - }, - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "ConnectionName" - }, - "props": { - "shape": "ConnectionPropertiesInput" - }, - "options": { - "shape": "ConnectionOptions", - "deprecated": true - }, - "scope": { - "shape": "ConnectionScope", - "internalonly": true - }, - "enableTrustedIdentityPropagation": { - "shape": "Boolean", - "internalonly": true - }, - "credentialId": { - "shape": "CredentialId", - "internalonly": true - } - } - }, - "CreateConnectionInputClientTokenString": { - "type": "string", - "max": 128, - "min": 0, - "pattern": "[\\S]*" - }, - "CreateConnectionInputDescriptionString": { - "type": "string", - "max": 128, - "min": 0, - "pattern": "[\\S\\s]*", - "sensitive": true - }, - "CreateConnectionOutput": { - "type": "structure", - "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], - "members": { - "connectionId": { - "shape": "ConnectionId" - }, - "configurations": { - "shape": "Configurations", - "internalonly": true - }, - "description": { - "shape": "Description" - }, - "domainId": { - "shape": "DomainId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "ConnectionName" - }, - "physicalEndpoints": { - "shape": "PhysicalEndpoints" - }, - "projectId": { - "shape": "ProjectId" - }, - "props": { - "shape": "ConnectionPropertiesOutput" - }, - "type": { - "shape": "ConnectionType" - }, - "scope": { - "shape": "ConnectionScope", - "internalonly": true - }, - "credentialId": { - "shape": "CredentialId", - "internalonly": true - } - } - }, - "CreateDataProductInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "owningProjectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "DataProductName" - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - }, - "description": { - "shape": "DataProductDescription" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "formsInput": { - "shape": "FormInputList" - }, - "items": { - "shape": "DataProductItems" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateDataProductOutput": { - "type": "structure", - "required": ["domainId", "id", "revision", "owningProjectId", "name", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DataProductId" - }, - "revision": { - "shape": "Revision" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "name": { - "shape": "DataProductName" - }, - "status": { - "shape": "DataProductStatus" - }, - "description": { - "shape": "DataProductDescription" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "items": { - "shape": "DataProductItems" - }, - "formsOutput": { - "shape": "FormOutputList" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - } - } - }, - "CreateDataProductRevisionInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier", "name"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataProductId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "DataProductName" - }, - "description": { - "shape": "DataProductDescription" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "items": { - "shape": "DataProductItems" - }, - "formsInput": { - "shape": "FormInputList" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateDataProductRevisionOutput": { - "type": "structure", - "required": ["domainId", "id", "revision", "owningProjectId", "name", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DataProductId" - }, - "revision": { - "shape": "Revision" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "name": { - "shape": "DataProductName" - }, - "status": { - "shape": "DataProductStatus" - }, - "description": { - "shape": "DataProductDescription" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "items": { - "shape": "DataProductItems" - }, - "formsOutput": { - "shape": "FormOutputList" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - } - } - }, - "CreateDataSourceInput": { - "type": "structure", - "required": ["name", "domainIdentifier", "projectIdentifier", "type"], - "members": { - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "CreateDataSourceInputProjectIdentifierString" - }, - "environmentIdentifier": { - "shape": "CreateDataSourceInputEnvironmentIdentifierString" - }, - "connectionIdentifier": { - "shape": "CreateDataSourceInputConnectionIdentifierString" - }, - "type": { - "shape": "CreateDataSourceInputTypeString" - }, - "configuration": { - "shape": "DataSourceConfigurationInput" - }, - "recommendation": { - "shape": "RecommendationConfiguration" - }, - "enableSetting": { - "shape": "EnableSetting" - }, - "schedule": { - "shape": "ScheduleConfiguration" - }, - "publishOnImport": { - "shape": "Boolean" - }, - "assetFormsInput": { - "shape": "FormInputList" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "CreateDataSourceInputConnectionIdentifierString": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "CreateDataSourceInputEnvironmentIdentifierString": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "CreateDataSourceInputProjectIdentifierString": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "CreateDataSourceInputTypeString": { - "type": "string", - "max": 256, - "min": 1 - }, - "CreateDataSourceOutput": { - "type": "structure", - "required": ["id", "name", "domainId", "projectId"], - "members": { - "id": { - "shape": "DataSourceId" - }, - "status": { - "shape": "DataSourceStatus" - }, - "type": { - "shape": "String" - }, - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "connectionId": { - "shape": "String" - }, - "configuration": { - "shape": "DataSourceConfigurationOutput" - }, - "recommendation": { - "shape": "RecommendationConfiguration" - }, - "enableSetting": { - "shape": "EnableSetting" - }, - "publishOnImport": { - "shape": "Boolean" - }, - "assetFormsOutput": { - "shape": "FormOutputList" - }, - "schedule": { - "shape": "ScheduleConfiguration" - }, - "lastRunStatus": { - "shape": "DataSourceRunStatus" - }, - "lastRunAt": { - "shape": "DateTime" - }, - "lastRunErrorMessage": { - "shape": "DataSourceErrorMessage" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - } - } - }, - "CreateDomainInput": { - "type": "structure", - "required": ["name"], - "members": { - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "singleSignOn": { - "shape": "SingleSignOn" - }, - "domainExecutionRole": { - "shape": "RoleArn" - }, - "kmsKeyIdentifier": { - "shape": "KmsKeyArn" - }, - "tags": { - "shape": "Tags" - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "domainServiceRole": { - "shape": "AdminApiRoleArn", - "deprecated": true, - "deprecatedMessage": "This shape is no longer used. Use ServiceRole.", - "internalonly": true - }, - "serviceRole": { - "shape": "AdminApiRoleArn" - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "CreateDomainOutput": { - "type": "structure", - "required": ["id"], - "members": { - "id": { - "shape": "DomainId" - }, - "rootDomainUnitId": { - "shape": "DomainUnitId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "singleSignOn": { - "shape": "SingleSignOn" - }, - "domainExecutionRole": { - "shape": "RoleArn" - }, - "arn": { - "shape": "String" - }, - "kmsKeyIdentifier": { - "shape": "KmsKeyArn" - }, - "status": { - "shape": "DomainStatus" - }, - "portalUrl": { - "shape": "String" - }, - "tags": { - "shape": "Tags" - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "domainServiceRole": { - "shape": "AdminApiRoleArn", - "internalonly": true - }, - "serviceRole": { - "shape": "AdminApiRoleArn" - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "CreateDomainPolicyInput": { - "type": "structure", - "required": ["domainId", "name", "owningProjectId", "policyType", "policyContent"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "policyType": { - "shape": "PolicyType" - }, - "policyContent": { - "shape": "PolicyContent" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "CreateDomainPolicyOutput": { - "type": "structure", - "required": ["policyId"], - "members": { - "policyId": { - "shape": "PolicyId" - } - } - }, - "CreateDomainUnitInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "parentDomainUnitIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "DomainUnitName" - }, - "parentDomainUnitIdentifier": { - "shape": "DomainUnitId" - }, - "description": { - "shape": "DomainUnitDescription" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateDomainUnitOutput": { - "type": "structure", - "required": ["id", "domainId", "name", "owners", "ancestorDomainUnitIds"], - "members": { - "id": { - "shape": "DomainUnitId" - }, - "domainUnitId": { - "shape": "DomainUnitId", - "internalonly": true - }, - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "DomainUnitName" - }, - "parentDomainUnitId": { - "shape": "DomainUnitId" - }, - "description": { - "shape": "DomainUnitDescription" - }, - "owners": { - "shape": "DomainUnitOwners" - }, - "ancestorDomainUnitIds": { - "shape": "DomainUnitIds" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - } - } - }, - "CreateDomainUnitPolicyDetail": { - "type": "structure", - "members": { - "principal": { - "shape": "UserGroupPolicyPrincipal" - }, - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateDomainUnitPolicyDetails": { - "type": "list", - "member": { - "shape": "CreateDomainUnitPolicyDetail" - } - }, - "CreateDomainUnitPolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateDomainUnitPolicyInput": { - "type": "structure", - "required": ["domainIdentifier", "description", "policyTarget", "details"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "description": { - "shape": "String" - }, - "policyTarget": { - "shape": "PolicyTarget" - }, - "details": { - "shape": "Details" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateDomainUnitPolicyOutput": { - "type": "structure", - "required": ["id", "domainId", "description", "policyTarget", "details"], - "members": { - "id": { - "shape": "DomainUnitPolicyId" - }, - "domainId": { - "shape": "DomainId" - }, - "description": { - "shape": "String" - }, - "policyTarget": { - "shape": "PolicyTarget" - }, - "details": { - "shape": "Details" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - } - } - }, - "CreateEnvironmentActionInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "name", "parameters"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "name": { - "shape": "String" - }, - "parameters": { - "shape": "ActionParameters" - }, - "description": { - "shape": "String" - } - } - }, - "CreateEnvironmentActionOutput": { - "type": "structure", - "required": ["domainId", "environmentId", "id", "name", "parameters"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "id": { - "shape": "EnvironmentActionId" - }, - "name": { - "shape": "String" - }, - "parameters": { - "shape": "ActionParameters" - }, - "description": { - "shape": "String" - } - } - }, - "CreateEnvironmentBlueprintInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "provisioningProperties"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "EnvironmentBlueprintName" - }, - "description": { - "shape": "Description" - }, - "provider": { - "shape": "String", - "internalonly": true - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "provisioningPolicy": { - "shape": "ProvisioningPolicy", - "internalonly": true - }, - "deploymentProperties": { - "shape": "DeploymentProperties", - "internalonly": true - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms", - "internalonly": true - } - } - }, - "CreateEnvironmentBlueprintOutput": { - "type": "structure", - "required": ["id", "name", "provider", "provisioningProperties"], - "members": { - "id": { - "shape": "EnvironmentBlueprintId" - }, - "name": { - "shape": "EnvironmentBlueprintName" - }, - "description": { - "shape": "Description" - }, - "changeLog": { - "shape": "String", - "internalonly": true - }, - "provider": { - "shape": "String" - }, - "provisioningPolicy": { - "shape": "ProvisioningPolicy", - "internalonly": true - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "deploymentProperties": { - "shape": "DeploymentProperties" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "blueprintCategory": { - "shape": "String", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "CreateEnvironmentInput": { - "type": "structure", - "required": ["projectIdentifier", "domainIdentifier", "name"], - "members": { - "projectIdentifier": { - "shape": "ProjectId" - }, - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "description": { - "shape": "String" - }, - "name": { - "shape": "String" - }, - "environmentProfileIdentifier": { - "shape": "EnvironmentProfileId" - }, - "userParameters": { - "shape": "EnvironmentParametersList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "environmentAccountIdentifier": { - "shape": "String" - }, - "environmentAccountRegion": { - "shape": "String" - }, - "environmentBlueprintIdentifier": { - "shape": "String" - }, - "resourceConfigurationId": { - "shape": "ResourceConfigurationId", - "internalonly": true - }, - "deploymentOrder": { - "shape": "Integer", - "internalonly": true - }, - "environmentConfigurationId": { - "shape": "String", - "internalonly": true - } - } - }, - "CreateEnvironmentOutput": { - "type": "structure", - "required": ["projectId", "domainId", "createdBy", "name", "provider"], - "members": { - "projectId": { - "shape": "ProjectId" - }, - "id": { - "shape": "EnvironmentId" - }, - "domainId": { - "shape": "DomainId" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentName" - }, - "description": { - "shape": "Description" - }, - "environmentProfileId": { - "shape": "EnvironmentProfileId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "provider": { - "shape": "String" - }, - "provisionedResources": { - "shape": "ResourceList" - }, - "permittedResources": { - "shape": "ResourceList", - "internalonly": true - }, - "status": { - "shape": "EnvironmentStatus" - }, - "environmentActions": { - "shape": "EnvironmentActionList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "lastDeployment": { - "shape": "Deployment" - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "deploymentProperties": { - "shape": "DeploymentProperties" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "environmentConfigurationId": { - "shape": "EnvironmentConfigurationId", - "internalonly": true - } - } - }, - "CreateEnvironmentProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "environmentBlueprintIdentifier", "projectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "EnvironmentProfileName" - }, - "description": { - "shape": "Description" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId" - }, - "projectIdentifier": { - "shape": "ProjectId" - }, - "userParameters": { - "shape": "EnvironmentParametersList" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "resourceConfigurationId": { - "shape": "ResourceConfigurationId" - } - } - }, - "CreateEnvironmentProfileOutput": { - "type": "structure", - "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], - "members": { - "id": { - "shape": "EnvironmentProfileId" - }, - "domainId": { - "shape": "DomainId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentProfileName" - }, - "description": { - "shape": "Description" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "projectId": { - "shape": "ProjectId" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "resourceConfigurationId": { - "shape": "ResourceConfigurationId" - } - } - }, - "CreateEnvironmentProfilePolicyGrantDetail": { - "type": "structure", - "members": { - "domainUnitId": { - "shape": "DomainUnitId" - } - } - }, - "CreateFormTypeInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "model", "owningProjectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "FormTypeName" - }, - "model": { - "shape": "Model" - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - }, - "status": { - "shape": "FormTypeStatus" - }, - "description": { - "shape": "Description" - } - } - }, - "CreateFormTypeOutput": { - "type": "structure", - "required": ["domainId", "name", "revision"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "FormTypeName" - }, - "revision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "originDomainId": { - "shape": "DomainId" - }, - "originProjectId": { - "shape": "ProjectId" - } - } - }, - "CreateFormTypePolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateGlossaryInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "owningProjectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "GlossaryName" - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - }, - "description": { - "shape": "GlossaryDescription" - }, - "status": { - "shape": "GlossaryStatus" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateGlossaryOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GlossaryId" - }, - "name": { - "shape": "GlossaryName" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "description": { - "shape": "GlossaryDescription" - }, - "status": { - "shape": "GlossaryStatus" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - } - } - }, - "CreateGlossaryPolicyDetail": { - "type": "structure", - "members": { - "principal": { - "shape": "UserGroupPolicyPrincipal" - }, - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateGlossaryPolicyDetails": { - "type": "list", - "member": { - "shape": "CreateGlossaryPolicyDetail" - } - }, - "CreateGlossaryPolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateGlossaryTermInput": { - "type": "structure", - "required": ["domainIdentifier", "glossaryIdentifier", "name"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "glossaryIdentifier": { - "shape": "GlossaryTermId" - }, - "name": { - "shape": "GlossaryTermName" - }, - "status": { - "shape": "GlossaryTermStatus" - }, - "shortDescription": { - "shape": "ShortDescription" - }, - "longDescription": { - "shape": "LongDescription" - }, - "termRelations": { - "shape": "TermRelations" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateGlossaryTermOutput": { - "type": "structure", - "required": ["id", "domainId", "glossaryId", "name", "status"], - "members": { - "id": { - "shape": "GlossaryTermId" - }, - "domainId": { - "shape": "DomainId" - }, - "glossaryId": { - "shape": "GlossaryId" - }, - "name": { - "shape": "GlossaryTermName" - }, - "status": { - "shape": "GlossaryTermStatus" - }, - "shortDescription": { - "shape": "ShortDescription" - }, - "longDescription": { - "shape": "LongDescription" - }, - "termRelations": { - "shape": "TermRelations" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - } - } - }, - "CreateGroupProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "groupIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "groupIdentifier": { - "shape": "GroupIdentifier" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "CreateGroupProfileOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GroupProfileId" - }, - "status": { - "shape": "GroupProfileStatus" - }, - "groupName": { - "shape": "GroupProfileName" - } - } - }, - "CreateListingChangeSetInput": { - "type": "structure", - "required": ["domainIdentifier", "entityIdentifier", "entityType", "action"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityIdentifier": { - "shape": "EntityIdentifier" - }, - "entityType": { - "shape": "EntityType" - }, - "entityRevision": { - "shape": "Revision" - }, - "action": { - "shape": "ChangeAction" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateListingChangeSetOutput": { - "type": "structure", - "required": ["listingId", "listingRevision", "status"], - "members": { - "listingId": { - "shape": "ListingId" - }, - "listingRevision": { - "shape": "Revision" - }, - "status": { - "shape": "ListingStatus" - } - } - }, - "CreatePartnerIntegrationInput": { - "type": "structure", - "required": ["name", "props"], - "members": { - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "props": { - "shape": "PartnerIntegrationPropertiesInput" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - }, - "internalonly": true - }, - "CreatePartnerIntegrationOutput": { - "type": "structure", - "required": ["id", "status", "partnerId", "name"], - "members": { - "id": { - "shape": "PartnerIntegrationId" - }, - "createdAt": { - "shape": "CreatedAtTimestamp" - }, - "updatedAt": { - "shape": "UpdatedAtTimestamp" - }, - "status": { - "shape": "PartnerIntegrationStatus" - }, - "partnerId": { - "shape": "PartnerId" - }, - "name": { - "shape": "Name" - }, - "props": { - "shape": "PartnerIntegrationPropertiesOutput" - } - }, - "internalonly": true - }, - "CreateProjectFromProjectProfilePolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - }, - "projectProfiles": { - "shape": "ProjectProfileList" - } - } - }, - "CreateProjectInput": { - "type": "structure", - "required": ["domainIdentifier", "name"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "ProjectName" - }, - "description": { - "shape": "Description" - }, - "tags": { - "shape": "Tags", - "internalonly": true - }, - "resourceTags": { - "shape": "CreateProjectInputResourceTagsMap" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "projectProfileId": { - "shape": "ProjectProfileId", - "internalonly": true - }, - "userParameters": { - "shape": "EnvironmentConfigurationUserParametersList", - "internalonly": true - }, - "customerProvidedRoleConfigs": { - "shape": "CustomerProvidedRoleConfigList", - "internalonly": true - }, - "membershipAssignments": { - "shape": "ProjectMembers", - "internalonly": true - } - } - }, - "CreateProjectInputResourceTagsMap": { - "type": "map", - "key": { - "shape": "TagKey" - }, - "value": { - "shape": "TagValue" - }, - "max": 25, - "min": 0 - }, - "CreateProjectMembershipInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier", "member"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "projectIdentifier" - }, - "member": { - "shape": "Member" - }, - "designation": { - "shape": "UserDesignation" - }, - "designationId": { - "shape": "DesignationId", - "internalonly": true - } - } - }, - "CreateProjectMembershipOutput": { - "type": "structure", - "members": {} - }, - "CreateProjectMembershipRequestInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier", "requestedDesignation", "reasonDescription"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "projectIdentifier" - }, - "requestedDesignation": { - "shape": "UserDesignation" - }, - "reasonDescription": { - "shape": "ReasonDescription" - }, - "requesterId": { - "shape": "String" - } - } - }, - "CreateProjectMembershipRequestOutput": { - "type": "structure", - "required": [ - "domainId", - "projectId", - "requestId", - "requestedDesignation", - "reasonDescription", - "requesterId" - ], - "members": { - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "requestId": { - "shape": "RequestId" - }, - "requestedDesignation": { - "shape": "UserDesignation" - }, - "requestStatus": { - "shape": "RequestStatus" - }, - "reasonDescription": { - "shape": "ReasonDescription" - }, - "requesterId": { - "shape": "String" - }, - "lastUpdatedBy": { - "shape": "String" - }, - "requestedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "CreateProjectOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectId" - }, - "name": { - "shape": "ProjectName" - }, - "description": { - "shape": "Description" - }, - "projectStatus": { - "shape": "ProjectStatus", - "documentation": "

Status of the project

" - }, - "failureReasons": { - "shape": "FailureReasons", - "documentation": "

Reasons for failed project deletion

" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "tags": { - "shape": "Tags", - "internalonly": true - }, - "resourceTags": { - "shape": "ResourceTags" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "projectProfileId": { - "shape": "ProjectProfileId", - "internalonly": true - }, - "userParameters": { - "shape": "EnvironmentConfigurationUserParametersList", - "internalonly": true - }, - "environmentDeploymentDetails": { - "shape": "EnvironmentDeploymentDetails", - "internalonly": true - }, - "projectCategory": { - "shape": "String", - "internalonly": true - } - } - }, - "CreateProjectPolicyDetail": { - "type": "structure", - "members": { - "principal": { - "shape": "UserGroupPolicyPrincipal" - }, - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateProjectPolicyDetails": { - "type": "list", - "member": { - "shape": "CreateProjectPolicyDetail" - } - }, - "CreateProjectPolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "CreateProjectProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "name"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "ProjectProfileName" - }, - "description": { - "shape": "Description" - }, - "status": { - "shape": "Status" - }, - "projectResourceTags": { - "shape": "ProjectResourceTagParameters" - }, - "allowCustomProjectResourceTags": { - "shape": "Boolean" - }, - "projectScopes": { - "shape": "ProjectScopesList", - "internalonly": true - }, - "environmentConfigurations": { - "shape": "EnvironmentConfigurationsList" - }, - "domainUnitIdentifier": { - "shape": "DomainUnitId" - }, - "designationConfigurations": { - "shape": "DesignationConfigurations", - "internalonly": true - } - } - }, - "CreateProjectProfileOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectProfileId" - }, - "name": { - "shape": "ProjectProfileName" - }, - "description": { - "shape": "Description" - }, - "changeLog": { - "shape": "String", - "internalonly": true - }, - "status": { - "shape": "Status" - }, - "projectResourceTags": { - "shape": "ProjectResourceTagParameters" - }, - "allowCustomProjectResourceTags": { - "shape": "Boolean" - }, - "projectScopes": { - "shape": "ProjectScopesList", - "internalonly": true - }, - "environmentConfigurations": { - "shape": "EnvironmentConfigurationsList" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "designationConfigurations": { - "shape": "DesignationConfigurations", - "internalonly": true - } - } - }, - "CreateRuleInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "target", "action", "scope", "detail"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "RuleName" - }, - "target": { - "shape": "RuleTarget" - }, - "action": { - "shape": "RuleAction" - }, - "scope": { - "shape": "RuleScope" - }, - "detail": { - "shape": "RuleDetail" - }, - "description": { - "shape": "Description" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "CreateRuleOutput": { - "type": "structure", - "required": [ - "identifier", - "name", - "ruleType", - "target", - "action", - "scope", - "detail", - "createdAt", - "createdBy" - ], - "members": { - "identifier": { - "shape": "RuleId" - }, - "name": { - "shape": "RuleName" - }, - "ruleType": { - "shape": "RuleType" - }, - "target": { - "shape": "RuleTarget" - }, - "action": { - "shape": "RuleAction" - }, - "scope": { - "shape": "RuleScope" - }, - "detail": { - "shape": "RuleDetail" - }, - "targetType": { - "shape": "RuleTargetType" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - } - } - }, - "CreateServiceLinkInput": { - "type": "structure", - "required": ["domainIdentifier", "name", "owningProjectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "ServiceLinkName" - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - }, - "identityMapping": { - "shape": "ServiceLinkIdentityMapping" - }, - "configurationInput": { - "shape": "ServiceLinkConfigurationInput" - } - }, - "internalonly": true - }, - "CreateServiceLinkOutput": { - "type": "structure", - "required": [ - "id", - "domainId", - "owningProjectId", - "domainUnitId", - "createdAt", - "updatedAt", - "status", - "type", - "name", - "createdBy", - "updatedBy", - "glueConnectionArn", - "serviceRoleArn", - "identityMapping", - "delegations", - "configurationOutput" - ], - "members": { - "id": { - "shape": "ServiceLinkId" - }, - "domainId": { - "shape": "DomainId" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "status": { - "shape": "ServiceLinkStatus" - }, - "type": { - "shape": "ServiceLinkType" - }, - "name": { - "shape": "ServiceLinkName" - }, - "error": { - "shape": "ServiceLinkError" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "glueConnectionArn": { - "shape": "String" - }, - "serviceRoleArn": { - "shape": "RoleArn" - }, - "identityMapping": { - "shape": "ServiceLinkIdentityMapping" - }, - "delegations": { - "shape": "ServiceLinkDelegations" - }, - "configurationOutput": { - "shape": "ServiceLinkConfigurationOutput" - } - }, - "internalonly": true - }, - "CreateSubscriptionGrantInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "grantedEntity"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId" - }, - "subscriptionTargetIdentifier": { - "shape": "SubscriptionTargetId" - }, - "grantedEntity": { - "shape": "GrantedEntityInput" - }, - "assetTargetNames": { - "shape": "AssetTargetNames" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "CreateSubscriptionGrantOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "createdAt", - "updatedAt", - "subscriptionTargetId", - "grantedEntity", - "status" - ], - "members": { - "id": { - "shape": "SubscriptionGrantId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "environmentId": { - "shape": "EnvironmentId", - "internalonly": true - }, - "subscriptionTargetId": { - "shape": "SubscriptionTargetId" - }, - "grantedEntity": { - "shape": "GrantedEntity" - }, - "status": { - "shape": "SubscriptionGrantOverallStatus" - }, - "assets": { - "shape": "SubscribedAssets" - }, - "subscriptionId": { - "shape": "SubscriptionId", - "deprecated": true, - "deprecatedMessage": "Multiple subscriptions can exist for a single grant" - } - } - }, - "CreateSubscriptionRequestInput": { - "type": "structure", - "required": ["domainIdentifier", "subscribedPrincipals", "subscribedListings"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "subscribedPrincipals": { - "shape": "SubscribedPrincipalInputs" - }, - "subscribedListings": { - "shape": "SubscribedListingInputs" - }, - "requestReason": { - "shape": "RequestReason" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - }, - "metadataForms": { - "shape": "MetadataFormInputs" - }, - "assetPermissions": { - "shape": "AssetPermissions" - }, - "assetScopes": { - "shape": "AcceptedAssetScopes" - } - } - }, - "CreateSubscriptionRequestOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "requestReason", - "subscribedPrincipals", - "subscribedListings" - ], - "members": { - "id": { - "shape": "SubscriptionRequestId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionRequestStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "requestReason": { - "shape": "RequestReason" - }, - "subscribedPrincipals": { - "shape": "CreateSubscriptionRequestOutputSubscribedPrincipalsList" - }, - "subscribedListings": { - "shape": "CreateSubscriptionRequestOutputSubscribedListingsList" - }, - "reviewerId": { - "shape": "String" - }, - "decisionComment": { - "shape": "DecisionComment" - }, - "existingSubscriptionId": { - "shape": "SubscriptionId" - }, - "metadataForms": { - "shape": "MetadataForms" - } - } - }, - "CreateSubscriptionRequestOutputSubscribedListingsList": { - "type": "list", - "member": { - "shape": "SubscribedListing" - }, - "max": 1, - "min": 1 - }, - "CreateSubscriptionRequestOutputSubscribedPrincipalsList": { - "type": "list", - "member": { - "shape": "SubscribedPrincipal" - }, - "max": 1, - "min": 1 - }, - "CreateSubscriptionTargetInput": { - "type": "structure", - "required": [ - "domainIdentifier", - "environmentIdentifier", - "name", - "type", - "authorizedPrincipals", - "applicableAssetTypes" - ], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "name": { - "shape": "SubscriptionTargetName" - }, - "type": { - "shape": "String" - }, - "subscriptionTargetConfig": { - "shape": "SubscriptionTargetForms" - }, - "authorizedPrincipals": { - "shape": "AuthorizedPrincipalIdentifiers" - }, - "manageAccessRole": { - "shape": "IamRoleArn" - }, - "applicableAssetTypes": { - "shape": "ApplicableAssetTypes" - }, - "provider": { - "shape": "String" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - }, - "timeoutMinutes": { - "shape": "CreateSubscriptionTargetInputTimeoutMinutesInteger" - } - } - }, - "CreateSubscriptionTargetInputTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "min": 1 - }, - "CreateSubscriptionTargetOutput": { - "type": "structure", - "required": [ - "id", - "authorizedPrincipals", - "domainId", - "projectId", - "environmentId", - "name", - "type", - "createdBy", - "createdAt", - "applicableAssetTypes", - "subscriptionTargetConfig", - "provider" - ], - "members": { - "id": { - "shape": "SubscriptionTargetId" - }, - "authorizedPrincipals": { - "shape": "AuthorizedPrincipalIdentifiers" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "SubscriptionTargetName" - }, - "type": { - "shape": "String" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "manageAccessRole": { - "shape": "IamRoleArn" - }, - "applicableAssetTypes": { - "shape": "ApplicableAssetTypes" - }, - "subscriptionTargetConfig": { - "shape": "SubscriptionTargetForms" - }, - "provider": { - "shape": "String" - }, - "timeoutMinutes": { - "shape": "CreateSubscriptionTargetOutputTimeoutMinutesInteger" - } - } - }, - "CreateSubscriptionTargetOutputTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "min": 1 - }, - "CreateUserProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "userIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "userIdentifier": { - "shape": "UserIdentifier" - }, - "userType": { - "shape": "UserType" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "CreateUserProfileOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "UserProfileId" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "CreatedAt": { - "type": "timestamp" - }, - "CreatedAtTimestamp": { - "type": "timestamp", - "timestampFormat": "iso8601" - }, - "CreatedBy": { - "type": "string" - }, - "CredentialId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "CredentialMap": { - "type": "map", - "key": { - "shape": "CredentialMapKeyString" - }, - "value": { - "shape": "CredentialMapValueString" - }, - "sensitive": true - }, - "CredentialMapKeyString": { - "type": "string", - "max": 128, - "min": 1 - }, - "CredentialMapValueString": { - "type": "string", - "max": 4096, - "min": 1 - }, - "CronString": { - "type": "string", - "max": 256, - "min": 1, - "pattern": ".*cron\\((\\b[0-5]?[0-9]\\b) (\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\).*" - }, - "CustomAccountPoolHandler": { - "type": "structure", - "required": ["lambdaFunctionArn"], - "members": { - "lambdaFunctionArn": { - "shape": "LambdaFunctionArn" - }, - "lambdaExecutionRoleArn": { - "shape": "LambdaExecutionRoleArn" - } - } - }, - "CustomParameter": { - "type": "structure", - "required": ["keyName", "fieldType"], - "members": { - "keyName": { - "shape": "CustomParameterKeyNameString" - }, - "description": { - "shape": "Description" - }, - "fieldType": { - "shape": "String" - }, - "defaultValue": { - "shape": "String" - }, - "isEditable": { - "shape": "Boolean" - }, - "isOptional": { - "shape": "Boolean" - }, - "isUpdateSupported": { - "shape": "Boolean" - } - } - }, - "CustomParameterKeyNameString": { - "type": "string", - "pattern": "[a-zA-Z_][a-zA-Z0-9_]*" - }, - "CustomParameterList": { - "type": "list", - "member": { - "shape": "CustomParameter" - } - }, - "CustomResourceProperties": { - "type": "structure", - "members": { - "name": { - "shape": "String" - } - } - }, - "CustomerProvidedRoleConfig": { - "type": "structure", - "required": ["roleArn"], - "members": { - "roleArn": { - "shape": "CustomerProvidedRoleConfigRoleArnString" - }, - "roleDesignation": { - "shape": "CustomerProvidedRoleConfigRoleDesignationString" - } - }, - "internalonly": true - }, - "CustomerProvidedRoleConfigList": { - "type": "list", - "member": { - "shape": "CustomerProvidedRoleConfig" - }, - "internalonly": true - }, - "CustomerProvidedRoleConfigRoleArnString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role|role/aws-reserved/sso.amazonaws.com)/[\\w+=,.@-]*" - }, - "CustomerProvidedRoleConfigRoleDesignationString": { - "type": "string", - "max": 64, - "min": 0, - "pattern": "[\\w -]+" - }, - "DataAssetActivityStatus": { - "type": "string", - "enum": [ - "FAILED", - "PUBLISHING_FAILED", - "SUCCEEDED_CREATED", - "SUCCEEDED_UPDATED", - "SKIPPED_ALREADY_IMPORTED", - "SKIPPED_ARCHIVED", - "SKIPPED_NO_ACCESS", - "UNCHANGED" - ] - }, - "DataAssetIngestionDetail": { - "type": "structure", - "required": ["status", "externalIdentifier"], - "members": { - "id": { - "shape": "AssetId" - }, - "status": { - "shape": "DataAssetActivityStatus" - }, - "revision": { - "shape": "String" - }, - "externalIdentifier": { - "shape": "String" - }, - "errorType": { - "shape": "ErrorType" - }, - "errorDetail": { - "shape": "ErrorDetail" - } - } - }, - "DataAssetIngestionDetails": { - "type": "list", - "member": { - "shape": "DataAssetIngestionDetail" - }, - "max": 500, - "min": 0 - }, - "DataPointIdentifier": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{0,36}" - }, - "DataProductDescription": { - "type": "string", - "max": 4096, - "min": 1, - "sensitive": true - }, - "DataProductId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "DataProductItem": { - "type": "structure", - "required": ["itemType", "identifier"], - "members": { - "itemType": { - "shape": "DataProductItemType" - }, - "identifier": { - "shape": "EntityIdentifier" - }, - "revision": { - "shape": "Revision" - }, - "glossaryTerms": { - "shape": "ItemGlossaryTerms" - } - } - }, - "DataProductItemAdditionalAttributes": { - "type": "structure", - "members": { - "matchRationale": { - "shape": "MatchRationale" - } - } - }, - "DataProductItemCountsMap": { - "type": "map", - "key": { - "shape": "DataProductItemType" - }, - "value": { - "shape": "Integer" - }, - "internalonly": true - }, - "DataProductItemType": { - "type": "string", - "enum": ["ASSET"] - }, - "DataProductItems": { - "type": "list", - "member": { - "shape": "DataProductItem" - }, - "min": 1 - }, - "DataProductListing": { - "type": "structure", - "members": { - "dataProductId": { - "shape": "DataProductId" - }, - "dataProductRevision": { - "shape": "Revision" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "forms": { - "shape": "Forms" - }, - "dataProductFormsMetadata": { - "shape": "AssetFormMetadataList", - "internalonly": true - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "items": { - "shape": "ListingSummaries" - } - } - }, - "DataProductListingItem": { - "type": "structure", - "members": { - "listingId": { - "shape": "ListingId" - }, - "listingRevision": { - "shape": "Revision" - }, - "name": { - "shape": "DataProductName" - }, - "entityId": { - "shape": "DataProductId" - }, - "entityRevision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "listingCreatedAt": { - "shape": "CreatedAt", - "internalonly": true - }, - "listingUpdatedAt": { - "shape": "UpdatedAt", - "internalonly": true - }, - "listingCreatedBy": { - "shape": "CreatedBy" - }, - "listingUpdatedBy": { - "shape": "UpdatedBy" - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "additionalAttributes": { - "shape": "DataProductListingItemAdditionalAttributes" - }, - "items": { - "shape": "ListingSummaryItems" - } - } - }, - "DataProductListingItemAdditionalAttributes": { - "type": "structure", - "members": { - "forms": { - "shape": "Forms" - }, - "matchRationale": { - "shape": "MatchRationale" - } - }, - "sensitive": true - }, - "DataProductName": { - "type": "string", - "max": 64, - "min": 1, - "sensitive": true - }, - "DataProductResultItem": { - "type": "structure", - "required": ["domainId", "id", "name", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DataProductId" - }, - "name": { - "shape": "DataProductName" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "description": { - "shape": "DataProductDescription" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - }, - "itemCounts": { - "shape": "DataProductItemCountsMap", - "internalonly": true - }, - "additionalAttributes": { - "shape": "DataProductItemAdditionalAttributes" - } - } - }, - "DataProductRevision": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DataProductId" - }, - "revision": { - "shape": "Revision" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - } - } - }, - "DataProductRevisions": { - "type": "list", - "member": { - "shape": "DataProductRevision" - } - }, - "DataProductStatus": { - "type": "string", - "enum": ["CREATED", "CREATING", "CREATE_FAILED"] - }, - "DataSourceConfigurationInput": { - "type": "structure", - "members": { - "glueRunConfiguration": { - "shape": "GlueRunConfigurationInput" - }, - "redshiftRunConfiguration": { - "shape": "RedshiftRunConfigurationInput" - }, - "sageMakerRunConfiguration": { - "shape": "SageMakerRunConfigurationInput" - }, - "snowflakeRunConfiguration": { - "shape": "SnowflakeRunConfigurationInput", - "internalonly": true - }, - "databricksRunConfiguration": { - "shape": "DatabricksRunConfigurationInput", - "internalonly": true - }, - "kinesisRunConfiguration": { - "shape": "KinesisRunConfigurationInput", - "internalonly": true - }, - "mskRunConfiguration": { - "shape": "MskRunConfigurationInput", - "internalonly": true - } - }, - "union": true - }, - "DataSourceConfigurationOutput": { - "type": "structure", - "members": { - "glueRunConfiguration": { - "shape": "GlueRunConfigurationOutput" - }, - "redshiftRunConfiguration": { - "shape": "RedshiftRunConfigurationOutput" - }, - "sageMakerRunConfiguration": { - "shape": "SageMakerRunConfigurationOutput" - }, - "snowflakeRunConfiguration": { - "shape": "SnowflakeRunConfigurationOutput", - "internalonly": true - }, - "databricksRunConfiguration": { - "shape": "DatabricksRunConfigurationOutput", - "internalonly": true - }, - "kinesisRunConfiguration": { - "shape": "KinesisRunConfigurationOutput", - "internalonly": true - }, - "mskRunConfiguration": { - "shape": "MskRunConfigurationOutput", - "internalonly": true - } - }, - "union": true - }, - "DataSourceErrorMessage": { - "type": "structure", - "required": ["errorType"], - "members": { - "errorType": { - "shape": "DataSourceErrorType" - }, - "errorDetail": { - "shape": "String" - } - } - }, - "DataSourceErrorType": { - "type": "string", - "enum": [ - "ACCESS_DENIED_EXCEPTION", - "CONFLICT_EXCEPTION", - "INTERNAL_SERVER_EXCEPTION", - "RESOURCE_NOT_FOUND_EXCEPTION", - "SERVICE_QUOTA_EXCEEDED_EXCEPTION", - "THROTTLING_EXCEPTION", - "VALIDATION_EXCEPTION" - ] - }, - "DataSourceId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "DataSourceRunActivities": { - "type": "list", - "member": { - "shape": "DataSourceRunActivity" - } - }, - "DataSourceRunActivity": { - "type": "structure", - "required": [ - "database", - "dataSourceRunId", - "technicalName", - "dataAssetStatus", - "projectId", - "createdAt", - "updatedAt" - ], - "members": { - "database": { - "shape": "Name" - }, - "dataSourceRunId": { - "shape": "DataSourceRunId" - }, - "technicalName": { - "shape": "Name" - }, - "dataAssetStatus": { - "shape": "DataAssetActivityStatus" - }, - "projectId": { - "shape": "ProjectId" - }, - "dataAssetId": { - "shape": "String" - }, - "technicalDescription": { - "shape": "Description" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "lineageSummary": { - "shape": "LineageInfo" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - } - } - }, - "DataSourceRunCompletionStatus": { - "type": "string", - "enum": ["COMPLETED", "ABORTED", "TIMED_OUT"] - }, - "DataSourceRunId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "DataSourceRunLineageSummary": { - "type": "structure", - "members": { - "importStatus": { - "shape": "LineageImportStatus" - } - } - }, - "DataSourceRunStatus": { - "type": "string", - "enum": [ - "REQUESTED", - "RUNNING", - "FAILED", - "PARTIALLY_SUCCEEDED", - "SUCCESS", - "UPDATE_REQUESTED", - "UPDATING", - "UPDATE_FAILED", - "SKIPPED" - ] - }, - "DataSourceRunSummaries": { - "type": "list", - "member": { - "shape": "DataSourceRunSummary" - } - }, - "DataSourceRunSummary": { - "type": "structure", - "required": ["id", "dataSourceId", "type", "status", "projectId", "createdAt", "updatedAt"], - "members": { - "id": { - "shape": "DataSourceRunId" - }, - "dataSourceId": { - "shape": "DataSourceId" - }, - "type": { - "shape": "DataSourceRunType" - }, - "status": { - "shape": "DataSourceRunStatus" - }, - "projectId": { - "shape": "ProjectId" - }, - "runStatisticsForAssets": { - "shape": "RunStatisticsForAssets" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - }, - "startedAt": { - "shape": "DateTime" - }, - "stoppedAt": { - "shape": "DateTime" - }, - "lineageSummary": { - "shape": "DataSourceRunLineageSummary" - } - } - }, - "DataSourceRunType": { - "type": "string", - "enum": ["PRIORITIZED", "SCHEDULED"] - }, - "DataSourceStatus": { - "type": "string", - "enum": [ - "CREATING", - "FAILED_CREATION", - "READY", - "UPDATING", - "FAILED_UPDATE", - "RUNNING", - "DELETING", - "FAILED_DELETION" - ] - }, - "DataSourceSummaries": { - "type": "list", - "member": { - "shape": "DataSourceSummary" - } - }, - "DataSourceSummary": { - "type": "structure", - "required": ["domainId", "dataSourceId", "name", "type", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "String" - }, - "connectionId": { - "shape": "String" - }, - "dataSourceId": { - "shape": "DataSourceId" - }, - "name": { - "shape": "Name" - }, - "type": { - "shape": "String" - }, - "status": { - "shape": "DataSourceStatus" - }, - "enableSetting": { - "shape": "EnableSetting" - }, - "schedule": { - "shape": "ScheduleConfiguration" - }, - "lastRunStatus": { - "shape": "DataSourceRunStatus" - }, - "lastRunAt": { - "shape": "DateTime" - }, - "lastRunErrorMessage": { - "shape": "DataSourceErrorMessage" - }, - "lastRunAssetCount": { - "shape": "Integer" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - }, - "description": { - "shape": "Description" - } - } - }, - "DataZoneAction": { - "type": "string", - "enum": [ - "UPDATE_PROJECT", - "DELETE_PROJECT", - "CREATE_PROJECT_MEMBERSHIP", - "DELETE_PROJECT_MEMBERSHIP", - "UPDATE_GLOSSARY", - "DELETE_GLOSSARY", - "UPDATE_GLOSSARY_TERM", - "DELETE_GLOSSARY_TERM", - "RELATE_GLOSSARY_TERM", - "CREATE_LISTING_CHANGESET", - "DELETE_LISTING", - "CREATE_DATA_PRODUCT", - "CREATE_DATA_PRODUCT_REVISION", - "DELETE_DATA_PRODUCT", - "GET_DATA_PRODUCT", - "LIST_DATA_PRODUCT_REVISIONS", - "ACCEPT_PREDICTIONS", - "REJECT_PREDICTIONS", - "START_METADATA_GENERATION_RUN", - "GET_METADATA_GENERATION_RUN", - "CANCEL_METADATA_GENERATION_RUN", - "CREATE_DATA_SOURCE", - "UPDATE_DATA_SOURCE", - "DELETE_DATA_SOURCE", - "START_DATA_SOURCE_RUN", - "UPDATE_DATA_SOURCE_RUN_ACTIVITIES", - "POST_TIME_SERIES_DATA_POINTS", - "LIST_TIME_SERIES_DATA_POINTS", - "GET_TIME_SERIES_DATA_POINT", - "DELETE_TIME_SERIES_DATA_POINTS", - "DELETE_ENVIRONMENT", - "UPDATE_ENVIRONMENT", - "UPDATE_ENVIRONMENT_STATUS", - "GET_ENVIRONMENT_CREDENTIALS", - "GET_ENVIRONMENT_ACTION_LINK", - "ASSOCIATE_ENVIRONMENT_ROLE", - "DISASSOCIATE_ENVIRONMENT_ROLE", - "CREATE_ENVIRONMENT_ACTION", - "UPDATE_ENVIRONMENT_ACTION", - "DELETE_ENVIRONMENT_ACTION", - "GET_ENVIRONMENT_ACTION", - "LIST_ENVIRONMENT_ACTIONS", - "UPDATE_ENVIRONMENT_PROFILE", - "DELETE_ENVIRONMENT_PROFILE", - "CREATE_SUBSCRIPTION_GRANT", - "CREATE_SUBSCRIPTION_REQUEST", - "UPDATE_SUBSCRIPTION_REQUEST", - "ACCEPT_SUBSCRIPTION_REQUEST", - "REJECT_SUBSCRIPTION_REQUEST", - "DELETE_SUBSCRIPTION_REQUEST", - "DELETE_SUBSCRIPTION_GRANT", - "CANCEL_SUBSCRIPTION", - "REVOKE_SUBSCRIPTION", - "DELETE_FORM_TYPE", - "DELETE_ASSET_TYPE", - "CREATE_ASSET", - "CREATE_ASSET_REVISION", - "DELETE_ASSET", - "GET_ASSET", - "LIST_ASSET_REVISIONS", - "CREATE_ASSET_FILTER", - "GET_ASSET_FILTER", - "UPDATE_ASSET_FILTER", - "DELETE_ASSET_FILTER", - "LIST_ASSET_FILTERS", - "SEARCH", - "GET_ENVIRONMENT_ROLE", - "UPDATE_ENVIRONMENT_ROLE", - "LIST_ENVIRONMENT_ROLES", - "CREATE_CONNECTION", - "GET_CONNECTION", - "UPDATE_CONNECTION", - "DELETE_CONNECTION", - "LIST_CONNECTION", - "LIST_JOB_RUNS", - "GET_JOB_RUNS", - "ASSOCIATE_GOVERNED_TERMS", - "DISASSOCIATE_GOVERNED_TERMS" - ] - }, - "DataZoneDomainVersion": { - "type": "string", - "enum": ["V1", "V2"] - }, - "DataZoneEntityType": { - "type": "string", - "enum": ["DomainUnit", "DOMAIN_UNIT"] - }, - "DatabricksCredentials": { - "type": "structure", - "members": { - "oauth2": { - "shape": "OAuth2" - } - }, - "sensitive": true - }, - "DatabricksFilterConfiguration": { - "type": "structure", - "required": ["catalogName"], - "members": { - "catalogName": { - "shape": "DatabricksFilterConfigurationCatalogNameString" - }, - "schemaName": { - "shape": "DatabricksFilterConfigurationSchemaNameString" - }, - "filterExpressions": { - "shape": "FilterExpressions" - } - }, - "internalonly": true - }, - "DatabricksFilterConfigurationCatalogNameString": { - "type": "string", - "max": 255, - "min": 1 - }, - "DatabricksFilterConfigurationSchemaNameString": { - "type": "string", - "max": 255, - "min": 1 - }, - "DatabricksFilterConfigurations": { - "type": "list", - "member": { - "shape": "DatabricksFilterConfiguration" - }, - "internalonly": true - }, - "DatabricksPropertiesInput": { - "type": "structure", - "members": { - "credentials": { - "shape": "DatabricksCredentials" - }, - "glueConnectionName": { - "shape": "DatabricksPropertiesInputGlueConnectionNameString" - }, - "identityMapping": { - "shape": "IdentityMapping" - }, - "serviceRole": { - "shape": "String" - }, - "workspaceInstanceName": { - "shape": "DatabricksPropertiesInputWorkspaceInstanceNameString" - } - } - }, - "DatabricksPropertiesInputGlueConnectionNameString": { - "type": "string", - "max": 64, - "min": 0 - }, - "DatabricksPropertiesInputWorkspaceInstanceNameString": { - "type": "string", - "max": 64, - "min": 0 - }, - "DatabricksPropertiesOutput": { - "type": "structure", - "members": { - "identityMapping": { - "shape": "IdentityMapping" - }, - "serviceRole": { - "shape": "String" - }, - "status": { - "shape": "ConnectionStatus" - }, - "workspaceInstanceName": { - "shape": "String" - } - } - }, - "DatabricksRunConfigurationInput": { - "type": "structure", - "required": ["databricksFilterConfigurations"], - "members": { - "databricksFilterConfigurations": { - "shape": "DatabricksFilterConfigurations" - } - }, - "internalonly": true - }, - "DatabricksRunConfigurationOutput": { - "type": "structure", - "required": ["databricksFilterConfigurations"], - "members": { - "databricksFilterConfigurations": { - "shape": "DatabricksFilterConfigurations" - } - }, - "internalonly": true - }, - "DatabricksServiceLinkConfigurationInput": { - "type": "structure", - "required": ["accountId", "workspaceInstanceName", "credentials"], - "members": { - "accountId": { - "shape": "String" - }, - "workspaceInstanceName": { - "shape": "String" - }, - "credentials": { - "shape": "OAuth2Credentials" - } - }, - "internalonly": true - }, - "DatabricksServiceLinkConfigurationOutput": { - "type": "structure", - "required": ["accountId", "workspaceInstanceName"], - "members": { - "accountId": { - "shape": "String" - }, - "workspaceInstanceName": { - "shape": "String" - } - }, - "internalonly": true - }, - "DateTime": { - "type": "timestamp", - "timestampFormat": "iso8601" - }, - "DeactivatePortalVersion": { - "type": "string", - "enum": ["V1", "NONE"] - }, - "DecisionComment": { - "type": "string", - "max": 4096, - "min": 1, - "sensitive": true - }, - "DeleteAccountPoolInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AccountPoolId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteAccountPoolOutput": { - "type": "structure", - "members": {} - }, - "DeleteAssetFilterInput": { - "type": "structure", - "required": ["domainIdentifier", "assetIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "assetIdentifier": { - "shape": "AssetId", - "location": "uri", - "locationName": "assetIdentifier" - }, - "identifier": { - "shape": "FilterId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteAssetInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetIdentifier", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteAssetOutput": { - "type": "structure", - "members": {} - }, - "DeleteAssetTypeInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetTypeIdentifier", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteAssetTypeOutput": { - "type": "structure", - "members": {} - }, - "DeleteConnectionInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ConnectionId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteConnectionOutput": { - "type": "structure", - "members": { - "status": { - "shape": "String" - } - } - }, - "DeleteDataProductInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataProductId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteDataProductOutput": { - "type": "structure", - "members": {} - }, - "DeleteDataSourceInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataSourceId", - "location": "uri", - "locationName": "identifier" - }, - "clientToken": { - "shape": "String", - "deprecated": true, - "deprecatedMessage": "This field is no longer required for idempotency.", - "idempotencyToken": true, - "location": "querystring", - "locationName": "clientToken" - }, - "retainPermissionsOnRevokeFailure": { - "shape": "Boolean", - "location": "querystring", - "locationName": "retainPermissionsOnRevokeFailure" - } - } - }, - "DeleteDataSourceOutput": { - "type": "structure", - "required": ["id", "name", "domainId", "projectId"], - "members": { - "id": { - "shape": "DataSourceId" - }, - "status": { - "shape": "DataSourceStatus" - }, - "type": { - "shape": "String" - }, - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "connectionId": { - "shape": "String" - }, - "configuration": { - "shape": "DataSourceConfigurationOutput" - }, - "enableSetting": { - "shape": "EnableSetting" - }, - "publishOnImport": { - "shape": "Boolean" - }, - "assetFormsOutput": { - "shape": "FormOutputList" - }, - "schedule": { - "shape": "ScheduleConfiguration" - }, - "lastRunStatus": { - "shape": "DataSourceRunStatus" - }, - "lastRunAt": { - "shape": "DateTime" - }, - "lastRunErrorMessage": { - "shape": "DataSourceErrorMessage" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - }, - "selfGrantStatus": { - "shape": "SelfGrantStatusOutput" - }, - "retainPermissionsOnRevokeFailure": { - "shape": "Boolean" - } - } - }, - "DeleteDomainInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "identifier" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true, - "location": "querystring", - "locationName": "clientToken" - }, - "skipDeletionCheck": { - "shape": "Boolean", - "documentation": "

Optional flag to delete all child entities within the domain

", - "location": "querystring", - "locationName": "skipDeletionCheck" - }, - "cascadeDelete": { - "shape": "Boolean", - "location": "querystring", - "locationName": "cascadeDelete" - } - } - }, - "DeleteDomainOutput": { - "type": "structure", - "required": ["status"], - "members": { - "status": { - "shape": "DomainStatus" - } - } - }, - "DeleteDomainPolicyInput": { - "type": "structure", - "required": ["domainId", "policyId"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "policyId": { - "shape": "PolicyId", - "location": "uri", - "locationName": "policyId" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true, - "location": "querystring", - "locationName": "clientToken" - } - } - }, - "DeleteDomainPolicyOutput": { - "type": "structure", - "required": ["domainId", "policyId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "policyId": { - "shape": "PolicyId" - } - } - }, - "DeleteDomainSharingPolicyInput": { - "type": "structure", - "required": ["domainArn"], - "members": { - "domainArn": { - "shape": "DomainArn", - "location": "uri", - "locationName": "domainArn" - } - } - }, - "DeleteDomainSharingPolicyOutput": { - "type": "structure", - "members": {} - }, - "DeleteDomainUnitInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DomainUnitId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteDomainUnitOutput": { - "type": "structure", - "members": {} - }, - "DeleteDomainUnitPolicyInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DomainUnitPolicyId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteDomainUnitPolicyOutput": { - "type": "structure", - "members": {} - }, - "DeleteEnvironmentActionInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "identifier": { - "shape": "String", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteEnvironmentBlueprintConfigurationInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentBlueprintIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId", - "location": "uri", - "locationName": "environmentBlueprintIdentifier" - } - } - }, - "DeleteEnvironmentBlueprintConfigurationOutput": { - "type": "structure", - "members": {} - }, - "DeleteEnvironmentBlueprintInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentBlueprintId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteEnvironmentInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteEnvironmentProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentProfileId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteFormTypeInput": { - "type": "structure", - "required": ["domainIdentifier", "formTypeIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "formTypeIdentifier": { - "shape": "FormTypeIdentifier", - "location": "uri", - "locationName": "formTypeIdentifier" - } - } - }, - "DeleteFormTypeOutput": { - "type": "structure", - "members": {} - }, - "DeleteGlossaryInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "GlossaryId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteGlossaryOutput": { - "type": "structure", - "members": {} - }, - "DeleteGlossaryTermInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "GlossaryTermId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteGlossaryTermOutput": { - "type": "structure", - "members": {} - }, - "DeleteGroupProfileInput": { - "type": "structure", - "required": ["domainId", "groupId"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "groupId": { - "shape": "GroupProfileId", - "location": "uri", - "locationName": "groupId" - } - } - }, - "DeleteGroupProfileOutput": { - "type": "structure", - "members": {} - }, - "DeleteLineageEventInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "LineageEventIdentifier", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteLineageEventOutput": { - "type": "structure", - "members": { - "id": { - "shape": "LineageEventIdentifier" - }, - "domainId": { - "shape": "DomainId" - }, - "processingStatus": { - "shape": "LineageEventProcessingStatus" - } - } - }, - "DeleteListingInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ListingId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteListingOutput": { - "type": "structure", - "members": {} - }, - "DeletePartnerIntegrationInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "PartnerIntegrationId", - "location": "uri", - "locationName": "identifier" - } - }, - "internalonly": true - }, - "DeletePartnerIntegrationOutput": { - "type": "structure", - "required": ["status"], - "members": { - "status": { - "shape": "PartnerIntegrationStatus" - } - }, - "internalonly": true - }, - "DeleteProjectInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "identifier" - }, - "skipDeletionCheck": { - "shape": "Boolean", - "documentation": "

Optional flag to asynchronously delete child entities within the project

", - "location": "querystring", - "locationName": "skipDeletionCheck" - } - } - }, - "DeleteProjectMembershipInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier", "member"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "projectIdentifier" - }, - "member": { - "shape": "Member" - }, - "designation": { - "shape": "UserDesignation", - "internalonly": true - } - } - }, - "DeleteProjectMembershipOutput": { - "type": "structure", - "members": {} - }, - "DeleteProjectOutput": { - "type": "structure", - "members": {} - }, - "DeleteProjectProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ProjectProfileId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteProjectProfileOutput": { - "type": "structure", - "members": {} - }, - "DeleteRuleInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "RuleId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteRuleOutput": { - "type": "structure", - "members": {} - }, - "DeleteServiceLinkInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ServiceLinkId", - "location": "uri", - "locationName": "identifier" - } - }, - "internalonly": true - }, - "DeleteSubscriptionGrantInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionGrantId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteSubscriptionGrantOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "createdAt", - "updatedAt", - "subscriptionTargetId", - "grantedEntity", - "status" - ], - "members": { - "id": { - "shape": "SubscriptionGrantId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "environmentId": { - "shape": "EnvironmentId", - "internalonly": true - }, - "subscriptionTargetId": { - "shape": "SubscriptionTargetId" - }, - "grantedEntity": { - "shape": "GrantedEntity" - }, - "status": { - "shape": "SubscriptionGrantOverallStatus" - }, - "assets": { - "shape": "SubscribedAssets" - }, - "subscriptionId": { - "shape": "SubscriptionId", - "deprecated": true, - "deprecatedMessage": "Multiple subscriptions can exist for a single grant" - } - } - }, - "DeleteSubscriptionRequestInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionRequestId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteSubscriptionTargetInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "identifier": { - "shape": "SubscriptionTargetId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "DeleteTimeSeriesDataPointsInput": { - "type": "structure", - "required": ["domainIdentifier", "entityIdentifier", "entityType", "formName"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityIdentifier": { - "shape": "EntityIdentifier", - "location": "uri", - "locationName": "entityIdentifier" - }, - "entityType": { - "shape": "TimeSeriesEntityType", - "location": "uri", - "locationName": "entityType" - }, - "formName": { - "shape": "TimeSeriesFormName", - "location": "querystring", - "locationName": "formName" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true, - "location": "querystring", - "locationName": "clientToken" - } - } - }, - "DeleteTimeSeriesDataPointsOutput": { - "type": "structure", - "members": {} - }, - "DeleteUserProfileInput": { - "type": "structure", - "required": ["domainId", "userId"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "userId": { - "shape": "UserProfileId", - "location": "uri", - "locationName": "userId" - } - } - }, - "DeleteUserProfileOutput": { - "type": "structure", - "members": {} - }, - "Deployment": { - "type": "structure", - "members": { - "deploymentId": { - "shape": "String" - }, - "deploymentType": { - "shape": "DeploymentType" - }, - "deploymentStatus": { - "shape": "DeploymentStatus" - }, - "failureReason": { - "shape": "EnvironmentError" - }, - "messages": { - "shape": "DeploymentMessagesList" - }, - "isDeploymentComplete": { - "shape": "Boolean" - } - } - }, - "DeploymentId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "DeploymentMessage": { - "type": "string" - }, - "DeploymentMessagesList": { - "type": "list", - "member": { - "shape": "DeploymentMessage" - } - }, - "DeploymentMode": { - "type": "string", - "enum": ["ON_CREATE", "ON_DEMAND"] - }, - "DeploymentOrder": { - "type": "integer", - "box": true, - "max": 16, - "min": 0 - }, - "DeploymentProperties": { - "type": "structure", - "members": { - "startTimeoutMinutes": { - "shape": "DeploymentPropertiesStartTimeoutMinutesInteger" - }, - "endTimeoutMinutes": { - "shape": "DeploymentPropertiesEndTimeoutMinutesInteger" - } - } - }, - "DeploymentPropertiesEndTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "max": 225, - "min": 1 - }, - "DeploymentPropertiesStartTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "max": 225, - "min": 1 - }, - "DeploymentStatus": { - "type": "string", - "enum": ["IN_PROGRESS", "SUCCESSFUL", "FAILED", "PENDING_DEPLOYMENT"] - }, - "DeploymentType": { - "type": "string", - "enum": ["CREATE", "UPDATE", "DELETE"] - }, - "Description": { - "type": "string", - "max": 2048, - "min": 0, - "sensitive": true - }, - "DesignationConfiguration": { - "type": "structure", - "required": ["id", "name", "allowedActions", "roleTag"], - "members": { - "id": { - "shape": "DesignationConfigurationId" - }, - "name": { - "shape": "DesignationName" - }, - "allowedActions": { - "shape": "AllowedDataZoneActions" - }, - "description": { - "shape": "Description" - }, - "roleTag": { - "shape": "RoleTag" - } - } - }, - "DesignationConfigurationId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "DesignationConfigurations": { - "type": "list", - "member": { - "shape": "DesignationConfiguration" - } - }, - "DesignationId": { - "type": "string", - "max": 36, - "min": 1, - "pattern": "[a-zA-Z0-9_-]+" - }, - "DesignationName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+" - }, - "DesignationSummaries": { - "type": "list", - "member": { - "shape": "DesignationSummary" - } - }, - "DesignationSummary": { - "type": "structure", - "required": [ - "domainId", - "id", - "name", - "projectId", - "designationConfigurationId", - "roleTag", - "provider", - "createdBy" - ], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DesignationId" - }, - "name": { - "shape": "DesignationName" - }, - "projectId": { - "shape": "ProjectId" - }, - "designationConfigurationId": { - "shape": "DesignationConfigurationId" - }, - "roleTag": { - "shape": "RoleTag" - }, - "description": { - "shape": "Description" - }, - "provider": { - "shape": "String" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "domainUnitId": { - "shape": "DomainUnitId", - "internalonly": true - } - } - }, - "DetailedGlossaryTerm": { - "type": "structure", - "members": { - "id": { - "shape": "GlossaryTermId", - "internalonly": true - }, - "glossaryId": { - "shape": "GlossaryId", - "internalonly": true - }, - "name": { - "shape": "GlossaryTermName" - }, - "shortDescription": { - "shape": "ShortDescription" - } - } - }, - "DetailedGlossaryTerms": { - "type": "list", - "member": { - "shape": "DetailedGlossaryTerm" - } - }, - "Details": { - "type": "structure", - "members": { - "createDomainUnit": { - "shape": "CreateDomainUnitPolicyDetails" - }, - "createProject": { - "shape": "CreateProjectPolicyDetails" - }, - "projectMembership": { - "shape": "ProjectMembershipPolicyDetails" - }, - "createGlossary": { - "shape": "CreateGlossaryPolicyDetails" - } - }, - "union": true - }, - "DisassociateEnvironmentRoleInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "environmentRoleArn": { - "shape": "String", - "location": "uri", - "locationName": "environmentRoleArn" - } - } - }, - "DisassociateEnvironmentRoleOutput": { - "type": "structure", - "members": {} - }, - "DisassociateGovernedTermsInput": { - "type": "structure", - "required": ["domainIdentifier", "entityIdentifier", "entityType", "governedGlossaryTerms"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityIdentifier": { - "shape": "EntityIdentifier", - "location": "uri", - "locationName": "entityIdentifier" - }, - "entityType": { - "shape": "GovernedEntityType", - "location": "uri", - "locationName": "entityType" - }, - "governedGlossaryTerms": { - "shape": "DisassociateGovernedTermsInputGovernedGlossaryTermsList" - } - } - }, - "DisassociateGovernedTermsInputGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 5, - "min": 1 - }, - "DisassociateGovernedTermsOutput": { - "type": "structure", - "members": {} - }, - "DomainArn": { - "type": "string", - "pattern": "arn:aws(|-cn|-us-gov):datazone:\\w+(?:-\\w+)+:\\d{12}:domain/dzd[-_][a-zA-Z0-9_-]{1,36}" - }, - "DomainDescription": { - "type": "string", - "sensitive": true - }, - "DomainId": { - "type": "string", - "pattern": "dzd[-_][a-zA-Z0-9_-]{1,36}" - }, - "DomainName": { - "type": "string", - "sensitive": true - }, - "DomainPolicyItem": { - "type": "structure", - "required": ["domainId", "owningProjectId", "policyId", "name", "policyType", "policyContent"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "policyId": { - "shape": "PolicyId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "applicableScope": { - "shape": "ApplicableScopeList" - }, - "policyType": { - "shape": "PolicyType" - }, - "policyContent": { - "shape": "PolicyContent" - } - } - }, - "DomainStatus": { - "type": "string", - "enum": ["CREATING", "AVAILABLE", "CREATION_FAILED", "DELETING", "DELETED", "DELETION_FAILED"] - }, - "DomainSummaries": { - "type": "list", - "member": { - "shape": "DomainSummary" - } - }, - "DomainSummary": { - "type": "structure", - "required": ["id", "name", "arn", "managedAccountId", "status", "createdAt"], - "members": { - "id": { - "shape": "DomainId" - }, - "name": { - "shape": "DomainName" - }, - "description": { - "shape": "DomainDescription" - }, - "arn": { - "shape": "String" - }, - "managedAccountId": { - "shape": "String" - }, - "status": { - "shape": "DomainStatus" - }, - "portalUrl": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "DomainUnitDescription": { - "type": "string", - "max": 2048, - "min": 0, - "sensitive": true - }, - "DomainUnitDesignation": { - "type": "string", - "enum": ["OWNER"] - }, - "DomainUnitDesignator": { - "type": "string", - "deprecated": true, - "deprecatedMessage": "This enum will be removed going forward and will be replaced with domainUnitDesignation enum.", - "enum": ["Owner"], - "internalonly": true - }, - "DomainUnitFilter": { - "type": "structure", - "members": { - "all": { - "shape": "Boolean" - } - }, - "deprecated": true, - "deprecatedMessage": "This structure will be removed going forward and will be replaced with domainUnitGrantFilter union.", - "internalonly": true - }, - "DomainUnitFilterForProject": { - "type": "structure", - "required": ["domainUnit"], - "members": { - "domainUnit": { - "shape": "DomainUnitId" - }, - "includeChildDomainUnits": { - "shape": "Boolean", - "box": true - } - } - }, - "DomainUnitGrantFilter": { - "type": "structure", - "members": { - "allDomainUnitsGrantFilter": { - "shape": "AllDomainUnitsGrantFilter" - } - }, - "union": true - }, - "DomainUnitGroupProperties": { - "type": "structure", - "members": { - "groupId": { - "shape": "String" - } - } - }, - "DomainUnitId": { - "type": "string", - "max": 256, - "min": 1, - "pattern": "[a-z0-9_\\-]+" - }, - "DomainUnitIds": { - "type": "list", - "member": { - "shape": "DomainUnitId" - } - }, - "DomainUnitName": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "DomainUnitOwnerProperties": { - "type": "structure", - "members": { - "user": { - "shape": "DomainUnitUserProperties" - }, - "group": { - "shape": "DomainUnitGroupProperties" - } - }, - "union": true - }, - "DomainUnitOwners": { - "type": "list", - "member": { - "shape": "DomainUnitOwnerProperties" - }, - "max": 20, - "min": 0 - }, - "DomainUnitPolicyGrantPrincipal": { - "type": "structure", - "members": { - "domainUnitDesignator": { - "shape": "DomainUnitDesignator", - "deprecated": true, - "deprecatedMessage": "This field will be removed going forward and will be replaced with domainUnitDesignation field.", - "internalonly": true - }, - "domainUnitDesignation": { - "shape": "DomainUnitDesignation" - }, - "domainUnitIdentifier": { - "shape": "DomainUnitId" - }, - "domainUnitFilter": { - "shape": "DomainUnitFilter", - "deprecated": true, - "deprecatedMessage": "This field will be removed going forward and will be replaced with domainUnitGrantFilter field.", - "internalonly": true - }, - "domainUnitGrantFilter": { - "shape": "DomainUnitGrantFilter" - } - } - }, - "DomainUnitPolicyId": { - "type": "string", - "max": 32, - "min": 1 - }, - "DomainUnitPolicySummaries": { - "type": "list", - "member": { - "shape": "DomainUnitPolicySummary" - } - }, - "DomainUnitPolicySummary": { - "type": "structure", - "members": { - "id": { - "shape": "DomainUnitPolicyId" - }, - "description": { - "shape": "String" - }, - "domainId": { - "shape": "String" - }, - "policyTarget": { - "shape": "PolicyTarget" - }, - "details": { - "shape": "Details" - } - } - }, - "DomainUnitSummaries": { - "type": "list", - "member": { - "shape": "DomainUnitSummary" - } - }, - "DomainUnitSummary": { - "type": "structure", - "required": ["name", "id"], - "members": { - "name": { - "shape": "String" - }, - "id": { - "shape": "DomainUnitId" - }, - "domainUnitId": { - "shape": "DomainUnitId", - "internalonly": true - } - } - }, - "DomainUnitTarget": { - "type": "structure", - "required": ["domainUnitId"], - "members": { - "domainUnitId": { - "shape": "DomainUnitId" - }, - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "DomainUnitUserProperties": { - "type": "structure", - "members": { - "userId": { - "shape": "String" - } - } - }, - "DomainVersion": { - "type": "string", - "enum": ["V1", "V2"] - }, - "DurationSeconds": { - "type": "integer", - "box": true, - "max": 43200, - "min": 900 - }, - "EdgeDirection": { - "type": "string", - "enum": ["UPSTREAM", "DOWNSTREAM"] - }, - "EditedValue": { - "type": "string", - "max": 5000, - "min": 1, - "sensitive": true - }, - "EligibilityStatus": { - "type": "string", - "enum": ["UPDATE_AVAILABLE", "UPDATE_NOT_AVAILABLE", "UPDATE_NOT_ELIGIBLE"] - }, - "EligibilityType": { - "type": "string", - "enum": ["PROJECT_PROFILE", "PROJECT", "ENVIRONMENT_BLUEPRINT"] - }, - "EnableSetting": { - "type": "string", - "enum": ["ENABLED", "DISABLED"] - }, - "EnabledRegionList": { - "type": "list", - "member": { - "shape": "RegionName" - }, - "min": 0 - }, - "EntityId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "EntityIdentifier": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "EntityOwners": { - "type": "list", - "member": { - "shape": "OwnerPropertiesOutput" - } - }, - "EntityType": { - "type": "string", - "enum": ["ASSET", "DATA_PRODUCT"] - }, - "EnvironmentActionId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "EnvironmentActionList": { - "type": "list", - "member": { - "shape": "ConfigurableEnvironmentAction" - } - }, - "EnvironmentActionSummary": { - "type": "structure", - "required": ["domainId", "environmentId", "id", "name", "parameters"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "id": { - "shape": "EnvironmentActionId" - }, - "name": { - "shape": "String" - }, - "parameters": { - "shape": "ActionParameters" - }, - "description": { - "shape": "String" - } - } - }, - "EnvironmentActionURI": { - "type": "string", - "max": 2048, - "min": 1 - }, - "EnvironmentBlueprintConfigurationItem": { - "type": "structure", - "required": ["domainId", "environmentBlueprintId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "provisioningRoleArn": { - "shape": "RoleArn" - }, - "environmentRolePermissionBoundary": { - "shape": "PolicyArn" - }, - "manageAccessRoleArn": { - "shape": "RoleArn" - }, - "enabledRegions": { - "shape": "EnabledRegionList" - }, - "regionalParameters": { - "shape": "RegionalParameterMap" - }, - "allowUserProvidedConfigurations": { - "shape": "Boolean" - }, - "allowS3LocationRegistration": { - "shape": "Boolean", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "resourceConfigurations": { - "shape": "ResourceConfigurations" - }, - "lakeFormationConfiguration": { - "shape": "LakeFormationConfiguration", - "internalonly": true - }, - "globalParameters": { - "shape": "GlobalParameterMap", - "internalonly": true - }, - "provisioningConfigurations": { - "shape": "ProvisioningConfigurationList" - } - } - }, - "EnvironmentBlueprintConfigurationSummaries": { - "type": "list", - "member": { - "shape": "EnvironmentBlueprintConfigurationSummary" - } - }, - "EnvironmentBlueprintConfigurationSummary": { - "type": "structure", - "members": { - "awsAccountId": { - "shape": "AwsAccountId" - }, - "enabledRegions": { - "shape": "ConsumersEnabledRegionList" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId" - }, - "managingProjects": { - "shape": "String" - }, - "resourceConfigurations": { - "shape": "ResourceConfigurations" - }, - "allowUserProvidedConfigurations": { - "shape": "Boolean", - "internalonly": true - }, - "globalParameters": { - "shape": "GlobalParameterMap", - "internalonly": true - } - } - }, - "EnvironmentBlueprintConfigurations": { - "type": "list", - "member": { - "shape": "EnvironmentBlueprintConfigurationItem" - } - }, - "EnvironmentBlueprintId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "EnvironmentBlueprintName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+" - }, - "EnvironmentBlueprintSummaries": { - "type": "list", - "member": { - "shape": "EnvironmentBlueprintSummary" - } - }, - "EnvironmentBlueprintSummary": { - "type": "structure", - "required": ["id", "name", "provider", "provisioningProperties"], - "members": { - "id": { - "shape": "EnvironmentBlueprintId" - }, - "name": { - "shape": "EnvironmentBlueprintName" - }, - "description": { - "shape": "Description" - }, - "provider": { - "shape": "String" - }, - "provisioningPolicy": { - "shape": "ProvisioningPolicy", - "internalonly": true - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "deploymentProperties": { - "shape": "DeploymentProperties", - "internalonly": true - }, - "userParameters": { - "shape": "CustomParameterList", - "internalonly": true - }, - "glossaryTerms": { - "shape": "GlossaryTerms", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "blueprintCategory": { - "shape": "String", - "internalonly": true - }, - "supportedDomainVersions": { - "shape": "SupportedDomainVersionsList", - "internalonly": true - } - } - }, - "EnvironmentConfiguration": { - "type": "structure", - "required": ["name", "environmentBlueprintId"], - "members": { - "name": { - "shape": "EnvironmentConfigurationName" - }, - "id": { - "shape": "EnvironmentConfigurationId" - }, - "scopeName": { - "shape": "ProjectScopeName", - "internalonly": true - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "description": { - "shape": "Description" - }, - "deploymentMode": { - "shape": "DeploymentMode" - }, - "configurationParameters": { - "shape": "EnvironmentConfigurationParametersDetails" - }, - "awsAccount": { - "shape": "AwsAccount" - }, - "accountPools": { - "shape": "AccountPoolList" - }, - "awsRegion": { - "shape": "Region" - }, - "deploymentOrder": { - "shape": "DeploymentOrder" - }, - "designationsAuthorizedToManageEnvironment": { - "shape": "AuthorizedDesignations", - "internalonly": true - } - } - }, - "EnvironmentConfigurationId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "EnvironmentConfigurationName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "EnvironmentConfigurationParameter": { - "type": "structure", - "members": { - "name": { - "shape": "EnvironmentConfigurationParameterName" - }, - "value": { - "shape": "String" - }, - "isEditable": { - "shape": "Boolean" - } - } - }, - "EnvironmentConfigurationParameterName": { - "type": "string", - "pattern": "[a-zA-Z_][a-zA-Z0-9_]*" - }, - "EnvironmentConfigurationParametersDetails": { - "type": "structure", - "members": { - "ssmPath": { - "shape": "ParameterStorePath" - }, - "parameterOverrides": { - "shape": "EnvironmentConfigurationParametersList" - }, - "resolvedParameters": { - "shape": "EnvironmentConfigurationParametersList" - } - } - }, - "EnvironmentConfigurationParametersList": { - "type": "list", - "member": { - "shape": "EnvironmentConfigurationParameter" - } - }, - "EnvironmentConfigurationUserParameter": { - "type": "structure", - "members": { - "environmentId": { - "shape": "EnvironmentId", - "internalonly": true - }, - "environmentResolvedAccount": { - "shape": "EnvironmentResolvedAccount" - }, - "environmentConfigurationName": { - "shape": "EnvironmentConfigurationName" - }, - "environmentParameters": { - "shape": "EnvironmentParametersList" - } - } - }, - "EnvironmentConfigurationUserParametersList": { - "type": "list", - "member": { - "shape": "EnvironmentConfigurationUserParameter" - } - }, - "EnvironmentConfigurationsList": { - "type": "list", - "member": { - "shape": "EnvironmentConfiguration" - } - }, - "EnvironmentDeploymentDetails": { - "type": "structure", - "members": { - "overallDeploymentStatus": { - "shape": "OverallDeploymentStatus" - }, - "environmentFailureReasons": { - "shape": "EnvironmentFailureReasons" - } - } - }, - "EnvironmentDeploymentResult": { - "type": "string", - "enum": ["FAILED", "SUCCESSFUL"] - }, - "EnvironmentError": { - "type": "structure", - "required": ["message"], - "members": { - "code": { - "shape": "String" - }, - "message": { - "shape": "String" - } - } - }, - "EnvironmentFailureReasons": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "EnvironmentFailureReasonsList" - } - }, - "EnvironmentFailureReasonsList": { - "type": "list", - "member": { - "shape": "EnvironmentError" - } - }, - "EnvironmentId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "EnvironmentName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "EnvironmentParameter": { - "type": "structure", - "members": { - "name": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "EnvironmentParametersList": { - "type": "list", - "member": { - "shape": "EnvironmentParameter" - } - }, - "EnvironmentProfileId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{0,36}" - }, - "EnvironmentProfileName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "EnvironmentProfileSummaries": { - "type": "list", - "member": { - "shape": "EnvironmentProfileSummary" - } - }, - "EnvironmentProfileSummary": { - "type": "structure", - "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], - "members": { - "id": { - "shape": "EnvironmentProfileId" - }, - "domainId": { - "shape": "DomainId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentProfileName" - }, - "description": { - "shape": "Description" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "projectId": { - "shape": "ProjectId" - }, - "userParameters": { - "shape": "CustomParameterList", - "internalonly": true - }, - "resourceConfigurationId": { - "shape": "ResourceConfigurationId" - } - } - }, - "EnvironmentResolvedAccount": { - "type": "structure", - "required": ["awsAccountId", "regionName"], - "members": { - "awsAccountId": { - "shape": "AwsAccountId" - }, - "regionName": { - "shape": "AwsRegion" - }, - "sourceAccountPoolId": { - "shape": "AccountPoolId" - } - } - }, - "EnvironmentRoleSummary": { - "type": "structure", - "required": ["domainId", "environmentId", "arn", "provider", "roleTag"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "arn": { - "shape": "RoleArn" - }, - "provider": { - "shape": "String" - }, - "type": { - "shape": "EnvironmentRoleType" - }, - "roleTag": { - "shape": "RoleTag" - } - } - }, - "EnvironmentRoleType": { - "type": "string", - "enum": ["SHAREABLE_ROLE", "USER_ROLE", "SYSTEM_ROLE"] - }, - "EnvironmentStatus": { - "type": "string", - "enum": [ - "ACTIVE", - "CREATING", - "UPDATING", - "DELETING", - "CREATE_FAILED", - "UPDATE_FAILED", - "DELETE_FAILED", - "VALIDATION_FAILED", - "SUSPENDED", - "DISABLED", - "EXPIRED", - "DELETED", - "INACCESSIBLE" - ] - }, - "EnvironmentSummaries": { - "type": "list", - "member": { - "shape": "EnvironmentSummary" - } - }, - "EnvironmentSummary": { - "type": "structure", - "required": ["projectId", "domainId", "createdBy", "name", "provider"], - "members": { - "projectId": { - "shape": "ProjectId" - }, - "id": { - "shape": "EnvironmentId" - }, - "domainId": { - "shape": "DomainId" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentName" - }, - "description": { - "shape": "Description" - }, - "environmentProfileId": { - "shape": "EnvironmentProfileId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "provider": { - "shape": "String" - }, - "provisionedResources": { - "shape": "ResourceList", - "internalonly": true - }, - "permittedResources": { - "shape": "ResourceList", - "internalonly": true - }, - "status": { - "shape": "EnvironmentStatus" - }, - "environmentActions": { - "shape": "EnvironmentActionList", - "internalonly": true - }, - "deploymentOrder": { - "shape": "DeploymentOrder", - "internalonly": true - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId", - "internalonly": true - }, - "environmentConfigurationId": { - "shape": "EnvironmentConfigurationId", - "internalonly": true - }, - "failureReason": { - "shape": "EnvironmentError", - "internalonly": true - } - } - }, - "EqualToExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "ErrorDetail": { - "type": "string", - "max": 256, - "min": 1 - }, - "ErrorMessage": { - "type": "string" - }, - "ErrorType": { - "type": "string", - "enum": [ - "ACCESS_DENIED_EXCEPTION", - "CONFLICT_EXCEPTION", - "INTERNAL_SERVER_EXCEPTION", - "RESOURCE_NOT_FOUND_EXCEPTION", - "SERVICE_QUOTA_EXCEEDED_EXCEPTION", - "THROTTLING_EXCEPTION", - "VALIDATION_EXCEPTION" - ] - }, - "EventBridgeProperties": { - "type": "structure", - "required": ["targetAccountId"], - "members": { - "targetAccountId": { - "shape": "String" - } - } - }, - "EventSummary": { - "type": "structure", - "members": { - "openLineageRunEventSummary": { - "shape": "OpenLineageRunEventSummary" - } - }, - "union": true - }, - "ExternalIdentifier": { - "type": "string", - "max": 1200, - "min": 1 - }, - "FailedQueryProcessingErrorMessages": { - "type": "list", - "member": { - "shape": "String" - }, - "internalonly": true, - "max": 10, - "min": 0 - }, - "FailureCause": { - "type": "structure", - "members": { - "message": { - "shape": "String" - } - } - }, - "FailureReason": { - "type": "structure", - "members": { - "code": { - "shape": "String" - }, - "message": { - "shape": "String" - } - } - }, - "FailureReasons": { - "type": "list", - "member": { - "shape": "ProjectDeletionError" - } - }, - "FailureReasonsList": { - "type": "list", - "member": { - "shape": "FailureReason" - } - }, - "FeatureFlagList": { - "type": "list", - "member": { - "shape": "String" - } - }, - "FieldValueFactor": { - "type": "structure", - "required": ["attribute", "rankMultiplier"], - "members": { - "attribute": { - "shape": "Attribute" - }, - "rankMultiplier": { - "shape": "Integer" - }, - "scoreModifier": { - "shape": "ScoreModifier" - } - } - }, - "FieldValueFactorList": { - "type": "list", - "member": { - "shape": "FieldValueFactor" - } - }, - "FieldValueFactorReranker": { - "type": "structure", - "members": { - "fieldValueFactors": { - "shape": "FieldValueFactorList" - } - } - }, - "Filter": { - "type": "structure", - "required": ["attribute", "value"], - "members": { - "attribute": { - "shape": "Attribute" - }, - "value": { - "shape": "FilterValueString" - } - } - }, - "FilterClause": { - "type": "structure", - "members": { - "filter": { - "shape": "Filter" - }, - "and": { - "shape": "FilterList" - }, - "or": { - "shape": "FilterList" - } - }, - "union": true - }, - "FilterExpression": { - "type": "structure", - "required": ["type", "expression"], - "members": { - "type": { - "shape": "FilterExpressionType" - }, - "expression": { - "shape": "FilterExpressionExpressionString" - } - }, - "internalonly": true - }, - "FilterExpressionExpressionString": { - "type": "string", - "max": 2048, - "min": 1 - }, - "FilterExpressionType": { - "type": "string", - "enum": ["INCLUDE", "EXCLUDE"] - }, - "FilterExpressions": { - "type": "list", - "member": { - "shape": "FilterExpression" - }, - "internalonly": true - }, - "FilterId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "FilterIds": { - "type": "list", - "member": { - "shape": "FilterId" - } - }, - "FilterList": { - "type": "list", - "member": { - "shape": "FilterClause" - }, - "max": 100, - "min": 1 - }, - "FilterName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "FilterStatus": { - "type": "string", - "enum": ["VALID", "INVALID"] - }, - "FilterValueString": { - "type": "string", - "max": 128, - "min": 1 - }, - "FirstName": { - "type": "string", - "sensitive": true - }, - "Float": { - "type": "float", - "box": true - }, - "FormEntryInput": { - "type": "structure", - "required": ["typeIdentifier", "typeRevision"], - "members": { - "typeIdentifier": { - "shape": "FormTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "required": { - "shape": "Boolean" - } - } - }, - "FormEntryOutput": { - "type": "structure", - "required": ["typeName", "typeRevision"], - "members": { - "typeName": { - "shape": "FormTypeName" - }, - "typeRevision": { - "shape": "Revision" - }, - "required": { - "shape": "Boolean" - } - } - }, - "FormInput": { - "type": "structure", - "required": ["formName"], - "members": { - "formName": { - "shape": "FormName" - }, - "typeIdentifier": { - "shape": "FormTypeIdentifier" - }, - "typeRevision": { - "shape": "RevisionInput" - }, - "content": { - "shape": "FormInputContentString" - }, - "renderingConfig": { - "shape": "RenderingConfig", - "internalonly": true - } - }, - "sensitive": true - }, - "FormInputContentString": { - "type": "string", - "max": 300000, - "min": 0 - }, - "FormInputList": { - "type": "list", - "member": { - "shape": "FormInput" - }, - "max": 10, - "min": 0, - "sensitive": true - }, - "FormName": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "(?![0-9_])\\w+$|^_\\w*[a-zA-Z0-9]\\w*" - }, - "FormOutput": { - "type": "structure", - "required": ["formName"], - "members": { - "formName": { - "shape": "FormName" - }, - "typeName": { - "shape": "FormTypeName" - }, - "typeRevision": { - "shape": "Revision" - }, - "content": { - "shape": "String" - }, - "renderingConfig": { - "shape": "RenderingConfig", - "internalonly": true - } - } - }, - "FormOutputList": { - "type": "list", - "member": { - "shape": "FormOutput" - }, - "max": 10, - "min": 0 - }, - "FormTypeData": { - "type": "structure", - "required": ["domainId", "name", "revision"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "FormTypeName" - }, - "revision": { - "shape": "Revision" - }, - "model": { - "shape": "Model" - }, - "status": { - "shape": "FormTypeStatus" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "originDomainId": { - "shape": "DomainId" - }, - "originProjectId": { - "shape": "ProjectId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "description": { - "shape": "Description" - }, - "imports": { - "shape": "ImportList" - } - } - }, - "FormTypeDataList": { - "type": "list", - "member": { - "shape": "FormTypeData" - } - }, - "FormTypeIdentifier": { - "type": "string", - "max": 385, - "min": 1, - "pattern": "(?!\\.)[\\w\\.]*\\w" - }, - "FormTypeName": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "(amazon.datazone.)?(?![0-9_])\\w+$|^_\\w*[a-zA-Z0-9]\\w*", - "sensitive": true - }, - "FormTypeStatus": { - "type": "string", - "enum": ["ENABLED", "DISABLED"] - }, - "Forms": { - "type": "string" - }, - "FormsInputMap": { - "type": "map", - "key": { - "shape": "FormName" - }, - "value": { - "shape": "FormEntryInput" - }, - "max": 10, - "min": 0 - }, - "FormsOutputMap": { - "type": "map", - "key": { - "shape": "FormName" - }, - "value": { - "shape": "FormEntryOutput" - }, - "max": 10, - "min": 0 - }, - "GenAIGovernance": { - "type": "structure", - "required": ["models"], - "members": { - "projectId": { - "shape": "ProjectId" - }, - "models": { - "shape": "GenAIGovernanceModelsList" - } - } - }, - "GenAIGovernanceModel": { - "type": "structure", - "required": [ - "modelArn", - "inferenceType", - "isCrossRegion", - "modelName", - "modelProvider", - "foundationModelId", - "inputModalities", - "outputModalities" - ], - "members": { - "modelArn": { - "shape": "BedrockModelArn" - }, - "inferenceOnlyS3BucketArn": { - "shape": "BedrockS3BucketArn" - }, - "applicationInferenceProfileArn": { - "shape": "BedrockModelArn" - }, - "modelProvisionRoleArn": { - "shape": "RoleArn" - }, - "modelConsumerRoleArn": { - "shape": "RoleArn" - }, - "inferenceType": { - "shape": "GenerativeAIInferenceType" - }, - "isCrossRegion": { - "shape": "Boolean" - }, - "modelName": { - "shape": "GenAIGovernanceModelModelNameString" - }, - "modelProvider": { - "shape": "GenAIGovernanceModelModelProviderString" - }, - "foundationModelId": { - "shape": "GenAIGovernanceModelFoundationModelIdString" - }, - "inputModalities": { - "shape": "ModalitiesType" - }, - "outputModalities": { - "shape": "ModalitiesType" - } - } - }, - "GenAIGovernanceModelFoundationModelIdString": { - "type": "string", - "pattern": "[0-9a-zA-Z_+=,.@:/()\\-]{1,256}" - }, - "GenAIGovernanceModelModelNameString": { - "type": "string", - "pattern": "[0-9a-zA-Z_+=, .@:/()\\-]{1,128}" - }, - "GenAIGovernanceModelModelProviderString": { - "type": "string", - "pattern": "[0-9a-zA-Z_+=, .@:/()\\-]{1,128}" - }, - "GenAIGovernanceModelsList": { - "type": "list", - "member": { - "shape": "GenAIGovernanceModel" - }, - "min": 1 - }, - "GenerativeAIInferenceType": { - "type": "string", - "enum": ["ON_DEMAND", "PROVISIONED", "INFERENCE_PROFILE"] - }, - "GetAccountPoolInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AccountPoolId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetAccountPoolOutput": { - "type": "structure", - "required": ["accountSource", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "AccountPoolName" - }, - "id": { - "shape": "AccountPoolId" - }, - "description": { - "shape": "Description" - }, - "resolutionStrategy": { - "shape": "ResolutionStrategy" - }, - "accountSource": { - "shape": "AccountSource" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainUnitId": { - "shape": "DomainUnitId" - } - } - }, - "GetAssetFilterInput": { - "type": "structure", - "required": ["domainIdentifier", "assetIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "assetIdentifier": { - "shape": "AssetId", - "location": "uri", - "locationName": "assetIdentifier" - }, - "identifier": { - "shape": "FilterId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetAssetFilterOutput": { - "type": "structure", - "required": ["id", "domainId", "assetId", "name", "configuration"], - "members": { - "id": { - "shape": "FilterId" - }, - "domainId": { - "shape": "DomainId" - }, - "assetId": { - "shape": "AssetId" - }, - "name": { - "shape": "FilterName" - }, - "description": { - "shape": "Description" - }, - "status": { - "shape": "FilterStatus" - }, - "configuration": { - "shape": "AssetFilterConfiguration" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "errorMessage": { - "shape": "String" - }, - "effectiveColumnNames": { - "shape": "ColumnNameList" - }, - "effectiveRowFilter": { - "shape": "String" - } - } - }, - "GetAssetInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "revision": { - "shape": "Revision", - "location": "querystring", - "locationName": "revision" - } - } - }, - "GetAssetOutput": { - "type": "structure", - "required": [ - "id", - "name", - "typeIdentifier", - "typeRevision", - "revision", - "owningProjectId", - "domainId", - "formsOutput" - ], - "members": { - "id": { - "shape": "AssetId" - }, - "name": { - "shape": "AssetName" - }, - "typeIdentifier": { - "shape": "AssetTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "externalIdentifier": { - "shape": "ExternalIdentifier" - }, - "revision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "governedGlossaryTerms": { - "shape": "GetAssetOutputGovernedGlossaryTermsList" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "domainId": { - "shape": "DomainId" - }, - "listing": { - "shape": "AssetListingDetails" - }, - "formsOutput": { - "shape": "GetAssetOutputFormsOutputList" - }, - "readOnlyFormsOutput": { - "shape": "FormOutputList" - }, - "latestTimeSeriesDataPointFormsOutput": { - "shape": "TimeSeriesDataPointSummaryFormOutputList" - } - } - }, - "GetAssetOutputFormsOutputList": { - "type": "list", - "member": { - "shape": "FormOutput" - }, - "max": 20, - "min": 0 - }, - "GetAssetOutputGovernedGlossaryTermsList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 20, - "min": 0 - }, - "GetAssetTypeInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetTypeIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "revision": { - "shape": "Revision", - "location": "querystring", - "locationName": "revision" - } - } - }, - "GetAssetTypeOutput": { - "type": "structure", - "required": ["domainId", "name", "revision", "formsOutput", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "TypeName" - }, - "revision": { - "shape": "Revision" - }, - "description": { - "shape": "Description" - }, - "formsOutput": { - "shape": "FormsOutputMap" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "originDomainId": { - "shape": "DomainId" - }, - "originProjectId": { - "shape": "ProjectId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - } - } - }, - "GetAttributeOutput": { - "type": "structure", - "required": ["attributeIdentifier", "revision"], - "members": { - "attributeIdentifier": { - "shape": "AttributeIdentifier" - }, - "revision": { - "shape": "Revision" - }, - "readMe": { - "shape": "GetAttributeOutputReadMeString" - }, - "forms": { - "shape": "FormOutputList" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - } - }, - "internalonly": true - }, - "GetAttributeOutputReadMeString": { - "type": "string", - "max": 5000, - "min": 0 - }, - "GetConnectionInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ConnectionId", - "location": "uri", - "locationName": "identifier" - }, - "withSecret": { - "shape": "Boolean", - "location": "querystring", - "locationName": "withSecret" - }, - "designation": { - "shape": "DesignationName", - "internalonly": true, - "location": "querystring", - "locationName": "designation" - } - } - }, - "GetConnectionOutput": { - "type": "structure", - "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], - "members": { - "connectionCredentials": { - "shape": "ConnectionCredentials" - }, - "configurations": { - "shape": "Configurations", - "internalonly": true - }, - "connectionId": { - "shape": "ConnectionId" - }, - "description": { - "shape": "Description" - }, - "domainId": { - "shape": "DomainId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "environmentUserRole": { - "shape": "String" - }, - "name": { - "shape": "ConnectionName" - }, - "physicalEndpoints": { - "shape": "PhysicalEndpoints" - }, - "projectId": { - "shape": "ProjectId" - }, - "props": { - "shape": "ConnectionPropertiesOutput" - }, - "type": { - "shape": "ConnectionType" - }, - "scope": { - "shape": "ConnectionScope", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "credentialId": { - "shape": "CredentialId", - "internalonly": true - } - } - }, - "GetDataProductInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataProductId", - "location": "uri", - "locationName": "identifier" - }, - "revision": { - "shape": "Revision", - "location": "querystring", - "locationName": "revision" - } - } - }, - "GetDataProductOutput": { - "type": "structure", - "required": ["domainId", "id", "revision", "owningProjectId", "name", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DataProductId" - }, - "revision": { - "shape": "Revision" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "name": { - "shape": "DataProductName" - }, - "status": { - "shape": "DataProductStatus" - }, - "description": { - "shape": "DataProductDescription" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "items": { - "shape": "DataProductItems" - }, - "formsOutput": { - "shape": "FormOutputList" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "firstRevisionCreatedAt": { - "shape": "CreatedAt" - }, - "firstRevisionCreatedBy": { - "shape": "CreatedBy" - } - } - }, - "GetDataSourceInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataSourceId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetDataSourceOutput": { - "type": "structure", - "required": ["id", "name", "domainId", "projectId"], - "members": { - "id": { - "shape": "DataSourceId" - }, - "status": { - "shape": "DataSourceStatus" - }, - "type": { - "shape": "String" - }, - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "connectionId": { - "shape": "String" - }, - "configuration": { - "shape": "DataSourceConfigurationOutput" - }, - "recommendation": { - "shape": "RecommendationConfiguration" - }, - "enableSetting": { - "shape": "EnableSetting" - }, - "publishOnImport": { - "shape": "Boolean" - }, - "assetFormsOutput": { - "shape": "FormOutputList" - }, - "schedule": { - "shape": "ScheduleConfiguration" - }, - "lastRunStatus": { - "shape": "DataSourceRunStatus" - }, - "lastRunAt": { - "shape": "DateTime" - }, - "lastRunErrorMessage": { - "shape": "DataSourceErrorMessage" - }, - "lastRunAssetCount": { - "shape": "Integer" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - }, - "selfGrantStatus": { - "shape": "SelfGrantStatusOutput" - } - } - }, - "GetDataSourceRunInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataSourceRunId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetDataSourceRunOutput": { - "type": "structure", - "required": ["domainId", "dataSourceId", "id", "projectId", "status", "type", "createdAt", "updatedAt"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "dataSourceId": { - "shape": "DataSourceId" - }, - "id": { - "shape": "DataSourceRunId" - }, - "projectId": { - "shape": "ProjectId" - }, - "status": { - "shape": "DataSourceRunStatus" - }, - "type": { - "shape": "DataSourceRunType" - }, - "dataSourceConfigurationSnapshot": { - "shape": "String" - }, - "runStatisticsForAssets": { - "shape": "RunStatisticsForAssets" - }, - "lineageSummary": { - "shape": "DataSourceRunLineageSummary" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - }, - "startedAt": { - "shape": "DateTime" - }, - "stoppedAt": { - "shape": "DateTime" - } - } - }, - "GetDesignationInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DesignationId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetDesignationOutput": { - "type": "structure", - "required": [ - "domainId", - "id", - "name", - "projectId", - "designationConfigurationId", - "allowedActions", - "roleTag", - "provider", - "createdBy" - ], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DesignationId" - }, - "name": { - "shape": "DesignationName" - }, - "projectId": { - "shape": "ProjectId" - }, - "designationConfigurationId": { - "shape": "DesignationConfigurationId" - }, - "allowedActions": { - "shape": "AllowedDataZoneActions" - }, - "roleTag": { - "shape": "RoleTag" - }, - "description": { - "shape": "Description" - }, - "provider": { - "shape": "String" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "domainUnitId": { - "shape": "DomainUnitId", - "internalonly": true - } - } - }, - "GetDomainExecutionRoleCredentialsRequest": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - } - } - }, - "GetDomainExecutionRoleCredentialsResponse": { - "type": "structure", - "members": { - "credentials": { - "shape": "AwsCredentials" - } - } - }, - "GetDomainInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetDomainOutput": { - "type": "structure", - "required": ["id", "status"], - "members": { - "id": { - "shape": "DomainId" - }, - "rootDomainUnitId": { - "shape": "DomainUnitId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "singleSignOn": { - "shape": "SingleSignOn" - }, - "domainExecutionRole": { - "shape": "RoleArn" - }, - "arn": { - "shape": "String" - }, - "kmsKeyIdentifier": { - "shape": "KmsKeyArn" - }, - "status": { - "shape": "DomainStatus" - }, - "failureReasons": { - "shape": "FailureReasonsList" - }, - "portalUrl": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "tags": { - "shape": "Tags" - }, - "provisionStatus": { - "shape": "ProvisionStatus", - "internalonly": true - }, - "domainVersion": { - "shape": "DomainVersion" - }, - "domainServiceRole": { - "shape": "AdminApiRoleArn", - "deprecated": true, - "internalonly": true - }, - "serviceRole": { - "shape": "AdminApiRoleArn" - }, - "supportedDomainVersions": { - "shape": "SupportedDomainVersions", - "internalonly": true - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "GetDomainPolicyInput": { - "type": "structure", - "required": ["domainId", "policyId"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "policyId": { - "shape": "PolicyId", - "location": "uri", - "locationName": "policyId" - } - } - }, - "GetDomainPolicyOutput": { - "type": "structure", - "required": ["sourceDomainId", "owningProjectId", "name"], - "members": { - "sourceDomainId": { - "shape": "DomainId" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "applicableScope": { - "shape": "ApplicableScopeList" - }, - "policyType": { - "shape": "PolicyType" - }, - "policyContent": { - "shape": "PolicyContent" - } - } - }, - "GetDomainSharingPolicyInput": { - "type": "structure", - "required": ["domainArn"], - "members": { - "domainArn": { - "shape": "DomainArn", - "location": "uri", - "locationName": "domainArn" - } - } - }, - "GetDomainSharingPolicyOutput": { - "type": "structure", - "members": { - "domainArn": { - "shape": "DomainArn" - }, - "policy": { - "shape": "String" - } - } - }, - "GetDomainUnitInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DomainUnitId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetDomainUnitOutput": { - "type": "structure", - "required": ["id", "domainId", "name", "owners", "ancestorDomainUnitIds"], - "members": { - "id": { - "shape": "DomainUnitId" - }, - "domainUnitId": { - "shape": "DomainUnitId", - "internalonly": true - }, - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "DomainUnitName" - }, - "parentDomainUnitId": { - "shape": "DomainUnitId" - }, - "description": { - "shape": "DomainUnitDescription" - }, - "owners": { - "shape": "DomainUnitOwners" - }, - "ancestorDomainUnitIds": { - "shape": "DomainUnitIds" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "lastUpdatedBy": { - "shape": "UpdatedBy" - } - } - }, - "GetDomainUnitPolicyInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DomainUnitPolicyId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetDomainUnitPolicyOutput": { - "type": "structure", - "required": ["id", "domainId", "description", "policyTarget", "details"], - "members": { - "id": { - "shape": "DomainUnitPolicyId" - }, - "domainId": { - "shape": "DomainId" - }, - "description": { - "shape": "String" - }, - "policyTarget": { - "shape": "PolicyTarget" - }, - "details": { - "shape": "Details" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "lastUpdatedBy": { - "shape": "UpdatedBy" - } - } - }, - "GetEnvironmentActionInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "identifier": { - "shape": "String", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetEnvironmentActionLinkInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "consoleType": { - "shape": "String", - "location": "querystring", - "locationName": "consoleType" - }, - "durationSeconds": { - "shape": "DurationSeconds", - "internalonly": true, - "location": "querystring", - "locationName": "durationSeconds" - } - } - }, - "GetEnvironmentActionLinkOutput": { - "type": "structure", - "members": { - "actionLink": { - "shape": "String" - } - } - }, - "GetEnvironmentActionOutput": { - "type": "structure", - "required": ["domainId", "environmentId", "id", "name", "parameters"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "id": { - "shape": "EnvironmentActionId" - }, - "name": { - "shape": "String" - }, - "parameters": { - "shape": "ActionParameters" - }, - "description": { - "shape": "String" - } - } - }, - "GetEnvironmentBlueprintConfigurationInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentBlueprintIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId", - "location": "uri", - "locationName": "environmentBlueprintIdentifier" - } - } - }, - "GetEnvironmentBlueprintConfigurationOutput": { - "type": "structure", - "required": ["domainId", "environmentBlueprintId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "provisioningRoleArn": { - "shape": "RoleArn" - }, - "environmentRolePermissionBoundary": { - "shape": "PolicyArn" - }, - "manageAccessRoleArn": { - "shape": "RoleArn" - }, - "enabledRegions": { - "shape": "EnabledRegionList" - }, - "regionalParameters": { - "shape": "RegionalParameterMap" - }, - "allowUserProvidedConfigurations": { - "shape": "Boolean" - }, - "allowS3LocationRegistration": { - "shape": "Boolean", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "resourceConfigurations": { - "shape": "ResourceConfigurations" - }, - "lakeFormationConfiguration": { - "shape": "LakeFormationConfiguration", - "internalonly": true - }, - "globalParameters": { - "shape": "GlobalParameterMap", - "internalonly": true - }, - "provisioningConfigurations": { - "shape": "ProvisioningConfigurationList" - } - } - }, - "GetEnvironmentBlueprintInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentBlueprintId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetEnvironmentBlueprintOutput": { - "type": "structure", - "required": ["id", "name", "provider", "provisioningProperties"], - "members": { - "id": { - "shape": "EnvironmentBlueprintId" - }, - "name": { - "shape": "EnvironmentBlueprintName" - }, - "description": { - "shape": "Description" - }, - "changeLog": { - "shape": "String", - "internalonly": true - }, - "provider": { - "shape": "String" - }, - "provisioningPolicy": { - "shape": "ProvisioningPolicy", - "internalonly": true - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "deploymentProperties": { - "shape": "DeploymentProperties" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "blueprintCategory": { - "shape": "String", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "GetEnvironmentCredentialsInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "durationSeconds": { - "shape": "DurationSeconds", - "internalonly": true, - "location": "querystring", - "locationName": "durationSeconds" - }, - "designation": { - "shape": "DesignationName", - "internalonly": true, - "location": "querystring", - "locationName": "designation" - } - } - }, - "GetEnvironmentCredentialsOutput": { - "type": "structure", - "members": { - "accessKeyId": { - "shape": "String" - }, - "secretAccessKey": { - "shape": "String" - }, - "sessionToken": { - "shape": "String" - }, - "expiration": { - "shape": "SyntheticTimestamp_date_time" - }, - "identityEnhancedCredentials": { - "shape": "IdentityEnhancedCredentials", - "internalonly": true - } - }, - "sensitive": true - }, - "GetEnvironmentInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetEnvironmentOutput": { - "type": "structure", - "required": ["projectId", "domainId", "createdBy", "name", "provider"], - "members": { - "projectId": { - "shape": "ProjectId" - }, - "id": { - "shape": "EnvironmentId" - }, - "domainId": { - "shape": "DomainId" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentName" - }, - "description": { - "shape": "Description" - }, - "environmentProfileId": { - "shape": "EnvironmentProfileId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "provider": { - "shape": "String" - }, - "provisionedResources": { - "shape": "ResourceList" - }, - "permittedResources": { - "shape": "ResourceList", - "internalonly": true - }, - "status": { - "shape": "EnvironmentStatus" - }, - "environmentActions": { - "shape": "EnvironmentActionList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "lastDeployment": { - "shape": "Deployment" - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "deploymentProperties": { - "shape": "DeploymentProperties" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "environmentConfigurationId": { - "shape": "EnvironmentConfigurationId", - "internalonly": true - } - } - }, - "GetEnvironmentProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentProfileId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetEnvironmentProfileOutput": { - "type": "structure", - "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], - "members": { - "id": { - "shape": "EnvironmentProfileId" - }, - "domainId": { - "shape": "DomainId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentProfileName" - }, - "description": { - "shape": "Description" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "projectId": { - "shape": "ProjectId" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "resourceConfigurationId": { - "shape": "ResourceConfigurationId" - } - } - }, - "GetEnvironmentRoleInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "environmentRoleArn": { - "shape": "RoleArn", - "location": "uri", - "locationName": "environmentRoleArn" - } - } - }, - "GetEnvironmentRoleOutput": { - "type": "structure", - "required": ["domainId", "environmentId", "arn", "provider", "roleTag"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "arn": { - "shape": "RoleArn" - }, - "provider": { - "shape": "String" - }, - "type": { - "shape": "EnvironmentRoleType" - }, - "roleTag": { - "shape": "RoleTag" - } - } - }, - "GetFormTypeInput": { - "type": "structure", - "required": ["domainIdentifier", "formTypeIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "formTypeIdentifier": { - "shape": "FormTypeIdentifier", - "location": "uri", - "locationName": "formTypeIdentifier" - }, - "revision": { - "shape": "Revision", - "location": "querystring", - "locationName": "revision" - }, - "modelFormat": { - "shape": "ModelFormat", - "internalonly": true, - "location": "querystring", - "locationName": "modelFormat" - } - } - }, - "GetFormTypeOutput": { - "type": "structure", - "required": ["domainId", "name", "revision", "model"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "FormTypeName" - }, - "revision": { - "shape": "Revision" - }, - "model": { - "shape": "Model" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "originDomainId": { - "shape": "DomainId" - }, - "originProjectId": { - "shape": "ProjectId" - }, - "status": { - "shape": "FormTypeStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "description": { - "shape": "Description" - }, - "imports": { - "shape": "ImportList" - } - } - }, - "GetGlossaryInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "GlossaryId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetGlossaryOutput": { - "type": "structure", - "required": ["domainId", "id", "owningProjectId", "name", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GlossaryId" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "name": { - "shape": "GlossaryName" - }, - "description": { - "shape": "GlossaryDescription" - }, - "status": { - "shape": "GlossaryStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - } - } - }, - "GetGlossaryTermInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "GlossaryTermId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetGlossaryTermOutput": { - "type": "structure", - "required": ["domainId", "glossaryId", "id", "name", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "glossaryId": { - "shape": "GlossaryId" - }, - "id": { - "shape": "GlossaryTermId" - }, - "name": { - "shape": "GlossaryTermName" - }, - "shortDescription": { - "shape": "ShortDescription" - }, - "longDescription": { - "shape": "LongDescription" - }, - "termRelations": { - "shape": "TermRelations" - }, - "status": { - "shape": "GlossaryTermStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - } - } - }, - "GetGroupProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "groupIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "groupIdentifier": { - "shape": "GroupIdentifier", - "location": "uri", - "locationName": "groupIdentifier" - } - } - }, - "GetGroupProfileOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GroupProfileId" - }, - "status": { - "shape": "GroupProfileStatus" - }, - "groupName": { - "shape": "GroupProfileName" - } - } - }, - "GetIamPortalLoginUrlInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "portalVersion": { - "shape": "PortalVersion", - "internalonly": true - } - } - }, - "GetIamPortalLoginUrlOutput": { - "type": "structure", - "required": ["userProfileId"], - "members": { - "authCodeUrl": { - "shape": "AuthCodeUrl" - }, - "userProfileId": { - "shape": "String" - } - } - }, - "GetJobRunInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "RunIdentifier", - "location": "uri", - "locationName": "identifier" - } - }, - "internalonly": true - }, - "GetJobRunOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "String" - }, - "jobId": { - "shape": "String" - }, - "jobType": { - "shape": "JobType" - }, - "runMode": { - "shape": "JobRunMode" - }, - "details": { - "shape": "JobRunDetails" - }, - "status": { - "shape": "JobRunStatus" - }, - "error": { - "shape": "JobRunError" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "Timestamp" - }, - "startTime": { - "shape": "Timestamp" - }, - "endTime": { - "shape": "Timestamp" - } - }, - "internalonly": true - }, - "GetLineageEventInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "LineageEventIdentifier", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetLineageEventOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId", - "location": "header", - "locationName": "Domain-Id" - }, - "id": { - "shape": "LineageEventIdentifier", - "location": "header", - "locationName": "Id" - }, - "event": { - "shape": "LineageEvent" - }, - "createdBy": { - "shape": "CreatedBy", - "location": "header", - "locationName": "Created-By" - }, - "processingStatus": { - "shape": "LineageEventProcessingStatus", - "location": "header", - "locationName": "Processing-Status" - }, - "eventTime": { - "shape": "Timestamp", - "location": "header", - "locationName": "Event-Time" - }, - "createdAt": { - "shape": "CreatedAt", - "location": "header", - "locationName": "Created-At" - } - }, - "payload": "event" - }, - "GetLineageNodeInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "LineageNodeIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "eventTimestamp": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "timestamp" - } - } - }, - "GetLineageNodeOutput": { - "type": "structure", - "required": ["domainId", "id", "typeName"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "id": { - "shape": "LineageNodeId" - }, - "typeName": { - "shape": "String" - }, - "typeRevision": { - "shape": "Revision" - }, - "sourceIdentifier": { - "shape": "String" - }, - "eventTimestamp": { - "shape": "Timestamp" - }, - "formsOutput": { - "shape": "FormOutputList" - }, - "upstreamNodes": { - "shape": "LineageNodeReferenceList" - }, - "downstreamNodes": { - "shape": "LineageNodeReferenceList" - } - } - }, - "GetListingInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ListingId", - "location": "uri", - "locationName": "identifier" - }, - "listingRevision": { - "shape": "Revision", - "location": "querystring", - "locationName": "listingRevision" - } - } - }, - "GetListingOutput": { - "type": "structure", - "required": ["domainId", "id", "listingRevision"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ListingId" - }, - "listingRevision": { - "shape": "Revision" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "item": { - "shape": "ListingItem" - }, - "name": { - "shape": "ListingName" - }, - "description": { - "shape": "Description" - }, - "status": { - "shape": "ListingStatus" - } - } - }, - "GetMetadataGenerationRunInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "MetadataGenerationRunIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "type": { - "shape": "MetadataGenerationRunType", - "internalonly": true, - "location": "querystring", - "locationName": "type" - } - } - }, - "GetMetadataGenerationRunOutput": { - "type": "structure", - "required": ["domainId", "id", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "MetadataGenerationRunIdentifier" - }, - "target": { - "shape": "MetadataGenerationRunTarget" - }, - "status": { - "shape": "MetadataGenerationRunStatus" - }, - "type": { - "shape": "MetadataGenerationRunType" - }, - "types": { - "shape": "MetadataGenerationRunTypes", - "internalonly": true - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "typeStats": { - "shape": "MetadataGenerationRunTypeStats", - "internalonly": true - } - } - }, - "GetPartnerIntegrationInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "PartnerIntegrationId", - "location": "uri", - "locationName": "identifier" - } - }, - "internalonly": true - }, - "GetPartnerIntegrationOutput": { - "type": "structure", - "required": ["id", "status", "partnerId", "name"], - "members": { - "id": { - "shape": "PartnerIntegrationId" - }, - "createdAt": { - "shape": "CreatedAtTimestamp" - }, - "updatedAt": { - "shape": "UpdatedAtTimestamp" - }, - "status": { - "shape": "PartnerIntegrationStatus" - }, - "partnerId": { - "shape": "PartnerId" - }, - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "props": { - "shape": "PartnerIntegrationPropertiesOutput" - } - }, - "internalonly": true - }, - "GetPortalFeatureFlagsInput": { - "type": "structure", - "required": ["domainId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "jwtToken": { - "shape": "String", - "location": "header", - "locationName": "jwt-token" - }, - "csrfToken": { - "shape": "String", - "location": "header", - "locationName": "x-csrf-token" - } - } - }, - "GetPortalFeatureFlagsOutput": { - "type": "structure", - "members": { - "featureFlags": { - "shape": "FeatureFlagList" - } - } - }, - "GetProjectInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetProjectMembershipRequestInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier", "requestIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "projectIdentifier" - }, - "requestIdentifier": { - "shape": "RequestId", - "location": "uri", - "locationName": "requestIdentifier" - } - } - }, - "GetProjectMembershipRequestOutput": { - "type": "structure", - "required": [ - "domainId", - "projectId", - "requestId", - "requestedDesignation", - "reasonDescription", - "requesterId" - ], - "members": { - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "requestId": { - "shape": "RequestId" - }, - "requestedDesignation": { - "shape": "UserDesignation" - }, - "requestStatus": { - "shape": "RequestStatus" - }, - "reasonDescription": { - "shape": "ReasonDescription" - }, - "requesterId": { - "shape": "String" - }, - "lastUpdatedBy": { - "shape": "String" - }, - "requestedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "GetProjectOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectId" - }, - "name": { - "shape": "ProjectName" - }, - "description": { - "shape": "Description" - }, - "projectStatus": { - "shape": "ProjectStatus", - "documentation": "

Status of the project

" - }, - "failureReasons": { - "shape": "FailureReasons", - "documentation": "

Reasons for failed project deletion

" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "tags": { - "shape": "Tags", - "internalonly": true - }, - "resourceTags": { - "shape": "ResourceTags" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "projectProfileId": { - "shape": "ProjectProfileId", - "internalonly": true - }, - "userParameters": { - "shape": "EnvironmentConfigurationUserParametersList", - "internalonly": true - }, - "environmentDeploymentDetails": { - "shape": "EnvironmentDeploymentDetails", - "internalonly": true - }, - "projectCategory": { - "shape": "String", - "internalonly": true - } - } - }, - "GetProjectProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ProjectProfileId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetProjectProfileOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectProfileId" - }, - "name": { - "shape": "ProjectProfileName" - }, - "description": { - "shape": "Description" - }, - "changeLog": { - "shape": "String", - "internalonly": true - }, - "status": { - "shape": "Status" - }, - "projectResourceTags": { - "shape": "ProjectResourceTagParameters" - }, - "allowCustomProjectResourceTags": { - "shape": "Boolean" - }, - "projectScopes": { - "shape": "ProjectScopesList", - "internalonly": true - }, - "environmentConfigurations": { - "shape": "EnvironmentConfigurationsList" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "designationConfigurations": { - "shape": "DesignationConfigurations", - "internalonly": true - } - } - }, - "GetResourcePolicyInternalRequest": { - "type": "structure", - "members": { - "resourceArn": { - "shape": "RAMResourceARN" - }, - "internalId": { - "shape": "RAMInternalId" - } - } - }, - "GetResourcePolicyInternalResponse": { - "type": "structure", - "members": { - "policy": { - "shape": "RAMPolicy" - } - } - }, - "GetRuleInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "RuleId", - "location": "uri", - "locationName": "identifier" - }, - "revision": { - "shape": "Revision", - "location": "querystring", - "locationName": "revision" - } - } - }, - "GetRuleOutput": { - "type": "structure", - "required": [ - "identifier", - "revision", - "name", - "ruleType", - "target", - "action", - "scope", - "detail", - "createdAt", - "updatedAt", - "createdBy", - "lastUpdatedBy" - ], - "members": { - "identifier": { - "shape": "RuleId" - }, - "revision": { - "shape": "Revision" - }, - "name": { - "shape": "RuleName" - }, - "ruleType": { - "shape": "RuleType" - }, - "target": { - "shape": "RuleTarget" - }, - "action": { - "shape": "RuleAction" - }, - "scope": { - "shape": "RuleScope" - }, - "detail": { - "shape": "RuleDetail" - }, - "targetType": { - "shape": "RuleTargetType" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "lastUpdatedBy": { - "shape": "UpdatedBy" - } - } - }, - "GetServiceLinkInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ServiceLinkId", - "location": "uri", - "locationName": "identifier" - } - }, - "internalonly": true - }, - "GetServiceLinkOutput": { - "type": "structure", - "required": [ - "id", - "domainId", - "owningProjectId", - "domainUnitId", - "createdAt", - "updatedAt", - "status", - "type", - "name", - "createdBy", - "updatedBy", - "glueConnectionArn", - "serviceRoleArn", - "identityMapping", - "delegations", - "configurationOutput" - ], - "members": { - "id": { - "shape": "ServiceLinkId" - }, - "domainId": { - "shape": "DomainId" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "status": { - "shape": "ServiceLinkStatus" - }, - "type": { - "shape": "ServiceLinkType" - }, - "name": { - "shape": "ServiceLinkName" - }, - "error": { - "shape": "ServiceLinkError" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "glueConnectionArn": { - "shape": "String" - }, - "serviceRoleArn": { - "shape": "RoleArn" - }, - "identityMapping": { - "shape": "ServiceLinkIdentityMapping" - }, - "delegations": { - "shape": "ServiceLinkDelegations" - }, - "configurationOutput": { - "shape": "ServiceLinkConfigurationOutput" - } - }, - "internalonly": true - }, - "GetSharedResourcesInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "PartnerIntegrationId", - "location": "uri", - "locationName": "identifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - }, - "internalonly": true - }, - "GetSharedResourcesOutput": { - "type": "structure", - "required": ["id", "status", "partnerId", "name", "items"], - "members": { - "id": { - "shape": "PartnerIntegrationId" - }, - "createdAt": { - "shape": "CreatedAtTimestamp" - }, - "updatedAt": { - "shape": "UpdatedAtTimestamp" - }, - "status": { - "shape": "PartnerIntegrationStatus" - }, - "partnerId": { - "shape": "PartnerId" - }, - "name": { - "shape": "Name" - }, - "items": { - "shape": "SharedResources" - }, - "nextToken": { - "shape": "PaginationToken" - } - }, - "internalonly": true - }, - "GetSubscriptionEligibilityInput": { - "type": "structure", - "required": ["domainIdentifier", "listingId"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "listingId": { - "shape": "ListingId", - "location": "querystring", - "locationName": "listingId" - }, - "isBeforePublishing": { - "shape": "Boolean", - "location": "querystring", - "locationName": "isBeforePublishing" - } - } - }, - "GetSubscriptionEligibilityOutput": { - "type": "structure", - "required": ["status"], - "members": { - "status": { - "shape": "SubscriptionEligibilityStatus" - }, - "message": { - "shape": "String" - } - } - }, - "GetSubscriptionGrantInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionGrantId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetSubscriptionGrantOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "createdAt", - "updatedAt", - "subscriptionTargetId", - "grantedEntity", - "status" - ], - "members": { - "id": { - "shape": "SubscriptionGrantId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "environmentId": { - "shape": "EnvironmentId", - "internalonly": true - }, - "subscriptionTargetId": { - "shape": "SubscriptionTargetId" - }, - "grantedEntity": { - "shape": "GrantedEntity" - }, - "status": { - "shape": "SubscriptionGrantOverallStatus" - }, - "assets": { - "shape": "SubscribedAssets" - }, - "subscriptionId": { - "shape": "SubscriptionId", - "deprecated": true, - "deprecatedMessage": "Multiple subscriptions can exist for a single grant" - } - } - }, - "GetSubscriptionInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetSubscriptionOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "subscribedPrincipal", - "subscribedListing" - ], - "members": { - "id": { - "shape": "SubscriptionId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "subscribedPrincipal": { - "shape": "SubscribedPrincipal" - }, - "subscribedListing": { - "shape": "SubscribedListing" - }, - "subscriptionRequestId": { - "shape": "SubscriptionRequestId" - }, - "retainPermissions": { - "shape": "Boolean" - }, - "pushedSubscription": { - "shape": "Boolean" - }, - "expirationTimestamp": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "GetSubscriptionRequestDetailsInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionRequestId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetSubscriptionRequestDetailsOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "requestReason", - "subscribedPrincipals", - "subscribedListings" - ], - "members": { - "id": { - "shape": "SubscriptionRequestId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionRequestStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "requestReason": { - "shape": "RequestReason" - }, - "subscribedPrincipals": { - "shape": "GetSubscriptionRequestDetailsOutputSubscribedPrincipalsList" - }, - "subscribedListings": { - "shape": "GetSubscriptionRequestDetailsOutputSubscribedListingsList" - }, - "reviewerId": { - "shape": "String" - }, - "decisionComment": { - "shape": "DecisionComment" - }, - "existingSubscriptionId": { - "shape": "SubscriptionId" - }, - "metadataForms": { - "shape": "MetadataForms" - } - } - }, - "GetSubscriptionRequestDetailsOutputSubscribedListingsList": { - "type": "list", - "member": { - "shape": "SubscribedListing" - }, - "max": 1, - "min": 1 - }, - "GetSubscriptionRequestDetailsOutputSubscribedPrincipalsList": { - "type": "list", - "member": { - "shape": "SubscribedPrincipal" - }, - "max": 1, - "min": 1 - }, - "GetSubscriptionTargetInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "identifier": { - "shape": "SubscriptionTargetId", - "location": "uri", - "locationName": "identifier" - } - } - }, - "GetSubscriptionTargetOutput": { - "type": "structure", - "required": [ - "id", - "authorizedPrincipals", - "domainId", - "projectId", - "environmentId", - "name", - "type", - "createdBy", - "createdAt", - "applicableAssetTypes", - "subscriptionTargetConfig", - "provider" - ], - "members": { - "id": { - "shape": "SubscriptionTargetId" - }, - "authorizedPrincipals": { - "shape": "AuthorizedPrincipalIdentifiers" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "SubscriptionTargetName" - }, - "type": { - "shape": "String" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "manageAccessRole": { - "shape": "IamRoleArn" - }, - "applicableAssetTypes": { - "shape": "ApplicableAssetTypes" - }, - "subscriptionTargetConfig": { - "shape": "SubscriptionTargetForms" - }, - "provider": { - "shape": "String" - }, - "timeoutMinutes": { - "shape": "GetSubscriptionTargetOutputTimeoutMinutesInteger" - } - } - }, - "GetSubscriptionTargetOutputTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "min": 1 - }, - "GetTimeSeriesDataPointInput": { - "type": "structure", - "required": ["domainIdentifier", "entityIdentifier", "entityType", "identifier", "formName"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityIdentifier": { - "shape": "EntityIdentifier", - "location": "uri", - "locationName": "entityIdentifier" - }, - "entityType": { - "shape": "TimeSeriesEntityType", - "location": "uri", - "locationName": "entityType" - }, - "identifier": { - "shape": "TimeSeriesDataPointIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "formName": { - "shape": "TimeSeriesFormName", - "location": "querystring", - "locationName": "formName" - } - } - }, - "GetTimeSeriesDataPointOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "entityId": { - "shape": "EntityId" - }, - "entityType": { - "shape": "TimeSeriesEntityType" - }, - "formName": { - "shape": "TimeSeriesFormName" - }, - "form": { - "shape": "TimeSeriesDataPointFormOutput" - } - } - }, - "GetUpdateEligibilityInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier", "type"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "String", - "location": "uri", - "locationName": "identifier" - }, - "type": { - "shape": "EligibilityType", - "location": "querystring", - "locationName": "type" - } - } - }, - "GetUpdateEligibilityOutput": { - "type": "structure", - "required": ["status"], - "members": { - "status": { - "shape": "EligibilityStatus" - }, - "message": { - "shape": "String" - } - } - }, - "GetUserProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "userIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "userIdentifier": { - "shape": "UserIdentifier", - "location": "uri", - "locationName": "userIdentifier" - }, - "type": { - "shape": "UserProfileType", - "location": "querystring", - "locationName": "type" - } - } - }, - "GetUserProfileOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "UserProfileId" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "GitPropertiesInput": { - "type": "structure", - "members": { - "branch": { - "shape": "String" - }, - "codestarConnectionArn": { - "shape": "String" - }, - "ownerId": { - "shape": "String" - }, - "repositoryName": { - "shape": "String" - }, - "repositoryType": { - "shape": "RepositoryType" - } - } - }, - "GitPropertiesOutput": { - "type": "structure", - "members": { - "branch": { - "shape": "String" - }, - "codestarConnectionArn": { - "shape": "String" - }, - "ownerId": { - "shape": "String" - }, - "repositoryName": { - "shape": "String" - }, - "repositoryType": { - "shape": "RepositoryType" - } - } - }, - "GlobalParameterMap": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - }, - "GlossaryDescription": { - "type": "string", - "max": 4096, - "min": 0, - "sensitive": true - }, - "GlossaryId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "GlossaryItem": { - "type": "structure", - "required": ["domainId", "id", "name", "owningProjectId", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GlossaryId" - }, - "name": { - "shape": "GlossaryName" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "description": { - "shape": "GlossaryDescription" - }, - "status": { - "shape": "GlossaryStatus" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "additionalAttributes": { - "shape": "GlossaryItemAdditionalAttributes" - } - } - }, - "GlossaryItemAdditionalAttributes": { - "type": "structure", - "members": { - "matchRationale": { - "shape": "MatchRationale" - } - } - }, - "GlossaryItems": { - "type": "list", - "member": { - "shape": "GlossaryItem" - } - }, - "GlossaryName": { - "type": "string", - "max": 256, - "min": 1, - "sensitive": true - }, - "GlossaryStatus": { - "type": "string", - "enum": ["DISABLED", "ENABLED"] - }, - "GlossaryTermEnforcementDetail": { - "type": "structure", - "members": { - "requiredGlossaryTermIds": { - "shape": "GlossaryTermIdentifiers" - } - }, - "internalonly": true - }, - "GlossaryTermId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "GlossaryTermIdentifiers": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "internalonly": true, - "max": 5, - "min": 1 - }, - "GlossaryTermItem": { - "type": "structure", - "required": ["domainId", "glossaryId", "id", "name", "status"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "glossaryId": { - "shape": "GlossaryId" - }, - "id": { - "shape": "GlossaryTermId" - }, - "name": { - "shape": "GlossaryTermName" - }, - "shortDescription": { - "shape": "ShortDescription" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - }, - "longDescription": { - "shape": "LongDescription" - }, - "termRelations": { - "shape": "TermRelations" - }, - "status": { - "shape": "GlossaryTermStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "additionalAttributes": { - "shape": "GlossaryTermItemAdditionalAttributes" - } - } - }, - "GlossaryTermItemAdditionalAttributes": { - "type": "structure", - "members": { - "matchRationale": { - "shape": "MatchRationale" - } - } - }, - "GlossaryTermItems": { - "type": "list", - "member": { - "shape": "GlossaryTermItem" - } - }, - "GlossaryTermName": { - "type": "string", - "max": 256, - "min": 1, - "sensitive": true - }, - "GlossaryTermStatus": { - "type": "string", - "enum": ["ENABLED", "DISABLED"] - }, - "GlossaryTerms": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 20, - "min": 1 - }, - "GlossaryUsageRestriction": { - "type": "string", - "enum": ["ASSET_GOVERNED_TERMS"] - }, - "GlossaryUsageRestrictions": { - "type": "list", - "member": { - "shape": "GlossaryUsageRestriction" - }, - "max": 1, - "min": 1 - }, - "GlueCatalogId": { - "type": "string", - "max": 255, - "min": 1, - "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" - }, - "GlueConnection": { - "type": "structure", - "members": { - "name": { - "shape": "String" - }, - "description": { - "shape": "GlueConnectionDescriptionString" - }, - "connectionType": { - "shape": "ConnectionType" - }, - "matchCriteria": { - "shape": "MatchCriteria" - }, - "connectionProperties": { - "shape": "ConnectionProperties" - }, - "sparkProperties": { - "shape": "PropertyMap" - }, - "athenaProperties": { - "shape": "PropertyMap" - }, - "pythonProperties": { - "shape": "PropertyMap" - }, - "physicalConnectionRequirements": { - "shape": "PhysicalConnectionRequirements" - }, - "creationTime": { - "shape": "Timestamp" - }, - "lastUpdatedTime": { - "shape": "Timestamp" - }, - "lastUpdatedBy": { - "shape": "String" - }, - "status": { - "shape": "ConnectionStatus" - }, - "statusReason": { - "shape": "GlueConnectionStatusReasonString" - }, - "lastConnectionValidationTime": { - "shape": "Timestamp" - }, - "authenticationConfiguration": { - "shape": "AuthenticationConfiguration" - }, - "connectionSchemaVersion": { - "shape": "GlueConnectionConnectionSchemaVersionInteger" - }, - "compatibleComputeEnvironments": { - "shape": "ComputeEnvironmentsList" - } - } - }, - "GlueConnectionConnectionSchemaVersionInteger": { - "type": "integer", - "box": true, - "max": 2, - "min": 1 - }, - "GlueConnectionDescriptionString": { - "type": "string", - "max": 2048, - "min": 0 - }, - "GlueConnectionInput": { - "type": "structure", - "members": { - "connectionProperties": { - "shape": "ConnectionProperties" - }, - "physicalConnectionRequirements": { - "shape": "PhysicalConnectionRequirements" - }, - "name": { - "shape": "GlueConnectionInputNameString" - }, - "description": { - "shape": "GlueConnectionInputDescriptionString" - }, - "connectionType": { - "shape": "GlueConnectionType" - }, - "matchCriteria": { - "shape": "GlueConnectionInputMatchCriteriaString" - }, - "validateCredentials": { - "shape": "Boolean" - }, - "validateForComputeEnvironments": { - "shape": "ComputeEnvironmentsList" - }, - "sparkProperties": { - "shape": "PropertyMap" - }, - "athenaProperties": { - "shape": "PropertyMap" - }, - "pythonProperties": { - "shape": "PropertyMap" - }, - "authenticationConfiguration": { - "shape": "AuthenticationConfigurationInput" - } - } - }, - "GlueConnectionInputDescriptionString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\r\\n\\t]*" - }, - "GlueConnectionInputMatchCriteriaString": { - "type": "string", - "max": 10, - "min": 0 - }, - "GlueConnectionInputNameString": { - "type": "string", - "max": 41, - "min": 1, - "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" - }, - "GlueConnectionName": { - "type": "string", - "max": 255, - "min": 1, - "pattern": "[\\S]*" - }, - "GlueConnectionPatch": { - "type": "structure", - "members": { - "description": { - "shape": "GlueConnectionPatchDescriptionString" - }, - "connectionProperties": { - "shape": "ConnectionProperties" - }, - "authenticationConfiguration": { - "shape": "AuthenticationConfigurationPatch" - } - } - }, - "GlueConnectionPatchDescriptionString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "[\\S\\s]*", - "sensitive": true - }, - "GlueConnectionStatusReasonString": { - "type": "string", - "max": 16384, - "min": 1 - }, - "GlueConnectionType": { - "type": "string", - "enum": [ - "SNOWFLAKE", - "BIGQUERY", - "DOCUMENTDB", - "DYNAMODB", - "MYSQL", - "OPENSEARCH", - "ORACLE", - "POSTGRESQL", - "REDSHIFT", - "SAPHANA", - "SQLSERVER", - "TERADATA", - "VERTICA", - "ICEBERGRESTCATALOG", - "SNOWFLAKEICEBERGRESTCATALOG", - "DATABRICKSICEBERGRESTCATALOG" - ] - }, - "GlueOAuth2Credentials": { - "type": "structure", - "members": { - "userManagedClientApplicationClientSecret": { - "shape": "GlueOAuth2CredentialsUserManagedClientApplicationClientSecretString" - }, - "accessToken": { - "shape": "GlueOAuth2CredentialsAccessTokenString" - }, - "refreshToken": { - "shape": "GlueOAuth2CredentialsRefreshTokenString" - }, - "jwtToken": { - "shape": "GlueOAuth2CredentialsJwtTokenString" - } - }, - "sensitive": true - }, - "GlueOAuth2CredentialsAccessTokenString": { - "type": "string", - "max": 4096, - "min": 0, - "pattern": "[\\x20-\\x7E]*" - }, - "GlueOAuth2CredentialsJwtTokenString": { - "type": "string", - "max": 8000, - "min": 0, - "pattern": "([a-zA-Z0-9_=]+)\\.([a-zA-Z0-9_=]+)\\.([a-zA-Z0-9_\\-\\+\\/=]*)" - }, - "GlueOAuth2CredentialsRefreshTokenString": { - "type": "string", - "max": 4096, - "min": 0, - "pattern": "[\\x20-\\x7E]*" - }, - "GlueOAuth2CredentialsUserManagedClientApplicationClientSecretString": { - "type": "string", - "max": 512, - "min": 0, - "pattern": "[\\x20-\\x7E]*" - }, - "GluePropertiesInput": { - "type": "structure", - "members": { - "glueConnectionInput": { - "shape": "GlueConnectionInput" - }, - "provisioningMode": { - "shape": "ProvisioningMode", - "internalonly": true - } - } - }, - "GluePropertiesOutput": { - "type": "structure", - "members": { - "status": { - "shape": "ConnectionStatus" - }, - "errorMessage": { - "shape": "String" - }, - "provisioningMode": { - "shape": "ProvisioningMode", - "internalonly": true - }, - "provisionedResources": { - "shape": "ProvisionedResources" - } - } - }, - "GluePropertiesPatch": { - "type": "structure", - "members": { - "glueConnectionInput": { - "shape": "GlueConnectionPatch" - }, - "provisioningMode": { - "shape": "ProvisioningMode", - "internalonly": true - } - } - }, - "GlueRunConfigurationInput": { - "type": "structure", - "required": ["relationalFilterConfigurations"], - "members": { - "dataAccessRole": { - "shape": "GlueRunConfigurationInputDataAccessRoleString" - }, - "relationalFilterConfigurations": { - "shape": "RelationalFilterConfigurations" - }, - "autoImportDataQualityResult": { - "shape": "Boolean", - "internalonly": true - }, - "selfGrantSetting": { - "shape": "SelfGrantSetting" - }, - "catalogName": { - "shape": "GlueRunConfigurationInputCatalogNameString", - "internalonly": true - } - } - }, - "GlueRunConfigurationInputCatalogNameString": { - "type": "string", - "max": 128, - "min": 1 - }, - "GlueRunConfigurationInputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "GlueRunConfigurationOutput": { - "type": "structure", - "required": ["relationalFilterConfigurations"], - "members": { - "accountId": { - "shape": "GlueRunConfigurationOutputAccountIdString" - }, - "region": { - "shape": "GlueRunConfigurationOutputRegionString" - }, - "dataAccessRole": { - "shape": "GlueRunConfigurationOutputDataAccessRoleString" - }, - "relationalFilterConfigurations": { - "shape": "RelationalFilterConfigurations" - }, - "autoImportDataQualityResult": { - "shape": "Boolean", - "internalonly": true - }, - "selfGrantSetting": { - "shape": "SelfGrantSetting" - }, - "catalogName": { - "shape": "GlueRunConfigurationOutputCatalogNameString", - "internalonly": true - } - } - }, - "GlueRunConfigurationOutputAccountIdString": { - "type": "string", - "max": 12, - "min": 12, - "pattern": "\\d{12}" - }, - "GlueRunConfigurationOutputCatalogNameString": { - "type": "string", - "max": 128, - "min": 1 - }, - "GlueRunConfigurationOutputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "GlueRunConfigurationOutputRegionString": { - "type": "string", - "max": 16, - "min": 4, - "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" - }, - "GlueSelfGrantStatusOutput": { - "type": "structure", - "required": ["selfGrantStatusDetails"], - "members": { - "selfGrantStatusDetails": { - "shape": "SelfGrantStatusDetails" - } - } - }, - "GovernanceType": { - "type": "string", - "enum": ["AWS_MANAGED", "USER_MANAGED"] - }, - "GovernedEntityType": { - "type": "string", - "enum": ["ASSET"] - }, - "GrantIdentifier": { - "type": "string", - "pattern": "[A-Za-z0-9+/]{10}" - }, - "GrantedEntity": { - "type": "structure", - "members": { - "listing": { - "shape": "ListingRevision" - } - }, - "union": true - }, - "GrantedEntityInput": { - "type": "structure", - "members": { - "listing": { - "shape": "ListingRevisionInput" - } - }, - "union": true - }, - "GreaterThanExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "GreaterThanOrEqualToExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "GroupDetails": { - "type": "structure", - "required": ["groupId"], - "members": { - "groupId": { - "shape": "String" - } - } - }, - "GroupIdentifier": { - "type": "string", - "pattern": ".*(^([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$|[\\p{L}\\p{M}\\p{S}\\p{N}\\p{P}\\t\\n\\r ]+).*" - }, - "GroupPolicyGrantPrincipal": { - "type": "structure", - "members": { - "groupIdentifier": { - "shape": "GroupIdentifier" - } - }, - "union": true - }, - "GroupPolicyPrincipal": { - "type": "structure", - "members": { - "groupIdentifier": { - "shape": "GroupIdentifier" - } - } - }, - "GroupProfile": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GroupProfileId" - }, - "status": { - "shape": "GroupProfileStatus" - }, - "groupName": { - "shape": "GroupProfileName" - } - } - }, - "GroupProfileId": { - "type": "string", - "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - }, - "GroupProfileName": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "[a-zA-Z_0-9+=,.@-]+", - "sensitive": true - }, - "GroupProfileStatus": { - "type": "string", - "enum": ["ASSIGNED", "NOT_ASSIGNED"] - }, - "GroupProfileSummaries": { - "type": "list", - "member": { - "shape": "GroupProfileSummary" - } - }, - "GroupProfileSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GroupProfileId" - }, - "status": { - "shape": "GroupProfileStatus" - }, - "groupName": { - "shape": "GroupProfileName" - } - } - }, - "GroupProfiles": { - "type": "list", - "member": { - "shape": "GroupProfile" - } - }, - "GroupSearchText": { - "type": "string", - "max": 1024, - "min": 0, - "sensitive": true - }, - "GroupSearchType": { - "type": "string", - "enum": ["SSO_GROUP", "DATAZONE_SSO_GROUP"] - }, - "HyperPodOrchestrator": { - "type": "string", - "enum": ["EKS", "SLURM"] - }, - "HyperPodPropertiesInput": { - "type": "structure", - "required": ["clusterName"], - "members": { - "clusterName": { - "shape": "HyperPodPropertiesInputClusterNameString" - } - } - }, - "HyperPodPropertiesInputClusterNameString": { - "type": "string", - "max": 63, - "min": 1, - "pattern": "[a-zA-Z0-9](-*[a-zA-Z0-9])*" - }, - "HyperPodPropertiesOutput": { - "type": "structure", - "required": ["clusterName"], - "members": { - "clusterName": { - "shape": "String" - }, - "clusterArn": { - "shape": "String" - }, - "orchestrator": { - "shape": "HyperPodOrchestrator" - } - } - }, - "IamCredential": { - "type": "structure", - "members": { - "accessKeyId": { - "shape": "String" - }, - "secretAccessKey": { - "shape": "String" - }, - "sessionToken": { - "shape": "String" - } - } - }, - "IamPropertiesInput": { - "type": "structure", - "members": { - "glueLineageSyncEnabled": { - "shape": "Boolean" - } - } - }, - "IamPropertiesOutput": { - "type": "structure", - "members": { - "environmentId": { - "shape": "String" - }, - "glueLineageSyncEnabled": { - "shape": "Boolean" - } - } - }, - "IamPropertiesPatch": { - "type": "structure", - "members": { - "glueLineageSyncEnabled": { - "shape": "Boolean" - } - } - }, - "IamRoleArn": { - "type": "string", - "pattern": "arn:aws(|-cn|-us-gov):iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" - }, - "IamRolePropertiesOutput": { - "type": "structure", - "members": { - "environmentId": { - "shape": "String" - }, - "glueLineageSyncEnabled": { - "shape": "Boolean" - } - } - }, - "IamUserProfileDetails": { - "type": "structure", - "members": { - "arn": { - "shape": "String" - }, - "principalId": { - "shape": "String" - } - } - }, - "IdentityEnhancedCredentials": { - "type": "structure", - "members": { - "accessKeyId": { - "shape": "String" - }, - "secretAccessKey": { - "shape": "String" - }, - "sessionToken": { - "shape": "String" - }, - "expiration": { - "shape": "SyntheticTimestamp_date_time" - } - }, - "sensitive": true - }, - "IdentityMapping": { - "type": "structure", - "required": ["usernameAttribute"], - "members": { - "usernameAttribute": { - "shape": "String" - }, - "prefix": { - "shape": "String" - } - } - }, - "Import": { - "type": "structure", - "required": ["name", "revision"], - "members": { - "name": { - "shape": "FormTypeName" - }, - "revision": { - "shape": "Revision" - } - } - }, - "ImportList": { - "type": "list", - "member": { - "shape": "Import" - }, - "max": 10, - "min": 1 - }, - "InExpression": { - "type": "structure", - "required": ["columnName", "values"], - "members": { - "columnName": { - "shape": "String" - }, - "values": { - "shape": "StringList" - } - } - }, - "Integer": { - "type": "integer", - "box": true - }, - "InternalServerException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 500 - }, - "exception": true, - "fault": true, - "retryable": { - "throttling": false - } - }, - "InventorySearchScope": { - "type": "string", - "enum": ["ASSET", "GLOSSARY", "GLOSSARY_TERM", "DATA_PRODUCT"] - }, - "IsNotNullExpression": { - "type": "structure", - "required": ["columnName"], - "members": { - "columnName": { - "shape": "String" - } - } - }, - "IsNullExpression": { - "type": "structure", - "required": ["columnName"], - "members": { - "columnName": { - "shape": "String" - } - } - }, - "ItemGlossaryTerms": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 2, - "min": 1 - }, - "JdbcCredentials": { - "type": "structure", - "members": { - "secretArn": { - "shape": "JdbcCredentialsSecretArnString" - }, - "usernamePassword": { - "shape": "UsernamePassword" - } - }, - "sensitive": true, - "union": true - }, - "JdbcCredentialsSecretArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws[^:]*:secretsmanager:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:secret:.*" - }, - "JdbcPropertiesInput": { - "type": "structure", - "members": { - "credentials": { - "shape": "JdbcCredentials" - }, - "dbName": { - "shape": "JdbcPropertiesInputDbNameString" - }, - "engine": { - "shape": "JdbcPropertiesInputEngineString" - }, - "host": { - "shape": "JdbcPropertiesInputHostString" - }, - "port": { - "shape": "JdbcPropertiesInputPortInteger" - } - } - }, - "JdbcPropertiesInputDbNameString": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[a-z0-9]+" - }, - "JdbcPropertiesInputEngineString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "JdbcPropertiesInputHostString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "JdbcPropertiesInputPortInteger": { - "type": "integer", - "box": true, - "max": 65535, - "min": 0 - }, - "JdbcPropertiesOutput": { - "type": "structure", - "members": { - "credentials": { - "shape": "JdbcCredentials" - }, - "isProvisionedSecret": { - "shape": "Boolean" - }, - "jdbcIamUrl": { - "shape": "String" - }, - "jdbcUrl": { - "shape": "String" - }, - "redshiftTempDir": { - "shape": "String" - } - } - }, - "JdbcPropertiesPatch": { - "type": "structure", - "members": { - "credentials": { - "shape": "JdbcCredentials" - }, - "dbName": { - "shape": "JdbcPropertiesPatchDbNameString" - }, - "engine": { - "shape": "JdbcPropertiesPatchEngineString" - }, - "host": { - "shape": "JdbcPropertiesPatchHostString" - }, - "port": { - "shape": "JdbcPropertiesPatchPortInteger" - } - } - }, - "JdbcPropertiesPatchDbNameString": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[a-z0-9]+" - }, - "JdbcPropertiesPatchEngineString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "JdbcPropertiesPatchHostString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "JdbcPropertiesPatchPortInteger": { - "type": "integer", - "box": true, - "max": 65535, - "min": 0 - }, - "JobRunDetails": { - "type": "structure", - "members": { - "lineageRunDetails": { - "shape": "LineageRunDetails" - } - }, - "internalonly": true, - "union": true - }, - "JobRunError": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "String" - } - }, - "internalonly": true - }, - "JobRunMode": { - "type": "string", - "enum": ["SCHEDULED", "ON_DEMAND"], - "internalonly": true - }, - "JobRunStatus": { - "type": "string", - "enum": [ - "SCHEDULED", - "IN_PROGRESS", - "SUCCESS", - "PARTIALLY_SUCCEEDED", - "FAILED", - "ABORTED", - "TIMED_OUT", - "CANCELED" - ], - "internalonly": true - }, - "JobRunSummaries": { - "type": "list", - "member": { - "shape": "JobRunSummary" - }, - "internalonly": true - }, - "JobRunSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "jobId": { - "shape": "String" - }, - "jobType": { - "shape": "JobType" - }, - "runId": { - "shape": "String" - }, - "runMode": { - "shape": "JobRunMode" - }, - "status": { - "shape": "JobRunStatus" - }, - "error": { - "shape": "JobRunError" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "Timestamp" - }, - "startTime": { - "shape": "Timestamp" - }, - "endTime": { - "shape": "Timestamp" - } - }, - "internalonly": true - }, - "JobType": { - "type": "string", - "enum": ["LINEAGE"], - "internalonly": true - }, - "KinesisPropertiesInput": { - "type": "structure", - "members": {} - }, - "KinesisPropertiesOutput": { - "type": "structure", - "members": {} - }, - "KinesisRunConfigurationInput": { - "type": "structure", - "members": {} - }, - "KinesisRunConfigurationOutput": { - "type": "structure", - "members": { - "accountId": { - "shape": "KinesisRunConfigurationOutputAccountIdString" - }, - "region": { - "shape": "KinesisRunConfigurationOutputRegionString" - }, - "dataAccessRole": { - "shape": "KinesisRunConfigurationOutputDataAccessRoleString" - } - } - }, - "KinesisRunConfigurationOutputAccountIdString": { - "type": "string", - "max": 12, - "min": 12, - "pattern": "\\d{12}" - }, - "KinesisRunConfigurationOutputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "KinesisRunConfigurationOutputRegionString": { - "type": "string", - "max": 16, - "min": 4, - "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" - }, - "KmsKeyArn": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "arn:aws(|-cn|-us-gov):kms:[a-zA-Z0-9-]*:[0-9]{12}:key/[a-zA-Z0-9-]{36}" - }, - "LakeFormationConfiguration": { - "type": "structure", - "members": { - "locationRegistrationRole": { - "shape": "RoleArn" - }, - "locationRegistrationExcludeS3Locations": { - "shape": "S3LocationList" - }, - "lakeFormationLocationRegistrationRole": { - "shape": "RoleArn", - "internalonly": true - }, - "excludeS3Locations": { - "shape": "S3LocationList", - "internalonly": true - } - } - }, - "LakehousePropertiesInput": { - "type": "structure", - "members": { - "glueCatalogId": { - "shape": "GlueCatalogId" - }, - "captureDataLineage": { - "shape": "Boolean", - "documentation": "

Enabling this flag captures lineage for tables managed by glue crawlers

" - } - } - }, - "LakehousePropertiesOutput": { - "type": "structure", - "members": { - "glueCatalogId": { - "shape": "GlueCatalogId" - }, - "captureDataLineage": { - "shape": "Boolean", - "documentation": "

Enabling this flag captures lineage for tables managed by glue crawlers

" - } - } - }, - "LakehousePropertiesPatch": { - "type": "structure", - "members": { - "glueCatalogId": { - "shape": "GlueCatalogId" - }, - "captureDataLineage": { - "shape": "Boolean", - "documentation": "

Enabling this flag captures lineage for tables managed by glue crawlers

" - } - } - }, - "LambdaExecutionRoleArn": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" - }, - "LambdaFunctionArn": { - "type": "string", - "pattern": "arn:(?:aws|aws-cn|aws-us-gov):lambda:(?:[a-z]{2}(?:-gov)?-[a-z]+-\\d{1,}):(\\d{12}):function:[a-zA-Z0-9-_]+(?::[a-zA-Z0-9-_]+)?(?:\\$[\\w-]+)?" - }, - "LastName": { - "type": "string", - "sensitive": true - }, - "LessThanExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "LessThanOrEqualToExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "LikeExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "LineageEvent": { - "type": "blob", - "max": 300000, - "min": 0, - "sensitive": true - }, - "LineageEventErrorMessage": { - "type": "string" - }, - "LineageEventIdentifier": { - "type": "string", - "internalonly": true, - "pattern": "[a-z0-9]{14}" - }, - "LineageEventProcessingStatus": { - "type": "string", - "enum": [ - "REQUESTED", - "PROCESSING", - "SUCCESS", - "FAILED", - "DELETE_PROCESSING", - "DELETE_PENDING", - "DELETE_FAILED" - ] - }, - "LineageEventSummaries": { - "type": "list", - "member": { - "shape": "LineageEventSummary" - } - }, - "LineageEventSummary": { - "type": "structure", - "members": { - "id": { - "shape": "LineageEventIdentifier" - }, - "domainId": { - "shape": "DomainId" - }, - "processingStatus": { - "shape": "LineageEventProcessingStatus" - }, - "eventTime": { - "shape": "Timestamp" - }, - "eventSummary": { - "shape": "EventSummary" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - } - } - }, - "LineageImportStatus": { - "type": "string", - "enum": ["IN_PROGRESS", "SUCCESS", "FAILED", "PARTIALLY_SUCCEEDED"] - }, - "LineageInfo": { - "type": "structure", - "members": { - "eventId": { - "shape": "String" - }, - "eventStatus": { - "shape": "LineageEventProcessingStatus" - }, - "errorMessage": { - "shape": "LineageEventErrorMessage" - } - } - }, - "LineageNodeId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "LineageNodeIdentifier": { - "type": "string", - "max": 2086, - "min": 1 - }, - "LineageNodeReference": { - "type": "structure", - "members": { - "id": { - "shape": "LineageNodeId" - }, - "eventTimestamp": { - "shape": "Timestamp" - } - } - }, - "LineageNodeReferenceList": { - "type": "list", - "member": { - "shape": "LineageNodeReference" - }, - "max": 100, - "min": 0 - }, - "LineageNodeSummaries": { - "type": "list", - "member": { - "shape": "LineageNodeSummary" - } - }, - "LineageNodeSummary": { - "type": "structure", - "required": ["domainId", "id", "typeName"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "id": { - "shape": "LineageNodeId" - }, - "typeName": { - "shape": "String" - }, - "typeRevision": { - "shape": "Revision" - }, - "sourceIdentifier": { - "shape": "String" - }, - "eventTimestamp": { - "shape": "Timestamp" - } - } - }, - "LineageNodeTypeItem": { - "type": "structure", - "required": ["domainId", "revision", "formsOutput"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "revision": { - "shape": "Revision" - }, - "formsOutput": { - "shape": "FormsOutputMap" - } - } - }, - "LineageRunDetails": { - "type": "structure", - "members": { - "sqlQueryRunDetails": { - "shape": "LineageSqlQueryRunDetails" - } - }, - "internalonly": true - }, - "LineageSqlQueryRunDetails": { - "type": "structure", - "members": { - "queryStartTime": { - "shape": "Timestamp" - }, - "queryEndTime": { - "shape": "Timestamp" - }, - "totalQueriesProcessed": { - "shape": "Integer" - }, - "numQueriesFailed": { - "shape": "Integer" - }, - "errorMessages": { - "shape": "FailedQueryProcessingErrorMessages" - } - }, - "internalonly": true - }, - "LineageSyncInput": { - "type": "structure", - "required": ["enabled"], - "members": { - "timezone": { - "shape": "Timezone" - }, - "enabled": { - "shape": "Boolean" - }, - "schedule": { - "shape": "LineageSyncScheduleCronString" - } - } - }, - "LineageSyncOutput": { - "type": "structure", - "members": { - "lineageJobId": { - "shape": "String" - }, - "timezone": { - "shape": "Timezone" - }, - "enabled": { - "shape": "Boolean" - }, - "schedule": { - "shape": "LineageSyncScheduleCronString" - } - } - }, - "LineageSyncSchedule": { - "type": "structure", - "members": { - "schedule": { - "shape": "LineageSyncScheduleScheduleString" - } - } - }, - "LineageSyncScheduleCronString": { - "type": "string", - "max": 256, - "min": 1, - "pattern": ".*cron\\((\\b[0-5]?[0-9]\\b) (\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\).*" - }, - "LineageSyncScheduleScheduleString": { - "type": "string", - "pattern": "cron\\((\\b[0-5]?[0-9]\\b) (\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\)" - }, - "LinkedTypeAuthorizedPrincipals": { - "type": "list", - "member": { - "shape": "AuthorizedPrincipal" - }, - "max": 10, - "min": 1 - }, - "LinkedTypeError": { - "type": "structure", - "required": ["itemIdentifier", "code", "errorMessage"], - "members": { - "itemIdentifier": { - "shape": "String" - }, - "code": { - "shape": "Integer" - }, - "errorMessage": { - "shape": "String" - } - } - }, - "LinkedTypeItemIdentifiers": { - "type": "list", - "member": { - "shape": "String" - }, - "max": 10, - "min": 1 - }, - "LinkedTypeItemType": { - "type": "string", - "enum": ["SAGEMAKER_DOMAIN", "SAGEMAKER_USER_PROFILE", "CUSTOM"] - }, - "ListAccountEnvironmentsInput": { - "type": "structure", - "required": ["domainIdentifier", "awsAccountId"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "awsAccountId": { - "shape": "AwsAccountId", - "location": "uri", - "locationName": "awsAccountId" - }, - "sortBy": { - "shape": "SearchFieldEnvironment", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListAccountEnvironmentsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "EnvironmentSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListAccountPoolsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "AccountPoolName", - "location": "querystring", - "locationName": "name" - }, - "sortBy": { - "shape": "SortFieldAccountPool", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListAccountPoolsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "AccountPoolSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListAccountsInAccountPoolInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AccountPoolId", - "location": "uri", - "locationName": "identifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListAccountsInAccountPoolOutput": { - "type": "structure", - "members": { - "items": { - "shape": "AccountInfoList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListAssetFiltersInput": { - "type": "structure", - "required": ["domainIdentifier", "assetIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "assetIdentifier": { - "shape": "AssetId", - "location": "uri", - "locationName": "assetIdentifier" - }, - "status": { - "shape": "FilterStatus", - "location": "querystring", - "locationName": "status" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListAssetFiltersOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "AssetFilters" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListAssetRevisionsInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListAssetRevisionsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "AssetRevisions" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListAssetTypesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListAssetTypesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "AssetTypeList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListConnectionsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "ListConnectionsInputNextTokenString", - "location": "querystring", - "locationName": "nextToken" - }, - "sortBy": { - "shape": "SortFieldConnection", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "name": { - "shape": "ConnectionName", - "location": "querystring", - "locationName": "name" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "querystring", - "locationName": "environmentIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "projectIdentifier" - }, - "type": { - "shape": "ConnectionType", - "location": "querystring", - "locationName": "type" - }, - "scope": { - "shape": "ConnectionScope", - "internalonly": true, - "location": "querystring", - "locationName": "scope" - } - } - }, - "ListConnectionsInputNextTokenString": { - "type": "string", - "max": 8192, - "min": 1, - "pattern": "[A-Za-z0-9+/=]*" - }, - "ListConnectionsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "ConnectionSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListConsumerAccountsRequest": { - "type": "structure", - "required": ["resourceType"], - "members": { - "resourceType": { - "shape": "ResourceType" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListConsumerAccountsResponse": { - "type": "structure", - "members": { - "nextToken": { - "shape": "String" - }, - "accountIds": { - "shape": "AccountIdList" - } - } - }, - "ListDataProductRevisionsInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataProductId", - "location": "uri", - "locationName": "identifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListDataProductRevisionsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DataProductRevisions" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListDataSourceRunActivitiesInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataSourceRunId", - "location": "uri", - "locationName": "identifier" - }, - "status": { - "shape": "DataAssetActivityStatus", - "location": "querystring", - "locationName": "status" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListDataSourceRunActivitiesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DataSourceRunActivities" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListDataSourceRunsInput": { - "type": "structure", - "required": ["domainIdentifier", "dataSourceIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "dataSourceIdentifier": { - "shape": "DataSourceId", - "location": "uri", - "locationName": "dataSourceIdentifier" - }, - "status": { - "shape": "DataSourceRunStatus", - "location": "querystring", - "locationName": "status" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListDataSourceRunsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DataSourceRunSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListDataSourcesInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "projectIdentifier" - }, - "environmentIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "environmentIdentifier" - }, - "connectionIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "connectionIdentifier" - }, - "type": { - "shape": "String", - "location": "querystring", - "locationName": "type" - }, - "status": { - "shape": "DataSourceStatus", - "location": "querystring", - "locationName": "status" - }, - "name": { - "shape": "Name", - "location": "querystring", - "locationName": "name" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListDataSourcesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DataSourceSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListDesignationsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListDesignationsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "DesignationSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListDomainUnitPoliciesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "scopeFilter": { - "shape": "String", - "location": "querystring", - "locationName": "scopeFilter" - }, - "maxResults": { - "shape": "MaxResultsForListDomains", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListDomainUnitPoliciesOutput": { - "type": "structure", - "required": ["domainIdentifier", "items"], - "members": { - "domainIdentifier": { - "shape": "DomainId" - }, - "items": { - "shape": "DomainUnitPolicySummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListDomainUnitsForParentInput": { - "type": "structure", - "required": ["domainIdentifier", "parentDomainUnitIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "parentDomainUnitIdentifier": { - "shape": "DomainUnitId", - "location": "querystring", - "locationName": "parentDomainUnitIdentifier" - }, - "maxResults": { - "shape": "MaxResultsForListDomains", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListDomainUnitsForParentOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DomainUnitSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListDomainsInput": { - "type": "structure", - "members": { - "status": { - "shape": "DomainStatus", - "location": "querystring", - "locationName": "status" - }, - "maxResults": { - "shape": "MaxResultsForListDomains", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListDomainsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "DomainSummaries" - }, - "domains": { - "shape": "DomainSummaries", - "internalonly": true - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEntityOwnersInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "DataZoneEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "String", - "location": "uri", - "locationName": "entityIdentifier" - }, - "maxResults": { - "shape": "MaxResultsForListDomains", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListEntityOwnersOutput": { - "type": "structure", - "required": ["owners"], - "members": { - "owners": { - "shape": "EntityOwners" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEnvironmentActionSummaries": { - "type": "list", - "member": { - "shape": "EnvironmentActionSummary" - } - }, - "ListEnvironmentActionsInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListEnvironmentActionsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "ListEnvironmentActionSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEnvironmentBlueprintConfigurationSummariesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "awsAccountId": { - "shape": "AwsAccountId", - "location": "querystring", - "locationName": "awsAccountId" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId", - "location": "querystring", - "locationName": "environmentBlueprintIdentifier" - } - } - }, - "ListEnvironmentBlueprintConfigurationSummariesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "EnvironmentBlueprintConfigurationSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEnvironmentBlueprintConfigurationsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListEnvironmentBlueprintConfigurationsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "EnvironmentBlueprintConfigurations" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEnvironmentBlueprintsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "name": { - "shape": "EnvironmentBlueprintName", - "location": "querystring", - "locationName": "name" - }, - "managed": { - "shape": "Boolean", - "location": "querystring", - "locationName": "managed" - }, - "provider": { - "shape": "String", - "location": "querystring", - "locationName": "provider" - }, - "sortBy": { - "shape": "SearchFieldEnvironment", - "internalonly": true, - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "internalonly": true, - "location": "querystring", - "locationName": "sortOrder" - } - } - }, - "ListEnvironmentBlueprintsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "EnvironmentBlueprintSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEnvironmentProfilesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "awsAccountId": { - "shape": "AwsAccountId", - "location": "querystring", - "locationName": "awsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion", - "location": "querystring", - "locationName": "awsAccountRegion" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId", - "location": "querystring", - "locationName": "environmentBlueprintIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "projectIdentifier" - }, - "name": { - "shape": "EnvironmentProfileName", - "location": "querystring", - "locationName": "name" - }, - "sortBy": { - "shape": "SearchFieldEnvironment", - "internalonly": true, - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "internalonly": true, - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListEnvironmentProfilesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "EnvironmentProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEnvironmentRoleSummaries": { - "type": "list", - "member": { - "shape": "EnvironmentRoleSummary" - } - }, - "ListEnvironmentRolesInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListEnvironmentRolesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "ListEnvironmentRoleSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListEnvironmentsInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "awsAccountId": { - "shape": "AwsAccountId", - "location": "querystring", - "locationName": "awsAccountId" - }, - "status": { - "shape": "EnvironmentStatus", - "location": "querystring", - "locationName": "status" - }, - "awsAccountRegion": { - "shape": "AwsRegion", - "location": "querystring", - "locationName": "awsAccountRegion" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "projectIdentifier" - }, - "environmentProfileIdentifier": { - "shape": "EnvironmentProfileId", - "location": "querystring", - "locationName": "environmentProfileIdentifier" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId", - "location": "querystring", - "locationName": "environmentBlueprintIdentifier" - }, - "provider": { - "shape": "String", - "location": "querystring", - "locationName": "provider" - }, - "name": { - "shape": "String", - "location": "querystring", - "locationName": "name" - }, - "sortBy": { - "shape": "SearchFieldEnvironment", - "internalonly": true, - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "internalonly": true, - "location": "querystring", - "locationName": "sortOrder" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListEnvironmentsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "EnvironmentSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListFormTypesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListFormTypesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "FormTypeDataList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListGlossariesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListGlossariesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "GlossaryItems" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListGlossaryTermsInput": { - "type": "structure", - "required": ["domainIdentifier", "glossaryIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "glossaryIdentifier": { - "shape": "GlossaryTermId", - "location": "uri", - "locationName": "glossaryIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListGlossaryTermsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "GlossaryTermItems" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListGroupsForUserInput": { - "type": "structure", - "required": ["domainId", "userId"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "userId": { - "shape": "UserProfileId", - "location": "uri", - "locationName": "userId" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListGroupsForUserOutput": { - "type": "structure", - "members": { - "groupProfiles": { - "shape": "GroupProfiles" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListJobRunsInput": { - "type": "structure", - "required": ["domainIdentifier", "jobIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "jobIdentifier": { - "shape": "ListJobRunsInputJobIdentifierString", - "location": "uri", - "locationName": "jobIdentifier" - }, - "status": { - "shape": "JobRunStatus", - "location": "querystring", - "locationName": "status" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - }, - "internalonly": true - }, - "ListJobRunsInputJobIdentifierString": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "ListJobRunsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "JobRunSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - }, - "internalonly": true - }, - "ListLineageEventsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "timestampAfter": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "timestampAfter" - }, - "timestampBefore": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "timestampBefore" - }, - "processingStatus": { - "shape": "LineageEventProcessingStatus", - "location": "querystring", - "locationName": "processingStatus" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListLineageEventsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "LineageEventSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListLineageNodeHistoryInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "identifier": { - "shape": "LineageNodeIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "direction": { - "shape": "EdgeDirection", - "location": "querystring", - "locationName": "direction" - }, - "eventTimestampGTE": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "timestampGTE" - }, - "eventTimestampLTE": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "timestampLTE" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - } - } - }, - "ListLineageNodeHistoryOutput": { - "type": "structure", - "members": { - "nodes": { - "shape": "LineageNodeSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListLinkedTypeItem": { - "type": "structure", - "required": ["itemIdentifier", "itemType"], - "members": { - "itemIdentifier": { - "shape": "String" - }, - "itemType": { - "shape": "LinkedTypeItemType" - }, - "name": { - "shape": "String" - }, - "arn": { - "shape": "String" - }, - "configuration": { - "shape": "ConfigurationMap" - }, - "authorizedPrincipals": { - "shape": "LinkedTypeAuthorizedPrincipals" - }, - "connectedEntities": { - "shape": "ConnectedEntities" - }, - "projectIdentifier": { - "shape": "ProjectId" - }, - "environmentIdentifier": { - "shape": "EnvironmentId" - } - } - }, - "ListLinkedTypesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "projectIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "querystring", - "locationName": "environmentIdentifier" - }, - "principalIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "principalIdentifier" - }, - "itemIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "itemIdentifier" - }, - "itemType": { - "shape": "LinkedTypeItemType", - "location": "querystring", - "locationName": "itemType" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "ListLinkedTypesInputMaxResultsInteger", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListLinkedTypesInputMaxResultsInteger": { - "type": "integer", - "box": true, - "max": 50, - "min": 1 - }, - "ListLinkedTypesItems": { - "type": "list", - "member": { - "shape": "ListLinkedTypeItem" - } - }, - "ListLinkedTypesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "ListLinkedTypesItems" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListMetadataGenerationRunsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "status": { - "shape": "MetadataGenerationRunStatus", - "location": "querystring", - "locationName": "status" - }, - "type": { - "shape": "MetadataGenerationRunType", - "location": "querystring", - "locationName": "type" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "targetIdentifier": { - "shape": "EntityId", - "internalonly": true, - "location": "querystring", - "locationName": "targetIdentifier" - } - } - }, - "ListMetadataGenerationRunsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "MetadataGenerationRuns" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListNotificationsInput": { - "type": "structure", - "required": ["domainIdentifier", "type"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "type": { - "shape": "NotificationType", - "location": "querystring", - "locationName": "type" - }, - "afterTimestamp": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "afterTimestamp" - }, - "beforeTimestamp": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "beforeTimestamp" - }, - "subjects": { - "shape": "NotificationSubjects", - "location": "querystring", - "locationName": "subjects" - }, - "taskStatus": { - "shape": "TaskStatus", - "location": "querystring", - "locationName": "taskStatus" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListNotificationsOutput": { - "type": "structure", - "members": { - "notifications": { - "shape": "NotificationsList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListPartnerIntegrationsInput": { - "type": "structure", - "members": { - "status": { - "shape": "PartnerIntegrationStatus", - "location": "querystring", - "locationName": "status" - }, - "partnerId": { - "shape": "PartnerId", - "location": "querystring", - "locationName": "partnerId" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - }, - "internalonly": true - }, - "ListPartnerIntegrationsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "PartnerIntegrationSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - }, - "internalonly": true - }, - "ListPolicyGrantsInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "policyType"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "TargetEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "String", - "location": "uri", - "locationName": "entityIdentifier" - }, - "policyType": { - "shape": "ManagedPolicyType", - "location": "querystring", - "locationName": "policyType" - }, - "maxResults": { - "shape": "MaxResultsForListDomains", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListPolicyGrantsOutput": { - "type": "structure", - "required": ["grantList"], - "members": { - "grantList": { - "shape": "PolicyGrantList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListProjectMembershipRequestsInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "projectIdentifier" - }, - "sortBy": { - "shape": "SortFieldProjectMembershipRequest", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListProjectMembershipRequestsOutput": { - "type": "structure", - "required": ["requests"], - "members": { - "requests": { - "shape": "MembershipRequests" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListProjectMembershipsInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "projectIdentifier" - }, - "sortBy": { - "shape": "SortFieldProject", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListProjectMembershipsOutput": { - "type": "structure", - "required": ["members"], - "members": { - "members": { - "shape": "ProjectMembers" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListProjectProfilesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "name": { - "shape": "ProjectProfileName", - "location": "querystring", - "locationName": "name" - }, - "sortBy": { - "shape": "SortFieldProject", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListProjectProfilesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "ProjectProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListProjectsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "userIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "userIdentifier" - }, - "groupIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "groupIdentifier" - }, - "projectCreator": { - "shape": "String", - "location": "querystring", - "locationName": "projectCreator" - }, - "projectCategory": { - "shape": "String", - "internalonly": true, - "location": "querystring", - "locationName": "projectCategory" - }, - "name": { - "shape": "ProjectName", - "location": "querystring", - "locationName": "name" - }, - "sortBy": { - "shape": "SortFieldProject", - "internalonly": true, - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "internalonly": true, - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListProjectsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "ProjectSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListResourcesSupportPolicyRequest": { - "type": "structure", - "members": { - "resourceType": { - "shape": "ResourceType" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "maxResults": { - "shape": "MaxResults" - } - } - }, - "ListResourcesSupportPolicyResponse": { - "type": "structure", - "required": ["resources"], - "members": { - "resources": { - "shape": "RAMResourceList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListRulesInput": { - "type": "structure", - "required": ["domainIdentifier", "targetType", "targetIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "targetType": { - "shape": "RuleTargetType", - "location": "uri", - "locationName": "targetType" - }, - "targetIdentifier": { - "shape": "String", - "location": "uri", - "locationName": "targetIdentifier" - }, - "ruleType": { - "shape": "RuleType", - "location": "querystring", - "locationName": "ruleType" - }, - "action": { - "shape": "RuleAction", - "location": "querystring", - "locationName": "ruleAction" - }, - "projectIds": { - "shape": "ProjectIds", - "location": "querystring", - "locationName": "projectIds" - }, - "assetTypes": { - "shape": "AssetTypeIdentifiers", - "location": "querystring", - "locationName": "assetTypes" - }, - "dataProduct": { - "shape": "Boolean", - "location": "querystring", - "locationName": "dataProduct" - }, - "includeCascaded": { - "shape": "Boolean", - "location": "querystring", - "locationName": "includeCascaded" - }, - "maxResults": { - "shape": "ListRulesInputMaxResultsInteger", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListRulesInputMaxResultsInteger": { - "type": "integer", - "box": true, - "max": 50, - "min": 25 - }, - "ListRulesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "RuleSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListServiceLinksInput": { - "type": "structure", - "required": ["domainIdentifier", "type"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "domainUnitId": { - "shape": "DomainUnitId", - "location": "querystring", - "locationName": "domainUnitId" - }, - "owningProjectId": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "owningProjectId" - }, - "type": { - "shape": "ServiceLinkType", - "location": "querystring", - "locationName": "type" - }, - "status": { - "shape": "ServiceLinkStatus", - "location": "querystring", - "locationName": "status" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - }, - "internalonly": true - }, - "ListServiceLinksOutput": { - "type": "structure", - "required": ["items"], - "members": { - "nextToken": { - "shape": "PaginationToken" - }, - "items": { - "shape": "ServiceLinkSummaries" - } - }, - "internalonly": true - }, - "ListSharedResourcesRequest": { - "type": "structure", - "required": ["consumerAccountId"], - "members": { - "consumerAccountId": { - "shape": "AwsAccountId" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "maxResults": { - "shape": "MaxResults" - }, - "resourceType": { - "shape": "ResourceType" - } - } - }, - "ListSharedResourcesResponse": { - "type": "structure", - "required": ["versionedResources"], - "members": { - "versionedResources": { - "shape": "RAMVersionedSharedResourceList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListSubscriptionGrantsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentId": { - "shape": "EnvironmentId", - "location": "querystring", - "locationName": "environmentId" - }, - "subscriptionTargetId": { - "shape": "SubscriptionTargetId", - "location": "querystring", - "locationName": "subscriptionTargetId" - }, - "subscribedListingId": { - "shape": "ListingId", - "location": "querystring", - "locationName": "subscribedListingId" - }, - "subscriptionId": { - "shape": "SubscriptionId", - "location": "querystring", - "locationName": "subscriptionId" - }, - "owningProjectId": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "owningProjectId" - }, - "owningUserId": { - "shape": "UserProfileId", - "location": "querystring", - "locationName": "owningUserId" - }, - "owningGroupId": { - "shape": "GroupProfileId", - "location": "querystring", - "locationName": "owningGroupId" - }, - "sortBy": { - "shape": "SortKey", - "deprecated": true, - "deprecatedMessage": "Results are always sorted by updatedAt", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListSubscriptionGrantsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "SubscriptionGrants" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListSubscriptionRequestsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "status": { - "shape": "SubscriptionRequestStatus", - "location": "querystring", - "locationName": "status" - }, - "subscribedListingId": { - "shape": "ListingId", - "location": "querystring", - "locationName": "subscribedListingId" - }, - "owningProjectId": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "owningProjectId" - }, - "owningUserId": { - "shape": "UserProfileId", - "location": "querystring", - "locationName": "owningUserId" - }, - "owningGroupId": { - "shape": "GroupProfileId", - "location": "querystring", - "locationName": "owningGroupId" - }, - "approverProjectId": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "approverProjectId" - }, - "sortBy": { - "shape": "SortKey", - "deprecated": true, - "deprecatedMessage": "Results are always sorted by updatedAt", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListSubscriptionRequestsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "SubscriptionRequests" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListSubscriptionTargetsInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "sortBy": { - "shape": "SortKey", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListSubscriptionTargetsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "SubscriptionTargets" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListSubscriptionsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "subscriptionRequestIdentifier": { - "shape": "SubscriptionRequestId", - "location": "querystring", - "locationName": "subscriptionRequestIdentifier" - }, - "status": { - "shape": "SubscriptionStatus", - "location": "querystring", - "locationName": "status" - }, - "subscribedListingId": { - "shape": "ListingId", - "location": "querystring", - "locationName": "subscribedListingId" - }, - "owningProjectId": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "owningProjectId" - }, - "owningUserId": { - "shape": "UserProfileId", - "location": "querystring", - "locationName": "owningUserId" - }, - "owningGroupId": { - "shape": "GroupProfileId", - "location": "querystring", - "locationName": "owningGroupId" - }, - "approverProjectId": { - "shape": "ProjectId", - "location": "querystring", - "locationName": "approverProjectId" - }, - "sortBy": { - "shape": "SortKey", - "deprecated": true, - "deprecatedMessage": "Results are always sorted by updatedAt", - "location": "querystring", - "locationName": "sortBy" - }, - "sortOrder": { - "shape": "SortOrder", - "location": "querystring", - "locationName": "sortOrder" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "ListSubscriptionsOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "Subscriptions" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListTagsForResourceRequest": { - "type": "structure", - "required": ["resourceArn"], - "members": { - "resourceArn": { - "shape": "String", - "location": "uri", - "locationName": "resourceArn" - } - } - }, - "ListTagsForResourceResponse": { - "type": "structure", - "members": { - "tags": { - "shape": "Tags" - } - } - }, - "ListTimeSeriesDataPointsInput": { - "type": "structure", - "required": ["domainIdentifier", "entityIdentifier", "entityType", "formName"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityIdentifier": { - "shape": "EntityIdentifier", - "location": "uri", - "locationName": "entityIdentifier" - }, - "entityType": { - "shape": "TimeSeriesEntityType", - "location": "uri", - "locationName": "entityType" - }, - "formName": { - "shape": "TimeSeriesFormName", - "location": "querystring", - "locationName": "formName" - }, - "startedAt": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "startedAt" - }, - "endedAt": { - "shape": "Timestamp", - "location": "querystring", - "locationName": "endedAt" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - } - } - }, - "ListTimeSeriesDataPointsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "TimeSeriesDataPointSummaryFormOutputList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListWarehouseMetadataInput": { - "type": "structure", - "required": ["domainIdentifier", "awsAccountId", "environmentProfileIdentifier", "regionName", "target"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "awsAccountId": { - "shape": "AwsAccountId", - "location": "uri", - "locationName": "awsAccountId" - }, - "environmentProfileIdentifier": { - "shape": "String", - "location": "querystring", - "locationName": "environmentProfileIdentifier" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "regionName": { - "shape": "AwsRegion", - "location": "querystring", - "locationName": "region" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "target": { - "shape": "WarehouseMetadataListingTarget", - "location": "querystring", - "locationName": "target" - } - } - }, - "ListWarehouseMetadataOutput": { - "type": "structure", - "required": ["metadata"], - "members": { - "metadata": { - "shape": "MetadataList" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "ListingId": { - "type": "string", - "pattern": "([a-zA-Z0-9_-]{1,16}/)?[a-zA-Z0-9_-]{1,36}" - }, - "ListingItem": { - "type": "structure", - "members": { - "assetListing": { - "shape": "AssetListing" - }, - "dataProductListing": { - "shape": "DataProductListing" - } - }, - "union": true - }, - "ListingName": { - "type": "string", - "max": 64, - "min": 1 - }, - "ListingRevision": { - "type": "structure", - "required": ["id", "revision"], - "members": { - "id": { - "shape": "ListingId" - }, - "revision": { - "shape": "Revision" - } - } - }, - "ListingRevisionInput": { - "type": "structure", - "required": ["identifier", "revision"], - "members": { - "identifier": { - "shape": "ListingId" - }, - "revision": { - "shape": "Revision" - } - } - }, - "ListingStatus": { - "type": "string", - "enum": ["CREATING", "ACTIVE", "INACTIVE"] - }, - "ListingSummaries": { - "type": "list", - "member": { - "shape": "ListingSummary" - } - }, - "ListingSummary": { - "type": "structure", - "members": { - "listingId": { - "shape": "ListingId" - }, - "listingRevision": { - "shape": "Revision" - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - } - } - }, - "ListingSummaryItem": { - "type": "structure", - "members": { - "listingId": { - "shape": "ListingId" - }, - "listingRevision": { - "shape": "Revision" - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - } - } - }, - "ListingSummaryItems": { - "type": "list", - "member": { - "shape": "ListingSummaryItem" - } - }, - "LongDescription": { - "type": "string", - "max": 4096, - "min": 0, - "sensitive": true - }, - "MalformedResourcePolicyDocumentException": { - "type": "structure", - "members": { - "message": { - "shape": "String" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "ManagedEndpointCredentials": { - "type": "structure", - "members": { - "id": { - "shape": "ManagedEndpointCredentialsIdString" - }, - "token": { - "shape": "String" - } - }, - "sensitive": true - }, - "ManagedEndpointCredentialsIdString": { - "type": "string", - "max": 64, - "min": 0 - }, - "ManagedPolicyType": { - "type": "string", - "enum": [ - "CreateDomainUnit", - "OverrideDomainUnitOwners", - "AddToProjectMemberPool", - "OverrideProjectOwners", - "CreateGlossary", - "CreateFormType", - "CreateAssetType", - "CreateProject", - "CreateEnvironmentProfile", - "DelegateCreateEnvironmentProfile", - "CreateEnvironment", - "CREATE_DOMAIN_UNIT", - "OVERRIDE_DOMAIN_UNIT_OWNERS", - "ADD_TO_PROJECT_MEMBER_POOL", - "OVERRIDE_PROJECT_OWNERS", - "CREATE_GLOSSARY", - "CREATE_FORM_TYPE", - "CREATE_ASSET_TYPE", - "CREATE_PROJECT", - "CREATE_ENVIRONMENT_PROFILE", - "DELEGATE_CREATE_ENVIRONMENT_PROFILE", - "CREATE_ENVIRONMENT", - "CREATE_ENVIRONMENT_FROM_BLUEPRINT", - "CREATE_PROJECT_FROM_PROJECT_PROFILE", - "USE_ASSET_TYPE", - "ATTACH_GOVERNED_GLOSSARY_TERMS" - ] - }, - "ManualProperties": { - "type": "structure", - "members": { - "name": { - "shape": "String" - } - } - }, - "MatchCriteria": { - "type": "list", - "member": { - "shape": "String" - }, - "max": 10, - "min": 0 - }, - "MatchOffset": { - "type": "structure", - "members": { - "startOffset": { - "shape": "Integer" - }, - "endOffset": { - "shape": "Integer" - } - } - }, - "MatchOffsets": { - "type": "list", - "member": { - "shape": "MatchOffset" - } - }, - "MatchRationale": { - "type": "list", - "member": { - "shape": "MatchRationaleItem" - } - }, - "MatchRationaleItem": { - "type": "structure", - "members": { - "textMatches": { - "shape": "TextMatches" - } - }, - "union": true - }, - "MaxListResults": { - "type": "integer", - "box": true, - "max": 100, - "min": 1 - }, - "MaxResults": { - "type": "integer", - "box": true, - "max": 50, - "min": 1 - }, - "MaxResultsForListDomains": { - "type": "integer", - "box": true, - "max": 25, - "min": 1 - }, - "Member": { - "type": "structure", - "members": { - "userIdentifier": { - "shape": "String" - }, - "groupIdentifier": { - "shape": "String" - } - }, - "union": true - }, - "MemberDetails": { - "type": "structure", - "members": { - "user": { - "shape": "UserDetails" - }, - "group": { - "shape": "GroupDetails" - } - }, - "union": true - }, - "MemberType": { - "type": "string", - "enum": ["IAM_ROLE", "IAM_USER", "SSO_USER", "SSO_GROUP"], - "internalonly": true - }, - "MembershipRequests": { - "type": "list", - "member": { - "shape": "ProjectMembershipRequestOutput" - } - }, - "Message": { - "type": "string", - "max": 16384, - "min": 0, - "sensitive": true - }, - "MessageParametersMap": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - }, - "MetadataFormEnforcementDetail": { - "type": "structure", - "members": { - "requiredMetadataForms": { - "shape": "RequiredMetadataFormList" - } - } - }, - "MetadataFormInputs": { - "type": "list", - "member": { - "shape": "FormInput" - } - }, - "MetadataFormReference": { - "type": "structure", - "required": ["typeIdentifier", "typeRevision"], - "members": { - "typeIdentifier": { - "shape": "FormTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - } - } - }, - "MetadataFormSummary": { - "type": "structure", - "required": ["typeName", "typeRevision"], - "members": { - "formName": { - "shape": "FormName" - }, - "typeName": { - "shape": "FormTypeName" - }, - "typeRevision": { - "shape": "Revision" - } - } - }, - "MetadataForms": { - "type": "list", - "member": { - "shape": "FormOutput" - } - }, - "MetadataFormsSummary": { - "type": "list", - "member": { - "shape": "MetadataFormSummary" - } - }, - "MetadataGenerationRunIdentifier": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "MetadataGenerationRunItem": { - "type": "structure", - "required": ["domainId", "id", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "MetadataGenerationRunIdentifier" - }, - "target": { - "shape": "MetadataGenerationRunTarget" - }, - "status": { - "shape": "MetadataGenerationRunStatus" - }, - "type": { - "shape": "MetadataGenerationRunType" - }, - "types": { - "shape": "MetadataGenerationRunTypes", - "internalonly": true - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "owningProjectId": { - "shape": "ProjectId" - } - } - }, - "MetadataGenerationRunStatus": { - "type": "string", - "enum": ["SUBMITTED", "IN_PROGRESS", "CANCELED", "SUCCEEDED", "FAILED", "PARTIALLY_SUCCEEDED"] - }, - "MetadataGenerationRunTarget": { - "type": "structure", - "required": ["type", "identifier"], - "members": { - "type": { - "shape": "MetadataGenerationTargetType" - }, - "identifier": { - "shape": "String" - }, - "revision": { - "shape": "Revision" - } - } - }, - "MetadataGenerationRunType": { - "type": "string", - "enum": ["BUSINESS_DESCRIPTIONS", "BUSINESS_NAMES", "BUSINESS_GLOSSARY_ASSOCIATIONS"] - }, - "MetadataGenerationRunTypeStat": { - "type": "structure", - "required": ["type", "status"], - "members": { - "type": { - "shape": "MetadataGenerationRunType" - }, - "status": { - "shape": "MetadataGenerationRunStatus" - }, - "errorMessage": { - "shape": "String" - } - }, - "internalonly": true - }, - "MetadataGenerationRunTypeStats": { - "type": "list", - "member": { - "shape": "MetadataGenerationRunTypeStat" - }, - "internalonly": true - }, - "MetadataGenerationRunTypes": { - "type": "list", - "member": { - "shape": "MetadataGenerationRunType" - }, - "max": 2, - "min": 1 - }, - "MetadataGenerationRuns": { - "type": "list", - "member": { - "shape": "MetadataGenerationRunItem" - } - }, - "MetadataGenerationTargetType": { - "type": "string", - "enum": ["ASSET"] - }, - "MetadataList": { - "type": "list", - "member": { - "shape": "MetadataOutput" - } - }, - "MetadataMap": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - }, - "MetadataOutput": { - "type": "structure", - "required": ["secretArn", "target"], - "members": { - "secretArn": { - "shape": "String" - }, - "target": { - "shape": "String" - }, - "database": { - "shape": "String" - } - } - }, - "MlflowPropertiesInput": { - "type": "structure", - "members": { - "trackingServerName": { - "shape": "String" - }, - "trackingServerArn": { - "shape": "String" - } - } - }, - "MlflowPropertiesOutput": { - "type": "structure", - "members": { - "trackingServerName": { - "shape": "String" - }, - "trackingServerArn": { - "shape": "String" - } - } - }, - "ModalitiesType": { - "type": "list", - "member": { - "shape": "ModalityType" - }, - "min": 1 - }, - "ModalityType": { - "type": "string", - "enum": ["TEXT", "IMAGE", "EMBEDDING", "VIDEO"] - }, - "Model": { - "type": "structure", - "members": { - "smithy": { - "shape": "Smithy" - } - }, - "sensitive": true, - "union": true - }, - "ModelFormat": { - "type": "string", - "enum": ["SMITHY", "SMITHY_JSON"] - }, - "MskPropertiesInput": { - "type": "structure", - "members": {} - }, - "MskPropertiesOutput": { - "type": "structure", - "members": {} - }, - "MskRunConfigurationInput": { - "type": "structure", - "required": ["clusters"], - "members": { - "clusters": { - "shape": "Clusters", - "documentation": "

A list of MSK cluster names.

", - "internalonly": true - } - } - }, - "MskRunConfigurationOutput": { - "type": "structure", - "required": ["clusters"], - "members": { - "accountId": { - "shape": "MskRunConfigurationOutputAccountIdString" - }, - "region": { - "shape": "MskRunConfigurationOutputRegionString" - }, - "dataAccessRole": { - "shape": "MskRunConfigurationOutputDataAccessRoleString" - }, - "clusters": { - "shape": "Clusters", - "internalonly": true - } - } - }, - "MskRunConfigurationOutputAccountIdString": { - "type": "string", - "max": 12, - "min": 12, - "pattern": "\\d{12}" - }, - "MskRunConfigurationOutputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "MskRunConfigurationOutputRegionString": { - "type": "string", - "max": 16, - "min": 4, - "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" - }, - "Name": { - "type": "string", - "max": 256, - "min": 1, - "sensitive": true - }, - "NameIdentifier": { - "type": "structure", - "members": { - "name": { - "shape": "String" - }, - "namespace": { - "shape": "String" - } - } - }, - "NameIdentifiers": { - "type": "list", - "member": { - "shape": "NameIdentifier" - } - }, - "NgramReranker": { - "type": "structure", - "members": {} - }, - "NotEqualToExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "NotInExpression": { - "type": "structure", - "required": ["columnName", "values"], - "members": { - "columnName": { - "shape": "String" - }, - "values": { - "shape": "StringList" - } - } - }, - "NotLikeExpression": { - "type": "structure", - "required": ["columnName", "value"], - "members": { - "columnName": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "NotificationOutput": { - "type": "structure", - "required": [ - "identifier", - "domainIdentifier", - "type", - "topic", - "title", - "message", - "actionLink", - "creationTimestamp", - "lastUpdatedTimestamp" - ], - "members": { - "identifier": { - "shape": "TaskId" - }, - "domainIdentifier": { - "shape": "DomainId" - }, - "type": { - "shape": "NotificationType" - }, - "topic": { - "shape": "Topic" - }, - "title": { - "shape": "Title" - }, - "message": { - "shape": "Message" - }, - "status": { - "shape": "TaskStatus" - }, - "actionLink": { - "shape": "ActionLink" - }, - "creationTimestamp": { - "shape": "Timestamp" - }, - "lastUpdatedTimestamp": { - "shape": "Timestamp" - }, - "metadata": { - "shape": "MetadataMap" - }, - "messageKey": { - "shape": "String" - }, - "messageParameters": { - "shape": "MessageParametersMap" - } - } - }, - "NotificationResource": { - "type": "structure", - "required": ["type", "id"], - "members": { - "type": { - "shape": "NotificationResourceType" - }, - "id": { - "shape": "String" - }, - "name": { - "shape": "String" - } - } - }, - "NotificationResourceType": { - "type": "string", - "enum": ["PROJECT", "DOMAIN_UNIT"] - }, - "NotificationRole": { - "type": "string", - "enum": [ - "PROJECT_OWNER", - "PROJECT_CONTRIBUTOR", - "PROJECT_VIEWER", - "DOMAIN_OWNER", - "PROJECT_SUBSCRIBER", - "DOMAIN_UNIT_OWNER" - ] - }, - "NotificationSubjects": { - "type": "list", - "member": { - "shape": "String" - } - }, - "NotificationType": { - "type": "string", - "enum": ["TASK", "EVENT"] - }, - "NotificationsList": { - "type": "list", - "member": { - "shape": "NotificationOutput" - } - }, - "OAuth2": { - "type": "structure", - "members": { - "clientId": { - "shape": "String" - }, - "clientSecret": { - "shape": "String" - } - }, - "sensitive": true - }, - "OAuth2ClientApplication": { - "type": "structure", - "members": { - "userManagedClientApplicationClientId": { - "shape": "OAuth2ClientApplicationUserManagedClientApplicationClientIdString" - }, - "aWSManagedClientApplicationReference": { - "shape": "OAuth2ClientApplicationAWSManagedClientApplicationReferenceString" - } - } - }, - "OAuth2ClientApplicationAWSManagedClientApplicationReferenceString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "\\S+" - }, - "OAuth2ClientApplicationUserManagedClientApplicationClientIdString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "\\S+" - }, - "OAuth2Credentials": { - "type": "structure", - "required": ["clientId", "clientSecret"], - "members": { - "clientId": { - "shape": "String" - }, - "clientSecret": { - "shape": "String" - } - }, - "internalonly": true, - "sensitive": true - }, - "OAuth2GrantType": { - "type": "string", - "enum": ["AUTHORIZATION_CODE", "CLIENT_CREDENTIALS", "JWT_BEARER"] - }, - "OAuth2Properties": { - "type": "structure", - "members": { - "oAuth2GrantType": { - "shape": "OAuth2GrantType" - }, - "oAuth2ClientApplication": { - "shape": "OAuth2ClientApplication" - }, - "tokenUrl": { - "shape": "OAuth2PropertiesTokenUrlString" - }, - "tokenUrlParametersMap": { - "shape": "TokenUrlParametersMap" - }, - "authorizationCodeProperties": { - "shape": "AuthorizationCodeProperties" - }, - "oAuth2Credentials": { - "shape": "GlueOAuth2Credentials" - } - } - }, - "OAuth2PropertiesTokenUrlString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "(https?)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]" - }, - "OpenLineageRunEventSummary": { - "type": "structure", - "members": { - "eventType": { - "shape": "OpenLineageRunState" - }, - "runId": { - "shape": "String" - }, - "job": { - "shape": "NameIdentifier" - }, - "inputs": { - "shape": "NameIdentifiers" - }, - "outputs": { - "shape": "NameIdentifiers" - } - } - }, - "OpenLineageRunState": { - "type": "string", - "enum": ["START", "RUNNING", "COMPLETE", "ABORT", "FAIL", "OTHER"] - }, - "OverallDeploymentStatus": { - "type": "string", - "enum": ["PENDING_DEPLOYMENT", "IN_PROGRESS", "SUCCESSFUL", "FAILED_VALIDATION", "FAILED_DEPLOYMENT"] - }, - "OverrideDomainUnitOwnersPolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "OverrideProjectOwnersPolicyGrantDetail": { - "type": "structure", - "members": { - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "OwnerGroupProperties": { - "type": "structure", - "required": ["groupIdentifier"], - "members": { - "groupIdentifier": { - "shape": "GroupIdentifier" - } - } - }, - "OwnerGroupPropertiesOutput": { - "type": "structure", - "members": { - "groupId": { - "shape": "String" - } - } - }, - "OwnerProperties": { - "type": "structure", - "members": { - "user": { - "shape": "OwnerUserProperties" - }, - "group": { - "shape": "OwnerGroupProperties" - } - }, - "union": true - }, - "OwnerPropertiesOutput": { - "type": "structure", - "members": { - "user": { - "shape": "OwnerUserPropertiesOutput" - }, - "group": { - "shape": "OwnerGroupPropertiesOutput" - } - }, - "union": true - }, - "OwnerUserProperties": { - "type": "structure", - "required": ["userIdentifier"], - "members": { - "userIdentifier": { - "shape": "UserIdentifier" - } - } - }, - "OwnerUserPropertiesOutput": { - "type": "structure", - "members": { - "userId": { - "shape": "String" - } - } - }, - "PaginationToken": { - "type": "string", - "max": 8192, - "min": 1 - }, - "ParameterStorePath": { - "type": "string", - "max": 2048, - "min": 1 - }, - "PartnerId": { - "type": "string", - "enum": ["SAP"], - "internalonly": true - }, - "PartnerIntegrationId": { - "type": "string", - "internalonly": true, - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "PartnerIntegrationPropertiesInput": { - "type": "structure", - "members": { - "sapProperties": { - "shape": "SAPPropertiesInput" - } - }, - "internalonly": true, - "union": true - }, - "PartnerIntegrationPropertiesOutput": { - "type": "structure", - "members": { - "sapProperties": { - "shape": "SAPPropertiesOutput" - } - }, - "internalonly": true, - "union": true - }, - "PartnerIntegrationPropertiesPatch": { - "type": "structure", - "members": { - "sapProperties": { - "shape": "SAPPropertiesInput" - } - }, - "internalonly": true, - "union": true - }, - "PartnerIntegrationStatus": { - "type": "string", - "enum": ["CREATING", "UPDATING", "DELETING", "ACTIVE"], - "internalonly": true - }, - "PartnerIntegrationSummaries": { - "type": "list", - "member": { - "shape": "PartnerIntegrationSummary" - }, - "internalonly": true - }, - "PartnerIntegrationSummary": { - "type": "structure", - "required": ["id", "status", "partnerId", "name"], - "members": { - "id": { - "shape": "PartnerIntegrationId" - }, - "createdAt": { - "shape": "CreatedAtTimestamp" - }, - "updatedAt": { - "shape": "UpdatedAtTimestamp" - }, - "status": { - "shape": "PartnerIntegrationStatus" - }, - "partnerId": { - "shape": "PartnerId" - }, - "name": { - "shape": "Name" - } - }, - "internalonly": true - }, - "Password": { - "type": "string", - "max": 64, - "min": 0, - "pattern": "[\\S]*", - "sensitive": true - }, - "Permissions": { - "type": "structure", - "members": { - "s3": { - "shape": "S3Permissions" - } - }, - "union": true - }, - "PhysicalConnectionRequirements": { - "type": "structure", - "members": { - "subnetId": { - "shape": "SubnetId" - }, - "subnetIdList": { - "shape": "SubnetIdList" - }, - "securityGroupIdList": { - "shape": "SecurityGroupIdList" - }, - "availabilityZone": { - "shape": "PhysicalConnectionRequirementsAvailabilityZoneString" - } - } - }, - "PhysicalConnectionRequirementsAvailabilityZoneString": { - "type": "string", - "max": 255, - "min": 1 - }, - "PhysicalEndpoint": { - "type": "structure", - "members": { - "awsLocation": { - "shape": "AwsLocation" - }, - "glueConnectionName": { - "shape": "String" - }, - "glueConnection": { - "shape": "GlueConnection" - }, - "enableTrustedIdentityPropagation": { - "shape": "Boolean", - "internalonly": true - }, - "host": { - "shape": "String" - }, - "port": { - "shape": "Integer" - }, - "protocol": { - "shape": "Protocol" - }, - "stage": { - "shape": "String" - } - } - }, - "PhysicalEndpoints": { - "type": "list", - "member": { - "shape": "PhysicalEndpoint" - } - }, - "PolicyArn": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::(aws|\\d{12}):policy/[\\w+=,.@-]*" - }, - "PolicyContent": { - "type": "structure", - "members": { - "authorizationPolicy": { - "shape": "AuthorizationPolicy" - } - }, - "union": true - }, - "PolicyFilter": { - "type": "structure", - "members": { - "attribute": { - "shape": "String" - }, - "value": { - "shape": "String" - } - } - }, - "PolicyFilterClause": { - "type": "structure", - "members": { - "filter": { - "shape": "PolicyFilter" - }, - "and": { - "shape": "PolicyFilterList" - }, - "or": { - "shape": "PolicyFilterList" - } - }, - "union": true - }, - "PolicyFilterList": { - "type": "list", - "member": { - "shape": "PolicyFilterClause" - } - }, - "PolicyGrantDetail": { - "type": "structure", - "members": { - "createDomainUnit": { - "shape": "CreateDomainUnitPolicyGrantDetail" - }, - "overrideDomainUnitOwners": { - "shape": "OverrideDomainUnitOwnersPolicyGrantDetail" - }, - "addToProjectMemberPool": { - "shape": "AddToProjectMemberPoolPolicyGrantDetail" - }, - "overrideProjectOwners": { - "shape": "OverrideProjectOwnersPolicyGrantDetail" - }, - "createGlossary": { - "shape": "CreateGlossaryPolicyGrantDetail" - }, - "createFormType": { - "shape": "CreateFormTypePolicyGrantDetail" - }, - "createAssetType": { - "shape": "CreateAssetTypePolicyGrantDetail" - }, - "createProject": { - "shape": "CreateProjectPolicyGrantDetail" - }, - "createEnvironmentProfile": { - "shape": "CreateEnvironmentProfilePolicyGrantDetail" - }, - "delegateCreateEnvironmentProfile": { - "shape": "Unit" - }, - "createEnvironment": { - "shape": "Unit" - }, - "createEnvironmentFromBlueprint": { - "shape": "Unit" - }, - "createProjectFromProjectProfile": { - "shape": "CreateProjectFromProjectProfilePolicyGrantDetail" - }, - "useAssetType": { - "shape": "UseAssetTypePolicyGrantDetail" - }, - "attachGovernedGlossaryTerms": { - "shape": "AttachGovernedGlossaryTermsPolicyGrantDetail", - "internalonly": true - } - }, - "union": true - }, - "PolicyGrantList": { - "type": "list", - "member": { - "shape": "PolicyGrantMember" - } - }, - "PolicyGrantMember": { - "type": "structure", - "members": { - "principal": { - "shape": "PolicyGrantPrincipal" - }, - "detail": { - "shape": "PolicyGrantDetail" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "grantId": { - "shape": "GrantIdentifier" - } - } - }, - "PolicyGrantPrincipal": { - "type": "structure", - "members": { - "user": { - "shape": "UserPolicyGrantPrincipal" - }, - "group": { - "shape": "GroupPolicyGrantPrincipal" - }, - "project": { - "shape": "ProjectPolicyGrantPrincipal" - }, - "domainUnit": { - "shape": "DomainUnitPolicyGrantPrincipal" - } - }, - "union": true - }, - "PolicyId": { - "type": "string" - }, - "PolicySyncInput": { - "type": "structure", - "required": ["schedule"], - "members": { - "timezone": { - "shape": "Timezone" - }, - "schedule": { - "shape": "PolicySyncScheduleCronString" - } - } - }, - "PolicySyncOutput": { - "type": "structure", - "members": { - "policySyncId": { - "shape": "String" - }, - "timezone": { - "shape": "Timezone" - }, - "schedule": { - "shape": "PolicySyncScheduleCronString" - } - } - }, - "PolicySyncScheduleCronString": { - "type": "string", - "max": 256, - "min": 1, - "pattern": ".*cron\\((\\b[0-5]?[0-9]\\b) ([*]|\\b2[0-3]\\b|\\b[0-1]?[0-9]\\b) ([-?*,/\\dLW]){1,83} ([-*,/\\d]|[a-zA-Z]{3}){1,23} ([-?#*,/\\dL]|[a-zA-Z]{3}){1,13} ([^\\)]+)\\).*" - }, - "PolicyTarget": { - "type": "structure", - "members": { - "domainUnitIdentifier": { - "shape": "DomainUnitId" - }, - "environmentProfileIdentifier": { - "shape": "EnvironmentProfileId" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId" - } - }, - "union": true - }, - "PolicyType": { - "type": "string", - "enum": ["AUTHORIZATION_POLICY"] - }, - "PortalVersion": { - "type": "string", - "enum": ["DATAZONE", "SAGEMAKER_UNIFIED_STUDIO"] - }, - "PostLineageEventInput": { - "type": "structure", - "required": ["domainIdentifier", "event"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "event": { - "shape": "LineageEvent" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true, - "location": "header", - "locationName": "Client-Token" - } - }, - "payload": "event" - }, - "PostLineageEventOutput": { - "type": "structure", - "members": { - "id": { - "shape": "LineageEventIdentifier" - }, - "domainId": { - "shape": "DomainId" - } - } - }, - "PostTimeSeriesDataPointsInput": { - "type": "structure", - "required": ["domainIdentifier", "entityIdentifier", "entityType", "forms"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityIdentifier": { - "shape": "EntityIdentifier", - "location": "uri", - "locationName": "entityIdentifier" - }, - "entityType": { - "shape": "TimeSeriesEntityType", - "location": "uri", - "locationName": "entityType" - }, - "forms": { - "shape": "TimeSeriesDataPointFormInputList" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "PostTimeSeriesDataPointsOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "entityId": { - "shape": "EntityId" - }, - "entityType": { - "shape": "TimeSeriesEntityType" - }, - "forms": { - "shape": "TimeSeriesDataPointFormOutputList" - } - } - }, - "PredictionChoices": { - "type": "list", - "member": { - "shape": "Integer" - } - }, - "PredictionConfiguration": { - "type": "structure", - "members": { - "businessNameGeneration": { - "shape": "BusinessNameGenerationConfiguration" - } - } - }, - "PreferenceKey": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\w \\.:/=+@-]+" - }, - "PreferenceValue": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\w \\.:/=+@-]*" - }, - "Preferences": { - "type": "map", - "key": { - "shape": "PreferenceKey" - }, - "value": { - "shape": "PreferenceValue" - }, - "max": 10, - "min": 0 - }, - "ProjectDeletionError": { - "type": "structure", - "members": { - "code": { - "shape": "String", - "documentation": "

Project Deletion Error Code

" - }, - "message": { - "shape": "String", - "documentation": "

Project Deletion Error Message

" - } - }, - "documentation": "

Error that occurred during project deletion

" - }, - "ProjectDesignation": { - "type": "string", - "enum": ["OWNER", "CONTRIBUTOR", "PROJECT_CATALOG_STEWARD"] - }, - "ProjectDesignator": { - "type": "string", - "deprecated": true, - "deprecatedMessage": "This structure will be removed going forward and will be replaced with projectDesignation enum.", - "enum": ["Owner", "Contributor", "ProjectCatalogSteward"], - "internalonly": true - }, - "ProjectFilter": { - "type": "structure", - "required": ["domainUnit"], - "members": { - "all": { - "shape": "Boolean" - }, - "domainUnit": { - "shape": "DomainUnitId" - }, - "includeChildDomainUnits": { - "shape": "Boolean", - "box": true - } - }, - "deprecated": true, - "deprecatedMessage": "This structure will be removed going forward and will be replaced with projectGrantFilter structure.", - "internalonly": true - }, - "ProjectGrantFilter": { - "type": "structure", - "members": { - "domainUnitFilter": { - "shape": "DomainUnitFilterForProject" - } - }, - "union": true - }, - "ProjectId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "ProjectIds": { - "type": "list", - "member": { - "shape": "ProjectId" - } - }, - "ProjectMember": { - "type": "structure", - "required": ["memberDetails", "designation", "type"], - "members": { - "memberDetails": { - "shape": "MemberDetails" - }, - "designation": { - "shape": "UserDesignation" - }, - "designationId": { - "shape": "DesignationId", - "internalonly": true - }, - "type": { - "shape": "ProjectMemberType", - "internalonly": true - } - } - }, - "ProjectMemberType": { - "type": "string", - "enum": ["USER", "GROUP"] - }, - "ProjectMembers": { - "type": "list", - "member": { - "shape": "ProjectMember" - } - }, - "ProjectMembershipEnforcementDetail": { - "type": "structure", - "required": ["designationIdentifier"], - "members": { - "designationIdentifier": { - "shape": "String" - }, - "minMembers": { - "shape": "Integer" - }, - "maxMembers": { - "shape": "Integer" - }, - "memberType": { - "shape": "MemberType" - } - }, - "internalonly": true - }, - "ProjectMembershipPolicyDetail": { - "type": "structure", - "members": { - "principal": { - "shape": "UserGroupPolicyPrincipal" - }, - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "ProjectMembershipPolicyDetails": { - "type": "list", - "member": { - "shape": "ProjectMembershipPolicyDetail" - } - }, - "ProjectMembershipRequestOutput": { - "type": "structure", - "required": [ - "domainId", - "projectId", - "requestId", - "requestedDesignation", - "reasonDescription", - "requesterId" - ], - "members": { - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "requestId": { - "shape": "RequestId" - }, - "requestedDesignation": { - "shape": "UserDesignation" - }, - "requestStatus": { - "shape": "RequestStatus" - }, - "reasonDescription": { - "shape": "ReasonDescription" - }, - "requesterId": { - "shape": "String" - }, - "lastUpdatedBy": { - "shape": "String" - }, - "requestedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "ProjectName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "ProjectOwner": { - "type": "structure", - "members": { - "userIdentifier": { - "shape": "String" - }, - "groupIdentifier": { - "shape": "String" - } - }, - "union": true - }, - "ProjectOwners": { - "type": "list", - "member": { - "shape": "ProjectOwner" - }, - "max": 1, - "min": 1 - }, - "ProjectPolicyGrantPrincipal": { - "type": "structure", - "members": { - "projectDesignator": { - "shape": "ProjectDesignator", - "deprecated": true, - "deprecatedMessage": "This field will be removed going forward and will be replaced with projectDesignation field.", - "internalonly": true - }, - "projectDesignation": { - "shape": "ProjectDesignation" - }, - "projectIdentifier": { - "shape": "ProjectId" - }, - "projectFilter": { - "shape": "ProjectFilter", - "deprecated": true, - "deprecatedMessage": "This field will be removed going forward and will be replaced with projectGrantFilter field.", - "internalonly": true - }, - "projectGrantFilter": { - "shape": "ProjectGrantFilter" - } - } - }, - "ProjectProfileId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "ProjectProfileList": { - "type": "list", - "member": { - "shape": "String" - } - }, - "ProjectProfileName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "ProjectProfileSummaries": { - "type": "list", - "member": { - "shape": "ProjectProfileSummary" - } - }, - "ProjectProfileSummary": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectProfileId" - }, - "name": { - "shape": "ProjectProfileName" - }, - "description": { - "shape": "Description" - }, - "status": { - "shape": "Status" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "domainUnitId": { - "shape": "DomainUnitId" - } - } - }, - "ProjectProfileType": { - "type": "string", - "enum": [ - "DATA_ANALYTICS_ML_GEN_AI_MODEL_DEVELOPMENT", - "SQL_ANALYTICS", - "GEN_AI_APP_DEVELOPMENT", - "GEN_AI_MODEL_GOVERNANCE" - ] - }, - "ProjectProfileTypesList": { - "type": "list", - "member": { - "shape": "ProjectProfileType" - }, - "min": 1 - }, - "ProjectResourceTagParameters": { - "type": "list", - "member": { - "shape": "ResourceTagParameter" - }, - "max": 25, - "min": 0 - }, - "ProjectScope": { - "type": "structure", - "required": ["name"], - "members": { - "name": { - "shape": "ProjectScopeName" - }, - "policy": { - "shape": "String" - } - } - }, - "ProjectScopeName": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "ProjectScopesList": { - "type": "list", - "member": { - "shape": "ProjectScope" - } - }, - "ProjectStatus": { - "type": "string", - "enum": ["ACTIVE", "MOVING", "DELETING", "DELETE_FAILED", "UPDATING", "UPDATE_FAILED"] - }, - "ProjectSummaries": { - "type": "list", - "member": { - "shape": "ProjectSummary" - } - }, - "ProjectSummary": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectId" - }, - "name": { - "shape": "ProjectName" - }, - "description": { - "shape": "Description" - }, - "projectStatus": { - "shape": "ProjectStatus", - "documentation": "

Status of the project

" - }, - "failureReasons": { - "shape": "FailureReasons", - "documentation": "

Reasons for failed project deletion

" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "projectProfileId": { - "shape": "ProjectProfileId", - "internalonly": true - }, - "projectCategory": { - "shape": "String", - "internalonly": true - } - } - }, - "ProjectsForRule": { - "type": "structure", - "required": ["selectionMode"], - "members": { - "selectionMode": { - "shape": "RuleScopeSelectionMode" - }, - "specificProjects": { - "shape": "RuleProjectIdentifierList" - } - } - }, - "PropertyMap": { - "type": "map", - "key": { - "shape": "PropertyMapKeyString" - }, - "value": { - "shape": "PropertyMapValueString" - } - }, - "PropertyMapKeyString": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" - }, - "PropertyMapValueString": { - "type": "string", - "max": 2048, - "min": 1, - "pattern": "[\\u0020-\\uD7FF\\uE000-\\uFFFF\\t]*" - }, - "Protocol": { - "type": "string", - "enum": ["ATHENA", "GIT", "GLUE_INTERACTIVE_SESSION", "HTTPS", "JDBC", "LIVY", "ODBC", "PRISM"] - }, - "ProvisionDomainInput": { - "type": "structure", - "required": ["domainIdentifier", "provisioningRoleArn", "enabledRegions"], - "members": { - "domainIdentifier": { - "shape": "DomainId" - }, - "projectName": { - "shape": "ProjectName" - }, - "projectDescription": { - "shape": "Description" - }, - "provisioningRoleArn": { - "shape": "AdminApiRoleArn" - }, - "manageAccessRoleArn": { - "shape": "RoleArn" - }, - "glueManageAccessRoleArn": { - "shape": "RoleArn" - }, - "redshiftManageAccessRoleArn": { - "shape": "RoleArn" - }, - "enabledRegions": { - "shape": "EnabledRegionList" - }, - "regionalParameters": { - "shape": "RegionalParameterMap" - }, - "projectProfileTypes": { - "shape": "ProjectProfileTypesList" - }, - "generativeAIGovernance": { - "shape": "GenAIGovernance" - } - } - }, - "ProvisionDomainOutput": { - "type": "structure", - "members": { - "result": { - "shape": "ProvisioningResult" - }, - "message": { - "shape": "String" - } - } - }, - "ProvisionStatus": { - "type": "string", - "enum": [ - "PROVISIONING", - "PROVISIONING_PROJECT_PROFILES", - "PROVISIONING_MODEL_ASSETS", - "PROVISION_FAILED", - "PROVISION_COMPLETE" - ] - }, - "ProvisionedResources": { - "type": "structure", - "members": { - "glueConnection": { - "shape": "ProvisionedResourcesMapping" - }, - "athenaFederatedLambda": { - "shape": "ProvisionedResourcesMapping" - }, - "lakeFormationResource": { - "shape": "ProvisionedResourcesMapping" - }, - "glueDataCatalog": { - "shape": "ProvisionedResourcesMapping" - }, - "lakeFormationPermissions": { - "shape": "ProvisionedResourcesMapping" - } - } - }, - "ProvisionedResourcesMapping": { - "type": "structure", - "required": ["status"], - "members": { - "status": { - "shape": "ConnectionStatus" - }, - "errorMessage": { - "shape": "String" - }, - "resourceArn": { - "shape": "String" - } - } - }, - "ProvisioningConfiguration": { - "type": "structure", - "members": { - "lakeFormationConfiguration": { - "shape": "LakeFormationConfiguration" - } - }, - "union": true - }, - "ProvisioningConfigurationList": { - "type": "list", - "member": { - "shape": "ProvisioningConfiguration" - } - }, - "ProvisioningMode": { - "type": "string", - "enum": ["GLUE_CONNECTION", "GLUE_CONNECTION_WITH_CATALOG"] - }, - "ProvisioningPolicy": { - "type": "string" - }, - "ProvisioningProperties": { - "type": "structure", - "members": { - "cloudFormation": { - "shape": "CloudFormationProperties" - }, - "eventBridge": { - "shape": "EventBridgeProperties", - "internalonly": true - }, - "manual": { - "shape": "ManualProperties", - "internalonly": true - }, - "custom": { - "shape": "CustomResourceProperties", - "internalonly": true - } - }, - "union": true - }, - "ProvisioningResult": { - "type": "string", - "enum": ["SUCCESS", "PARTIAL_FAILURE", "FAILURE", "PROVISIONING"] - }, - "PutAttributeEntries": { - "type": "list", - "member": { - "shape": "PutAttributeInput" - }, - "internalonly": true, - "max": 5, - "min": 0 - }, - "PutAttributeInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "attributeIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId" - }, - "entityType": { - "shape": "AttributeEntityType" - }, - "entityIdentifier": { - "shape": "EntityId" - }, - "attributeIdentifier": { - "shape": "AttributeIdentifier" - }, - "readMe": { - "shape": "PutAttributeInputReadMeString" - }, - "forms": { - "shape": "FormInputList" - }, - "clientToken": { - "shape": "ClientToken" - } - }, - "internalonly": true - }, - "PutAttributeInputReadMeString": { - "type": "string", - "max": 5000, - "min": 0 - }, - "PutAttributeOutput": { - "type": "structure", - "required": ["attributeIdentifier", "revision"], - "members": { - "attributeIdentifier": { - "shape": "AttributeIdentifier" - }, - "revision": { - "shape": "Revision" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - } - }, - "internalonly": true - }, - "PutDomainSharingPolicyInput": { - "type": "structure", - "required": ["domainArn", "policy"], - "members": { - "domainArn": { - "shape": "DomainArn", - "location": "uri", - "locationName": "domainArn" - }, - "policy": { - "shape": "String" - } - } - }, - "PutDomainSharingPolicyOutput": { - "type": "structure", - "members": { - "domainArn": { - "shape": "DomainArn" - }, - "policy": { - "shape": "String" - } - } - }, - "PutEnvironmentBlueprintConfigurationInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentBlueprintIdentifier", "enabledRegions"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentBlueprintIdentifier": { - "shape": "EnvironmentBlueprintId", - "location": "uri", - "locationName": "environmentBlueprintIdentifier" - }, - "provisioningRoleArn": { - "shape": "RoleArn" - }, - "manageAccessRoleArn": { - "shape": "RoleArn" - }, - "environmentRolePermissionBoundary": { - "shape": "PolicyArn" - }, - "enabledRegions": { - "shape": "EnabledRegionList" - }, - "regionalParameters": { - "shape": "RegionalParameterMap" - }, - "resourceConfigurations": { - "shape": "PutResourceConfigurations" - }, - "allowUserProvidedConfigurations": { - "shape": "Boolean" - }, - "lakeFormationConfiguration": { - "shape": "LakeFormationConfiguration", - "internalonly": true - }, - "globalParameters": { - "shape": "GlobalParameterMap" - }, - "allowS3LocationRegistration": { - "shape": "Boolean" - }, - "provisioningConfigurations": { - "shape": "ProvisioningConfigurationList" - } - } - }, - "PutEnvironmentBlueprintConfigurationOutput": { - "type": "structure", - "required": ["domainId", "environmentBlueprintId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "provisioningRoleArn": { - "shape": "RoleArn" - }, - "environmentRolePermissionBoundary": { - "shape": "PolicyArn" - }, - "manageAccessRoleArn": { - "shape": "RoleArn" - }, - "enabledRegions": { - "shape": "EnabledRegionList" - }, - "regionalParameters": { - "shape": "RegionalParameterMap" - }, - "allowUserProvidedConfigurations": { - "shape": "Boolean" - }, - "allowS3LocationRegistration": { - "shape": "Boolean", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "resourceConfigurations": { - "shape": "ResourceConfigurations" - }, - "lakeFormationConfiguration": { - "shape": "LakeFormationConfiguration", - "internalonly": true - }, - "globalParameters": { - "shape": "GlobalParameterMap", - "internalonly": true - }, - "provisioningConfigurations": { - "shape": "ProvisioningConfigurationList" - } - } - }, - "PutLinkedTypeItem": { - "type": "structure", - "required": ["itemIdentifier", "itemType"], - "members": { - "itemIdentifier": { - "shape": "String" - }, - "itemType": { - "shape": "LinkedTypeItemType" - }, - "name": { - "shape": "String" - }, - "arn": { - "shape": "String" - }, - "configuration": { - "shape": "ConfigurationMap" - }, - "authorizedPrincipals": { - "shape": "LinkedTypeAuthorizedPrincipals" - }, - "connectedEntities": { - "shape": "ConnectedEntities" - } - } - }, - "PutResourceConfiguration": { - "type": "structure", - "required": ["name", "region", "parameters"], - "members": { - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "region": { - "shape": "RegionName" - }, - "parameters": { - "shape": "ResourceConfigurationParameterMap" - } - } - }, - "PutResourceConfigurations": { - "type": "list", - "member": { - "shape": "PutResourceConfiguration" - }, - "max": 10, - "min": 0 - }, - "RAMInternalId": { - "type": "string", - "max": 64, - "min": 2 - }, - "RAMInternalIdMismatchException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "String" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "RAMInvalidParameterException": { - "type": "structure", - "members": { - "message": { - "shape": "String" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "RAMInvalidSequenceNumberException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "String" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "RAMPolicy": { - "type": "string" - }, - "RAMResource": { - "type": "structure", - "members": { - "resourceArn": { - "shape": "RAMResourceARN" - }, - "internalId": { - "shape": "RAMInternalId" - } - } - }, - "RAMResourceARN": { - "type": "string", - "max": 255, - "min": 1 - }, - "RAMResourceList": { - "type": "list", - "member": { - "shape": "RAMResource" - } - }, - "RAMResourceNotFoundException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "String" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "RAMResourceNotSharedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "String" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "RAMSequenceNumber": { - "type": "integer", - "box": true, - "min": 0 - }, - "RAMSharingAction": { - "type": "string", - "enum": ["SHARE", "UNSHARE"] - }, - "RAMSharingResult": { - "type": "string", - "enum": ["SUCCESS", "FAILED"] - }, - "RAMValidationResult": { - "type": "string", - "enum": ["VALID", "RESOURCE_NOT_FOUND", "RESOURCE_CANNOT_BE_SHARED"] - }, - "RAMVersionedSharedResource": { - "type": "structure", - "required": ["sequenceNumber", "resource"], - "members": { - "sequenceNumber": { - "shape": "RAMSequenceNumber" - }, - "resource": { - "shape": "RAMResourceARN" - }, - "internalId": { - "shape": "RAMInternalId" - } - } - }, - "RAMVersionedSharedResourceList": { - "type": "list", - "member": { - "shape": "RAMVersionedSharedResource" - } - }, - "ReasonDescription": { - "type": "string", - "max": 250, - "min": 1 - }, - "RecommendationConfiguration": { - "type": "structure", - "members": { - "enableBusinessNameGeneration": { - "shape": "Boolean" - } - } - }, - "RedeemAccessTokenRequest": { - "type": "structure", - "required": ["domainId", "accessToken"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "accessToken": { - "shape": "String" - } - } - }, - "RedeemAccessTokenResponse": { - "type": "structure", - "members": { - "credentials": { - "shape": "AwsCredentials" - } - } - }, - "RedshiftClusterStorage": { - "type": "structure", - "required": ["clusterName"], - "members": { - "clusterName": { - "shape": "RedshiftClusterStorageClusterNameString" - } - } - }, - "RedshiftClusterStorageClusterNameString": { - "type": "string", - "max": 63, - "min": 1, - "pattern": "[0-9a-z].[a-z0-9\\-]*" - }, - "RedshiftCredentialConfiguration": { - "type": "structure", - "required": ["secretManagerArn"], - "members": { - "secretManagerArn": { - "shape": "RedshiftCredentialConfigurationSecretManagerArnString" - } - } - }, - "RedshiftCredentialConfigurationSecretManagerArnString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "arn:aws[^:]*:secretsmanager:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:secret:.*" - }, - "RedshiftCredentials": { - "type": "structure", - "members": { - "secretArn": { - "shape": "RedshiftCredentialsSecretArnString" - }, - "usernamePassword": { - "shape": "UsernamePassword" - } - }, - "sensitive": true, - "union": true - }, - "RedshiftCredentialsSecretArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws[^:]*:secretsmanager:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:secret:.*" - }, - "RedshiftLineageSyncConfigurationInput": { - "type": "structure", - "members": { - "enabled": { - "shape": "Boolean" - }, - "schedule": { - "shape": "LineageSyncSchedule" - } - } - }, - "RedshiftLineageSyncConfigurationOutput": { - "type": "structure", - "members": { - "lineageJobId": { - "shape": "String" - }, - "enabled": { - "shape": "Boolean" - }, - "schedule": { - "shape": "LineageSyncSchedule" - } - } - }, - "RedshiftPropertiesInput": { - "type": "structure", - "members": { - "storage": { - "shape": "RedshiftStorageProperties" - }, - "databaseName": { - "shape": "RedshiftPropertiesInputDatabaseNameString" - }, - "host": { - "shape": "RedshiftPropertiesInputHostString" - }, - "port": { - "shape": "RedshiftPropertiesInputPortInteger" - }, - "credentials": { - "shape": "RedshiftCredentials" - }, - "lineageSync": { - "shape": "RedshiftLineageSyncConfigurationInput" - }, - "provisioningMode": { - "shape": "ProvisioningMode", - "internalonly": true - }, - "connectivityProperties": { - "shape": "ConnectivityProperties", - "internalonly": true - } - } - }, - "RedshiftPropertiesInputDatabaseNameString": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[a-z0-9_-]+" - }, - "RedshiftPropertiesInputHostString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "RedshiftPropertiesInputPortInteger": { - "type": "integer", - "box": true, - "max": 65535, - "min": 0 - }, - "RedshiftPropertiesOutput": { - "type": "structure", - "members": { - "storage": { - "shape": "RedshiftStorageProperties" - }, - "credentials": { - "shape": "RedshiftCredentials" - }, - "isProvisionedSecret": { - "shape": "Boolean" - }, - "jdbcIamUrl": { - "shape": "String" - }, - "jdbcUrl": { - "shape": "String" - }, - "redshiftTempDir": { - "shape": "String" - }, - "lineageSync": { - "shape": "RedshiftLineageSyncConfigurationOutput" - }, - "status": { - "shape": "ConnectionStatus" - }, - "databaseName": { - "shape": "String" - }, - "provisioningMode": { - "shape": "ProvisioningMode", - "internalonly": true - }, - "provisionedResources": { - "shape": "ProvisionedResources" - } - } - }, - "RedshiftPropertiesPatch": { - "type": "structure", - "members": { - "storage": { - "shape": "RedshiftStorageProperties" - }, - "databaseName": { - "shape": "RedshiftPropertiesPatchDatabaseNameString" - }, - "host": { - "shape": "RedshiftPropertiesPatchHostString" - }, - "port": { - "shape": "RedshiftPropertiesPatchPortInteger" - }, - "credentials": { - "shape": "RedshiftCredentials" - }, - "lineageSync": { - "shape": "RedshiftLineageSyncConfigurationInput" - }, - "provisioningMode": { - "shape": "ProvisioningMode", - "internalonly": true - }, - "connectivityPropertiesPatch": { - "shape": "ConnectivityPropertiesPatch", - "internalonly": true - } - } - }, - "RedshiftPropertiesPatchDatabaseNameString": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[a-z0-9_-]+" - }, - "RedshiftPropertiesPatchHostString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "RedshiftPropertiesPatchPortInteger": { - "type": "integer", - "box": true, - "max": 65535, - "min": 0 - }, - "RedshiftRunConfigurationInput": { - "type": "structure", - "required": ["relationalFilterConfigurations"], - "members": { - "dataAccessRole": { - "shape": "RedshiftRunConfigurationInputDataAccessRoleString" - }, - "relationalFilterConfigurations": { - "shape": "RelationalFilterConfigurations" - }, - "selfGrantSetting": { - "shape": "SelfGrantSetting" - }, - "redshiftCredentialConfiguration": { - "shape": "RedshiftCredentialConfiguration" - }, - "redshiftStorage": { - "shape": "RedshiftStorage" - } - } - }, - "RedshiftRunConfigurationInputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "RedshiftRunConfigurationOutput": { - "type": "structure", - "required": ["relationalFilterConfigurations", "redshiftStorage"], - "members": { - "accountId": { - "shape": "RedshiftRunConfigurationOutputAccountIdString" - }, - "region": { - "shape": "RedshiftRunConfigurationOutputRegionString" - }, - "dataAccessRole": { - "shape": "RedshiftRunConfigurationOutputDataAccessRoleString" - }, - "relationalFilterConfigurations": { - "shape": "RelationalFilterConfigurations" - }, - "selfGrantSetting": { - "shape": "SelfGrantSetting" - }, - "redshiftCredentialConfiguration": { - "shape": "RedshiftCredentialConfiguration" - }, - "redshiftStorage": { - "shape": "RedshiftStorage" - } - } - }, - "RedshiftRunConfigurationOutputAccountIdString": { - "type": "string", - "max": 12, - "min": 12, - "pattern": "\\d{12}" - }, - "RedshiftRunConfigurationOutputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "RedshiftRunConfigurationOutputRegionString": { - "type": "string", - "max": 16, - "min": 4, - "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" - }, - "RedshiftSelfGrantStatusOutput": { - "type": "structure", - "required": ["selfGrantStatusDetails"], - "members": { - "selfGrantStatusDetails": { - "shape": "SelfGrantStatusDetails" - } - } - }, - "RedshiftServerlessStorage": { - "type": "structure", - "required": ["workgroupName"], - "members": { - "workgroupName": { - "shape": "RedshiftServerlessStorageWorkgroupNameString" - } - } - }, - "RedshiftServerlessStorageWorkgroupNameString": { - "type": "string", - "max": 64, - "min": 3, - "pattern": "[a-z0-9-]+" - }, - "RedshiftStorage": { - "type": "structure", - "members": { - "redshiftClusterSource": { - "shape": "RedshiftClusterStorage" - }, - "redshiftServerlessSource": { - "shape": "RedshiftServerlessStorage" - } - }, - "union": true - }, - "RedshiftStorageProperties": { - "type": "structure", - "members": { - "clusterName": { - "shape": "RedshiftStoragePropertiesClusterNameString" - }, - "workgroupName": { - "shape": "RedshiftStoragePropertiesWorkgroupNameString" - } - }, - "union": true - }, - "RedshiftStoragePropertiesClusterNameString": { - "type": "string", - "max": 63, - "min": 0, - "pattern": "[a-z0-9-]+" - }, - "RedshiftStoragePropertiesWorkgroupNameString": { - "type": "string", - "max": 64, - "min": 3, - "pattern": "[a-z0-9-]+" - }, - "RefreshTokenRequest": { - "type": "structure", - "required": ["domainId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "authCode": { - "shape": "String" - }, - "jwtToken": { - "shape": "String", - "location": "header", - "locationName": "jwt-token" - }, - "csrfToken": { - "shape": "String", - "location": "header", - "locationName": "x-csrf-token" - } - } - }, - "RefreshTokenResponse": { - "type": "structure", - "members": { - "cookieStrings": { - "shape": "SetCookies", - "location": "header", - "locationName": "Set-Cookie" - }, - "CacheControl": { - "shape": "String", - "location": "header", - "locationName": "Cache-Control" - }, - "jwtToken": { - "shape": "String" - }, - "csrfToken": { - "shape": "String" - }, - "userProfile": { - "shape": "UserProfile" - }, - "iamCreds": { - "shape": "IamCredential" - }, - "identityEnhancedIamCreds": { - "shape": "IamCredential" - }, - "accessToken": { - "shape": "String" - } - } - }, - "Region": { - "type": "structure", - "members": { - "regionName": { - "shape": "RegionName" - }, - "regionNamePath": { - "shape": "ParameterStorePath" - } - }, - "union": true - }, - "RegionName": { - "type": "string", - "max": 16, - "min": 4, - "pattern": "[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]" - }, - "RegionalParameter": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - }, - "RegionalParameterMap": { - "type": "map", - "key": { - "shape": "RegionName" - }, - "value": { - "shape": "RegionalParameter" - } - }, - "RejectChoice": { - "type": "structure", - "required": ["predictionTarget"], - "members": { - "predictionTarget": { - "shape": "String" - }, - "predictionChoices": { - "shape": "PredictionChoices" - } - } - }, - "RejectChoices": { - "type": "list", - "member": { - "shape": "RejectChoice" - } - }, - "RejectPredictionsInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AssetIdentifier", - "location": "uri", - "locationName": "identifier" - }, - "revision": { - "shape": "Revision", - "location": "querystring", - "locationName": "revision" - }, - "rejectRule": { - "shape": "RejectRule" - }, - "rejectChoices": { - "shape": "RejectChoices" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "RejectPredictionsOutput": { - "type": "structure", - "required": ["domainId", "assetId", "assetRevision"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "assetId": { - "shape": "AssetId" - }, - "assetRevision": { - "shape": "Revision" - } - } - }, - "RejectRule": { - "type": "structure", - "members": { - "rule": { - "shape": "RejectRuleBehavior" - }, - "threshold": { - "shape": "Float" - } - } - }, - "RejectRuleBehavior": { - "type": "string", - "enum": ["ALL", "NONE"] - }, - "RejectSubscriptionRequestInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionRequestId", - "location": "uri", - "locationName": "identifier" - }, - "decisionComment": { - "shape": "DecisionComment" - } - } - }, - "RejectSubscriptionRequestOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "requestReason", - "subscribedPrincipals", - "subscribedListings" - ], - "members": { - "id": { - "shape": "SubscriptionRequestId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionRequestStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "requestReason": { - "shape": "RequestReason" - }, - "subscribedPrincipals": { - "shape": "RejectSubscriptionRequestOutputSubscribedPrincipalsList" - }, - "subscribedListings": { - "shape": "RejectSubscriptionRequestOutputSubscribedListingsList" - }, - "reviewerId": { - "shape": "String" - }, - "decisionComment": { - "shape": "DecisionComment" - }, - "existingSubscriptionId": { - "shape": "SubscriptionId" - }, - "metadataForms": { - "shape": "MetadataForms" - } - } - }, - "RejectSubscriptionRequestOutputSubscribedListingsList": { - "type": "list", - "member": { - "shape": "SubscribedListing" - }, - "max": 1, - "min": 1 - }, - "RejectSubscriptionRequestOutputSubscribedPrincipalsList": { - "type": "list", - "member": { - "shape": "SubscribedPrincipal" - }, - "max": 1, - "min": 1 - }, - "RelationalFilterConfiguration": { - "type": "structure", - "required": ["databaseName"], - "members": { - "databaseName": { - "shape": "RelationalFilterConfigurationDatabaseNameString" - }, - "schemaName": { - "shape": "RelationalFilterConfigurationSchemaNameString" - }, - "filterExpressions": { - "shape": "FilterExpressions" - } - } - }, - "RelationalFilterConfigurationDatabaseNameString": { - "type": "string", - "max": 128, - "min": 1 - }, - "RelationalFilterConfigurationSchemaNameString": { - "type": "string", - "max": 128, - "min": 1 - }, - "RelationalFilterConfigurations": { - "type": "list", - "member": { - "shape": "RelationalFilterConfiguration" - } - }, - "RemoveEntityOwnerInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "owner"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "DataZoneEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "String", - "location": "uri", - "locationName": "entityIdentifier" - }, - "owner": { - "shape": "OwnerProperties" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "RemoveEntityOwnerOutput": { - "type": "structure", - "members": {} - }, - "RemovePolicyGrantInput": { - "type": "structure", - "required": ["domainIdentifier", "entityType", "entityIdentifier", "policyType", "principal"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "entityType": { - "shape": "TargetEntityType", - "location": "uri", - "locationName": "entityType" - }, - "entityIdentifier": { - "shape": "String", - "location": "uri", - "locationName": "entityIdentifier" - }, - "policyType": { - "shape": "ManagedPolicyType" - }, - "principal": { - "shape": "PolicyGrantPrincipal" - }, - "grantIdentifier": { - "shape": "GrantIdentifier" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "RemovePolicyGrantOutput": { - "type": "structure", - "members": {} - }, - "RenderingConfig": { - "type": "structure", - "members": { - "collapse": { - "shape": "Boolean" - } - }, - "internalonly": true - }, - "RepositoryType": { - "type": "string", - "enum": ["CODE_COMMIT", "CODE_STAR"] - }, - "RequestId": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[a-zA-Z0-9-_]+" - }, - "RequestReason": { - "type": "string", - "max": 4096, - "min": 0, - "sensitive": true - }, - "RequestStatus": { - "type": "string", - "enum": ["ACCEPTED", "REJECTED", "CANCELED", "PENDING"] - }, - "RequiredMetadataFormList": { - "type": "list", - "member": { - "shape": "MetadataFormReference" - }, - "max": 5, - "min": 1 - }, - "Rerank": { - "type": "structure", - "members": { - "rerankers": { - "shape": "Rerankers" - }, - "maxRerank": { - "shape": "Integer" - } - } - }, - "Reranker": { - "type": "structure", - "members": { - "ngram": { - "shape": "NgramReranker" - }, - "fieldValueFactor": { - "shape": "FieldValueFactorReranker" - } - }, - "union": true - }, - "Rerankers": { - "type": "list", - "member": { - "shape": "Reranker" - } - }, - "ResolutionStrategy": { - "type": "string", - "enum": ["MANUAL"] - }, - "Resource": { - "type": "structure", - "required": ["value", "type"], - "members": { - "provider": { - "shape": "String" - }, - "name": { - "shape": "String" - }, - "value": { - "shape": "String" - }, - "type": { - "shape": "String" - } - } - }, - "ResourceConfiguration": { - "type": "structure", - "required": ["identifier", "name", "region", "parameters"], - "members": { - "identifier": { - "shape": "String" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "lineageJobId": { - "shape": "String", - "internalonly": true - }, - "region": { - "shape": "RegionName" - }, - "parameters": { - "shape": "ResourceConfigurationParameterMap" - } - } - }, - "ResourceConfigurationId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{0,36}" - }, - "ResourceConfigurationParameterMap": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - }, - "ResourceConfigurations": { - "type": "list", - "member": { - "shape": "ResourceConfiguration" - }, - "max": 10, - "min": 0 - }, - "ResourceList": { - "type": "list", - "member": { - "shape": "Resource" - } - }, - "ResourceNotFoundException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 404, - "senderFault": true - }, - "exception": true - }, - "ResourcePath": { - "type": "string", - "internalonly": true, - "max": 1024, - "min": 1 - }, - "ResourcePaths": { - "type": "list", - "member": { - "shape": "ResourcePath" - }, - "max": 100, - "min": 1 - }, - "ResourcePolicyNotFoundException": { - "type": "structure", - "members": { - "message": { - "shape": "String" - } - }, - "error": { - "httpStatusCode": 500 - }, - "exception": true, - "fault": true - }, - "ResourceStatus": { - "type": "string", - "enum": ["SHARED", "DELEGATED", "REMOVED"] - }, - "ResourceTag": { - "type": "structure", - "required": ["key", "value", "source"], - "members": { - "key": { - "shape": "TagKey" - }, - "value": { - "shape": "TagValue" - }, - "source": { - "shape": "ResourceTagSource" - } - } - }, - "ResourceTagParameter": { - "type": "structure", - "required": ["key", "value", "isValueEditable"], - "members": { - "key": { - "shape": "TagKey" - }, - "value": { - "shape": "TagValue" - }, - "isValueEditable": { - "shape": "Boolean" - } - } - }, - "ResourceTagSource": { - "type": "string", - "enum": ["PROJECT", "PROJECT_PROFILE"] - }, - "ResourceTags": { - "type": "list", - "member": { - "shape": "ResourceTag" - }, - "max": 25, - "min": 0 - }, - "ResourceType": { - "type": "string", - "max": 256, - "min": 1 - }, - "Revision": { - "type": "string", - "max": 64, - "min": 1 - }, - "RevisionInput": { - "type": "string", - "max": 64, - "min": 1, - "pattern": "[a-zA-Z0-9_-]+" - }, - "RevokeSubscriptionInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionId", - "location": "uri", - "locationName": "identifier" - }, - "retainPermissions": { - "shape": "Boolean" - } - } - }, - "RevokeSubscriptionOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "subscribedPrincipal", - "subscribedListing" - ], - "members": { - "id": { - "shape": "SubscriptionId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "subscribedPrincipal": { - "shape": "SubscribedPrincipal" - }, - "subscribedListing": { - "shape": "SubscribedListing" - }, - "subscriptionRequestId": { - "shape": "SubscriptionRequestId" - }, - "retainPermissions": { - "shape": "Boolean" - }, - "pushedSubscription": { - "shape": "Boolean" - }, - "expirationTimestamp": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "RoleArn": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" - }, - "RoleTag": { - "type": "string", - "max": 36, - "min": 1, - "pattern": "[a-zA-Z0-9_-]+" - }, - "RowFilter": { - "type": "structure", - "members": { - "expression": { - "shape": "RowFilterExpression" - }, - "and": { - "shape": "RowFilterList" - }, - "or": { - "shape": "RowFilterList" - } - }, - "union": true - }, - "RowFilterConfiguration": { - "type": "structure", - "required": ["rowFilter"], - "members": { - "rowFilter": { - "shape": "RowFilter" - }, - "sensitive": { - "shape": "Boolean" - } - } - }, - "RowFilterExpression": { - "type": "structure", - "members": { - "equalTo": { - "shape": "EqualToExpression" - }, - "notEqualTo": { - "shape": "NotEqualToExpression" - }, - "greaterThan": { - "shape": "GreaterThanExpression" - }, - "lessThan": { - "shape": "LessThanExpression" - }, - "greaterThanOrEqualTo": { - "shape": "GreaterThanOrEqualToExpression" - }, - "lessThanOrEqualTo": { - "shape": "LessThanOrEqualToExpression" - }, - "isNull": { - "shape": "IsNullExpression" - }, - "isNotNull": { - "shape": "IsNotNullExpression" - }, - "in": { - "shape": "InExpression" - }, - "notIn": { - "shape": "NotInExpression" - }, - "like": { - "shape": "LikeExpression" - }, - "notLike": { - "shape": "NotLikeExpression" - } - }, - "union": true - }, - "RowFilterList": { - "type": "list", - "member": { - "shape": "RowFilter" - } - }, - "RuleAction": { - "type": "string", - "enum": [ - "CREATE_LISTING_CHANGE_SET", - "CREATE_PROJECT", - "CREATE_SUBSCRIPTION_REQUEST", - "PROJECT_MEMBERSHIP_UPDATES" - ] - }, - "RuleAssetTypeList": { - "type": "list", - "member": { - "shape": "AssetTypeIdentifier" - }, - "min": 1 - }, - "RuleDetail": { - "type": "structure", - "members": { - "metadataFormEnforcementDetail": { - "shape": "MetadataFormEnforcementDetail" - }, - "projectMembershipEnforcementDetail": { - "shape": "ProjectMembershipEnforcementDetail", - "internalonly": true - }, - "glossaryTermEnforcementDetail": { - "shape": "GlossaryTermEnforcementDetail", - "internalonly": true - } - }, - "union": true - }, - "RuleId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "RuleName": { - "type": "string", - "max": 256, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "RuleProjectIdentifierList": { - "type": "list", - "member": { - "shape": "ProjectId" - }, - "min": 1 - }, - "RuleScope": { - "type": "structure", - "members": { - "assetType": { - "shape": "AssetTypesForRule" - }, - "dataProduct": { - "shape": "Boolean" - }, - "project": { - "shape": "ProjectsForRule" - } - } - }, - "RuleScopeSelectionMode": { - "type": "string", - "enum": ["ALL", "SPECIFIC"] - }, - "RuleSearchSummaries": { - "type": "list", - "member": { - "shape": "RuleSearchSummary" - } - }, - "RuleSearchSummary": { - "type": "structure", - "members": { - "identifier": { - "shape": "RuleId" - }, - "detail": { - "shape": "RuleDetail" - } - } - }, - "RuleSummaries": { - "type": "list", - "member": { - "shape": "RuleSummary" - } - }, - "RuleSummary": { - "type": "structure", - "members": { - "identifier": { - "shape": "RuleId" - }, - "revision": { - "shape": "Revision" - }, - "ruleType": { - "shape": "RuleType" - }, - "name": { - "shape": "RuleName" - }, - "targetType": { - "shape": "RuleTargetType" - }, - "target": { - "shape": "RuleTarget" - }, - "action": { - "shape": "RuleAction" - }, - "scope": { - "shape": "RuleScope" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "lastUpdatedBy": { - "shape": "UpdatedBy" - } - } - }, - "RuleTarget": { - "type": "structure", - "members": { - "domainUnitTarget": { - "shape": "DomainUnitTarget" - } - }, - "union": true - }, - "RuleTargetType": { - "type": "string", - "enum": ["DOMAIN_UNIT"] - }, - "RuleType": { - "type": "string", - "enum": ["METADATA_FORM_ENFORCEMENT", "MEMBERSHIP_ENFORCEMENT", "GLOSSARY_TERM_ENFORCEMENT"] - }, - "RunIdentifier": { - "type": "string", - "internalonly": true, - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "RunStatisticsForAssets": { - "type": "structure", - "members": { - "added": { - "shape": "Integer" - }, - "updated": { - "shape": "Integer" - }, - "unchanged": { - "shape": "Integer" - }, - "skipped": { - "shape": "Integer" - }, - "failed": { - "shape": "Integer" - } - } - }, - "S3AccessGrantLocationId": { - "type": "string", - "max": 64, - "min": 0, - "pattern": ".*[a-zA-Z0-9\\-]+.*" - }, - "S3AccessGrantLocationRegistrationResult": { - "type": "structure", - "required": ["status"], - "members": { - "status": { - "shape": "S3AccessGrantLocationRegistrationStatus" - }, - "errorMessage": { - "shape": "String" - } - } - }, - "S3AccessGrantLocationRegistrationStatus": { - "type": "string", - "enum": ["SUCCESS", "FAILED", "SKIPPED", "NOT_APPLICABLE"] - }, - "S3FolderPropertiesInput": { - "type": "structure", - "required": ["s3Uri"], - "members": { - "s3Uri": { - "shape": "S3Uri" - } - } - }, - "S3FolderPropertiesOutput": { - "type": "structure", - "required": ["s3Uri"], - "members": { - "s3Uri": { - "shape": "S3Uri" - } - } - }, - "S3FolderPropertiesPatch": { - "type": "structure", - "required": ["s3Uri"], - "members": { - "s3Uri": { - "shape": "S3Uri" - } - } - }, - "S3Location": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "s3://.+" - }, - "S3LocationList": { - "type": "list", - "member": { - "shape": "S3Location" - }, - "max": 20, - "min": 0 - }, - "S3Permission": { - "type": "string", - "enum": ["READ", "WRITE"] - }, - "S3Permissions": { - "type": "list", - "member": { - "shape": "S3Permission" - }, - "documentation": "

S3 permissions as a simple enum list.

" - }, - "S3PropertiesInput": { - "type": "structure", - "required": ["s3Uri"], - "members": { - "s3Uri": { - "shape": "S3Uri" - }, - "s3AccessGrantLocationId": { - "shape": "S3AccessGrantLocationId", - "internalonly": true - }, - "shouldRegisterS3AccessGrantLocation": { - "shape": "Boolean", - "internalonly": true - } - } - }, - "S3PropertiesOutput": { - "type": "structure", - "required": ["s3Uri"], - "members": { - "s3Uri": { - "shape": "S3Uri" - }, - "s3AccessGrantLocationId": { - "shape": "S3AccessGrantLocationId", - "internalonly": true - }, - "shouldRegisterS3AccessGrantLocation": { - "shape": "Boolean", - "internalonly": true - }, - "status": { - "shape": "ConnectionStatus", - "internalonly": true - }, - "s3AccessGrantLocationRegistrationResult": { - "shape": "S3AccessGrantLocationRegistrationResult", - "internalonly": true - }, - "errorMessage": { - "shape": "String", - "internalonly": true - } - } - }, - "S3PropertiesPatch": { - "type": "structure", - "required": ["s3Uri"], - "members": { - "s3Uri": { - "shape": "S3Uri" - }, - "s3AccessGrantLocationId": { - "shape": "S3AccessGrantLocationId", - "internalonly": true - }, - "shouldRegisterS3AccessGrantLocation": { - "shape": "Boolean", - "internalonly": true - } - } - }, - "S3Uri": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "s3://.*" - }, - "SAPPropertiesInput": { - "type": "structure", - "members": { - "connectorEndpoint": { - "shape": "String" - }, - "invitationCode": { - "shape": "String" - } - }, - "internalonly": true - }, - "SAPPropertiesOutput": { - "type": "structure", - "members": { - "connectorEndpoint": { - "shape": "String" - }, - "invitationCode": { - "shape": "String" - }, - "clientId": { - "shape": "String" - }, - "clientConfigurationEndpoint": { - "shape": "String" - }, - "softwareInstanceIdentifier": { - "shape": "String" - }, - "providerId": { - "shape": "String" - } - }, - "internalonly": true - }, - "SAPResource": { - "type": "structure", - "members": { - "status": { - "shape": "ResourceStatus" - }, - "createdAt": { - "shape": "CreatedAtTimestamp" - }, - "updatedAt": { - "shape": "UpdatedAtTimestamp" - }, - "deltaShareId": { - "shape": "String" - }, - "deltaShareName": { - "shape": "String" - }, - "providerId": { - "shape": "String" - } - }, - "internalonly": true - }, - "SageMakerAssetType": { - "type": "string", - "max": 64, - "min": 1 - }, - "SageMakerParameters": { - "type": "structure", - "members": {} - }, - "SageMakerResourceArn": { - "type": "string", - "pattern": "arn:aws[^:]*:sagemaker:[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9]:\\d{12}:[\\w+=,.@-]{1,128}/[\\w+=,.@-]{1,256}" - }, - "SageMakerRunConfigurationInput": { - "type": "structure", - "required": ["trackingAssets"], - "members": { - "dataAccessRole": { - "shape": "SageMakerRunConfigurationInputDataAccessRoleString", - "internalonly": true - }, - "trackingAssets": { - "shape": "TrackingAssets" - } - } - }, - "SageMakerRunConfigurationInputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "SageMakerRunConfigurationOutput": { - "type": "structure", - "required": ["trackingAssets"], - "members": { - "dataAccessRole": { - "shape": "SageMakerRunConfigurationOutputDataAccessRoleString", - "internalonly": true - }, - "accountId": { - "shape": "SageMakerRunConfigurationOutputAccountIdString" - }, - "region": { - "shape": "SageMakerRunConfigurationOutputRegionString" - }, - "trackingAssets": { - "shape": "TrackingAssets" - } - } - }, - "SageMakerRunConfigurationOutputAccountIdString": { - "type": "string", - "max": 12, - "min": 12, - "pattern": "\\d{12}" - }, - "SageMakerRunConfigurationOutputDataAccessRoleString": { - "type": "string", - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]{1,128}" - }, - "SageMakerRunConfigurationOutputRegionString": { - "type": "string", - "max": 16, - "min": 4, - "pattern": ".*[a-z]{2}-?(iso|gov)?-{1}[a-z]*-{1}[0-9].*" - }, - "ScheduleConfiguration": { - "type": "structure", - "members": { - "timezone": { - "shape": "Timezone" - }, - "schedule": { - "shape": "CronString" - } - }, - "sensitive": true - }, - "Scopes": { - "type": "list", - "member": { - "shape": "String" - } - }, - "ScoreModifier": { - "type": "string", - "enum": ["SIGMOID", "LOG", "LN", "SQUARE", "SQRT", "RECIPROCAL"] - }, - "SearchDomainPoliciesInput": { - "type": "structure", - "required": ["domainId"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "searchText": { - "shape": "String", - "location": "querystring", - "locationName": "searchText" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - }, - "filters": { - "shape": "PolicyFilterClause" - } - } - }, - "SearchDomainPoliciesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "SearchPoliciesResultItems" - }, - "count": { - "shape": "Integer" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "SearchFieldEnvironment": { - "type": "string", - "enum": ["NAME"] - }, - "SearchGroupProfilesInput": { - "type": "structure", - "required": ["domainIdentifier", "groupType"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "groupType": { - "shape": "GroupSearchType" - }, - "searchText": { - "shape": "GroupSearchText" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "SearchGroupProfilesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "GroupProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "SearchInItem": { - "type": "structure", - "required": ["attribute"], - "members": { - "attribute": { - "shape": "Attribute" - } - } - }, - "SearchInList": { - "type": "list", - "member": { - "shape": "SearchInItem" - }, - "max": 10, - "min": 1 - }, - "SearchInput": { - "type": "structure", - "required": ["domainIdentifier", "searchScope"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "searchScope": { - "shape": "InventorySearchScope" - }, - "searchText": { - "shape": "SearchText" - }, - "searchIn": { - "shape": "SearchInList" - }, - "filters": { - "shape": "FilterClause" - }, - "includeDefaultFacets": { - "shape": "Boolean", - "internalonly": true - }, - "aggregations": { - "shape": "AggregationList", - "internalonly": true - }, - "sort": { - "shape": "SearchSort" - }, - "additionalAttributes": { - "shape": "SearchOutputAdditionalAttributes" - }, - "reranks": { - "shape": "Rerank" - } - } - }, - "SearchInventoryResultItem": { - "type": "structure", - "members": { - "glossaryItem": { - "shape": "GlossaryItem" - }, - "glossaryTermItem": { - "shape": "GlossaryTermItem" - }, - "assetItem": { - "shape": "AssetItem" - }, - "dataProductItem": { - "shape": "DataProductResultItem" - } - }, - "union": true - }, - "SearchInventoryResultItems": { - "type": "list", - "member": { - "shape": "SearchInventoryResultItem" - } - }, - "SearchListingsInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "searchText": { - "shape": "SearchListingsInputSearchTextString" - }, - "searchIn": { - "shape": "SearchInList" - }, - "maxResults": { - "shape": "MaxListResults" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "filters": { - "shape": "FilterClause" - }, - "includeDefaultFacets": { - "shape": "Boolean", - "internalonly": true - }, - "aggregations": { - "shape": "AggregationList", - "internalonly": true - }, - "sort": { - "shape": "SearchSort" - }, - "additionalAttributes": { - "shape": "SearchOutputAdditionalAttributes" - }, - "reranks": { - "shape": "Rerank" - } - } - }, - "SearchListingsInputSearchTextString": { - "type": "string", - "max": 512, - "min": 0 - }, - "SearchListingsOutput": { - "type": "structure", - "members": { - "items": { - "shape": "SearchResultItems" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "totalMatchCount": { - "shape": "Integer" - }, - "aggregates": { - "shape": "AggregationOutputList", - "internalonly": true - }, - "aggregations": { - "shape": "AggregationOutputList", - "internalonly": true - }, - "treatment": { - "shape": "TreatmentCodes", - "internalonly": true - } - } - }, - "SearchOutput": { - "type": "structure", - "members": { - "items": { - "shape": "SearchInventoryResultItems" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "totalMatchCount": { - "shape": "Integer" - }, - "aggregations": { - "shape": "AggregationOutputList", - "internalonly": true - } - } - }, - "SearchOutputAdditionalAttribute": { - "type": "string", - "enum": ["FORMS", "TIME_SERIES_DATA_POINT_FORMS", "TEXT_MATCH_RATIONALE"] - }, - "SearchOutputAdditionalAttributes": { - "type": "list", - "member": { - "shape": "SearchOutputAdditionalAttribute" - } - }, - "SearchPoliciesResultItems": { - "type": "list", - "member": { - "shape": "DomainPolicyItem" - } - }, - "SearchResultItem": { - "type": "structure", - "members": { - "assetListing": { - "shape": "AssetListingItem" - }, - "dataProductListing": { - "shape": "DataProductListingItem" - } - }, - "union": true - }, - "SearchResultItems": { - "type": "list", - "member": { - "shape": "SearchResultItem" - } - }, - "SearchRulesInput": { - "type": "structure", - "required": ["domainIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "requiredMetadataForm": { - "shape": "FormTypeIdentifier", - "location": "querystring", - "locationName": "requiredMetadataForm" - }, - "maxResults": { - "shape": "MaxResults", - "location": "querystring", - "locationName": "maxResults" - }, - "nextToken": { - "shape": "PaginationToken", - "location": "querystring", - "locationName": "nextToken" - } - } - }, - "SearchRulesOutput": { - "type": "structure", - "required": ["items"], - "members": { - "items": { - "shape": "RuleSearchSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "SearchSort": { - "type": "structure", - "required": ["attribute"], - "members": { - "attribute": { - "shape": "Attribute" - }, - "order": { - "shape": "SortOrder" - } - } - }, - "SearchText": { - "type": "string", - "max": 512, - "min": 1 - }, - "SearchTypesInput": { - "type": "structure", - "required": ["domainIdentifier", "searchScope", "managed"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "searchScope": { - "shape": "TypesSearchScope" - }, - "searchText": { - "shape": "SearchText" - }, - "searchIn": { - "shape": "SearchInList" - }, - "filters": { - "shape": "FilterClause" - }, - "includeDefaultFacets": { - "shape": "Boolean", - "internalonly": true - }, - "aggregations": { - "shape": "AggregationList", - "internalonly": true - }, - "sort": { - "shape": "SearchSort" - }, - "managed": { - "shape": "Boolean" - }, - "modelFormat": { - "shape": "ModelFormat", - "internalonly": true - } - } - }, - "SearchTypesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "SearchTypesResultItems" - }, - "nextToken": { - "shape": "PaginationToken" - }, - "totalMatchCount": { - "shape": "Integer" - }, - "aggregations": { - "shape": "AggregationOutputList", - "internalonly": true - } - } - }, - "SearchTypesResultItem": { - "type": "structure", - "members": { - "assetTypeItem": { - "shape": "AssetTypeItem" - }, - "formTypeItem": { - "shape": "FormTypeData" - }, - "lineageNodeTypeItem": { - "shape": "LineageNodeTypeItem" - } - }, - "union": true - }, - "SearchTypesResultItems": { - "type": "list", - "member": { - "shape": "SearchTypesResultItem" - } - }, - "SearchUserProfilesInput": { - "type": "structure", - "required": ["domainIdentifier", "userType"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "userType": { - "shape": "UserSearchType" - }, - "searchText": { - "shape": "UserSearchText" - }, - "maxResults": { - "shape": "MaxResults" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "SearchUserProfilesOutput": { - "type": "structure", - "members": { - "items": { - "shape": "UserProfileSummaries" - }, - "nextToken": { - "shape": "PaginationToken" - } - } - }, - "SecretAccessKey": { - "type": "string", - "sensitive": true - }, - "SecurityGroupIdList": { - "type": "list", - "member": { - "shape": "SecurityGroupIdListMemberString" - }, - "max": 50, - "min": 0 - }, - "SecurityGroupIdListMemberString": { - "type": "string", - "max": 255, - "min": 1 - }, - "SelfGrantSetting": { - "type": "string", - "enum": ["ENABLED", "DISABLED"] - }, - "SelfGrantStatus": { - "type": "string", - "enum": [ - "GRANT_PENDING", - "REVOKE_PENDING", - "GRANT_IN_PROGRESS", - "REVOKE_IN_PROGRESS", - "GRANTED", - "GRANT_FAILED", - "REVOKE_FAILED" - ] - }, - "SelfGrantStatusDetail": { - "type": "structure", - "required": ["databaseName", "status"], - "members": { - "databaseName": { - "shape": "SelfGrantStatusDetailDatabaseNameString" - }, - "schemaName": { - "shape": "SelfGrantStatusDetailSchemaNameString" - }, - "status": { - "shape": "SelfGrantStatus" - }, - "failureCause": { - "shape": "String" - } - } - }, - "SelfGrantStatusDetailDatabaseNameString": { - "type": "string", - "max": 128, - "min": 1 - }, - "SelfGrantStatusDetailSchemaNameString": { - "type": "string", - "max": 128, - "min": 1 - }, - "SelfGrantStatusDetails": { - "type": "list", - "member": { - "shape": "SelfGrantStatusDetail" - } - }, - "SelfGrantStatusOutput": { - "type": "structure", - "members": { - "glueSelfGrantStatus": { - "shape": "GlueSelfGrantStatusOutput" - }, - "redshiftSelfGrantStatus": { - "shape": "RedshiftSelfGrantStatusOutput" - } - }, - "union": true - }, - "ServiceLinkConfigurationInput": { - "type": "structure", - "members": { - "snowflake": { - "shape": "SnowflakeServiceLinkConfigurationInput" - }, - "databricks": { - "shape": "DatabricksServiceLinkConfigurationInput" - } - }, - "internalonly": true, - "union": true - }, - "ServiceLinkConfigurationOutput": { - "type": "structure", - "members": { - "snowflake": { - "shape": "SnowflakeServiceLinkConfigurationOutput" - }, - "databricks": { - "shape": "DatabricksServiceLinkConfigurationOutput" - } - }, - "internalonly": true, - "union": true - }, - "ServiceLinkDelegation": { - "type": "structure", - "required": ["projectId", "resources"], - "members": { - "projectId": { - "shape": "ProjectId" - }, - "resources": { - "shape": "ResourcePaths" - } - }, - "internalonly": true - }, - "ServiceLinkDelegations": { - "type": "list", - "member": { - "shape": "ServiceLinkDelegation" - }, - "max": 100, - "min": 1 - }, - "ServiceLinkError": { - "type": "structure", - "members": { - "message": { - "shape": "String" - } - }, - "internalonly": true - }, - "ServiceLinkId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "ServiceLinkIdentityMapping": { - "type": "structure", - "required": ["usernameAttribute"], - "members": { - "usernameAttribute": { - "shape": "String" - } - }, - "internalonly": true - }, - "ServiceLinkName": { - "type": "string", - "internalonly": true, - "max": 64, - "min": 1, - "pattern": "[\\w -]+", - "sensitive": true - }, - "ServiceLinkStatus": { - "type": "string", - "enum": ["CREATING", "CREATE_FAILED", "UPDATING", "UPDATE_FAILED", "READY"], - "internalonly": true - }, - "ServiceLinkSummaries": { - "type": "list", - "member": { - "shape": "ServiceLinkSummary" - }, - "internalonly": true - }, - "ServiceLinkSummary": { - "type": "structure", - "required": [ - "id", - "domainId", - "owningProjectId", - "domainUnitId", - "createdAt", - "updatedAt", - "status", - "type", - "name" - ], - "members": { - "id": { - "shape": "ServiceLinkId" - }, - "domainId": { - "shape": "DomainId" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "status": { - "shape": "ServiceLinkStatus" - }, - "type": { - "shape": "ServiceLinkType" - }, - "name": { - "shape": "ServiceLinkName" - } - }, - "internalonly": true - }, - "ServiceLinkType": { - "type": "string", - "enum": ["SNOWFLAKE", "DATABRICKS"], - "internalonly": true - }, - "ServiceQuotaExceededException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 402, - "senderFault": true - }, - "exception": true - }, - "ServiceRole": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws[^:]*:iam::\\d{12}:(role|role/service-role)/[\\w+=,.@-]*" - }, - "SessionToken": { - "type": "string", - "sensitive": true - }, - "SetCookies": { - "type": "list", - "member": { - "shape": "Cookie" - } - }, - "SharedResource": { - "type": "structure", - "members": { - "sapResources": { - "shape": "SAPResource" - } - }, - "internalonly": true, - "union": true - }, - "SharedResources": { - "type": "list", - "member": { - "shape": "SharedResource" - }, - "internalonly": true - }, - "ShortDescription": { - "type": "string", - "max": 1024, - "min": 0, - "sensitive": true - }, - "SingleSignOn": { - "type": "structure", - "members": { - "type": { - "shape": "AuthType" - }, - "userAssignment": { - "shape": "UserAssignment" - }, - "idcInstanceArn": { - "shape": "SingleSignOnIdcInstanceArnString" - }, - "ssoUrl": { - "shape": "String", - "internalonly": true - }, - "idcApplicationArn": { - "shape": "String", - "internalonly": true - } - } - }, - "SingleSignOnIdcInstanceArnString": { - "type": "string", - "pattern": ".*arn:(aws|aws-us-gov|aws-cn|aws-iso|aws-iso-b):sso:::instance/(sso)?ins-[a-zA-Z0-9-.]{16}.*" - }, - "Smithy": { - "type": "string", - "max": 100000, - "min": 1 - }, - "SnowflakePropertiesInput": { - "type": "structure", - "required": ["snowflakeRole", "identityMapping"], - "members": { - "connectivityProperties": { - "shape": "ConnectivityProperties" - }, - "snowflakeRole": { - "shape": "SnowflakeRole" - }, - "identityMapping": { - "shape": "IdentityMapping" - }, - "policySync": { - "shape": "PolicySyncInput" - }, - "lineageSync": { - "shape": "LineageSyncInput" - } - } - }, - "SnowflakePropertiesOutput": { - "type": "structure", - "required": ["snowflakeRole", "identityMapping", "policySync", "lineageSync", "status"], - "members": { - "snowflakeRole": { - "shape": "SnowflakeRole" - }, - "identityMapping": { - "shape": "IdentityMapping" - }, - "policySync": { - "shape": "PolicySyncOutput" - }, - "lineageSync": { - "shape": "LineageSyncOutput" - }, - "status": { - "shape": "ConnectionStatus" - }, - "errorMessage": { - "shape": "String" - }, - "provisionedResources": { - "shape": "ProvisionedResources" - } - } - }, - "SnowflakePropertiesPatch": { - "type": "structure", - "members": { - "connectivityPropertiesPatch": { - "shape": "ConnectivityPropertiesPatch" - }, - "snowflakeRole": { - "shape": "SnowflakeRole" - }, - "policySync": { - "shape": "PolicySyncInput" - }, - "lineageSync": { - "shape": "LineageSyncInput" - } - } - }, - "SnowflakeRole": { - "type": "string", - "pattern": ".*[a-zA-Z0-9_$]{1,255}" - }, - "SnowflakeRunConfigurationInput": { - "type": "structure", - "required": ["relationalFilterConfigurations"], - "members": { - "relationalFilterConfigurations": { - "shape": "RelationalFilterConfigurations" - } - } - }, - "SnowflakeRunConfigurationOutput": { - "type": "structure", - "required": ["relationalFilterConfigurations"], - "members": { - "relationalFilterConfigurations": { - "shape": "RelationalFilterConfigurations" - } - } - }, - "SnowflakeServiceLinkConfigurationInput": { - "type": "structure", - "required": ["accountId", "roleName", "warehouseName", "credentials"], - "members": { - "accountId": { - "shape": "String" - }, - "roleName": { - "shape": "String" - }, - "warehouseName": { - "shape": "String" - }, - "credentials": { - "shape": "UsernamePasswordCredentials" - } - }, - "internalonly": true - }, - "SnowflakeServiceLinkConfigurationOutput": { - "type": "structure", - "required": ["accountId", "roleName", "warehouseName"], - "members": { - "accountId": { - "shape": "String" - }, - "roleName": { - "shape": "String" - }, - "warehouseName": { - "shape": "String" - } - }, - "internalonly": true - }, - "SortFieldAccountPool": { - "type": "string", - "enum": ["NAME"] - }, - "SortFieldConnection": { - "type": "string", - "enum": ["NAME"] - }, - "SortFieldProject": { - "type": "string", - "enum": ["NAME"] - }, - "SortFieldProjectMembershipRequest": { - "type": "string", - "enum": ["REQUESTER_ID", "REQUESTED_AT", "LAST_UPDATED_AT"] - }, - "SortKey": { - "type": "string", - "enum": ["CREATED_AT", "UPDATED_AT"] - }, - "SortOrder": { - "type": "string", - "enum": ["ASCENDING", "DESCENDING"] - }, - "SparkEmrPropertiesInput": { - "type": "structure", - "members": { - "computeArn": { - "shape": "SparkEmrPropertiesInputComputeArnString" - }, - "instanceProfileArn": { - "shape": "ServiceRole" - }, - "javaVirtualEnv": { - "shape": "SparkEmrPropertiesInputJavaVirtualEnvString" - }, - "logUri": { - "shape": "SparkEmrPropertiesInputLogUriString" - }, - "pythonVirtualEnv": { - "shape": "SparkEmrPropertiesInputPythonVirtualEnvString" - }, - "runtimeRole": { - "shape": "ServiceRole" - }, - "trustedCertificatesS3Uri": { - "shape": "SparkEmrPropertiesInputTrustedCertificatesS3UriString" - }, - "managedEndpointArn": { - "shape": "SparkEmrPropertiesInputManagedEndpointArnString" - } - } - }, - "SparkEmrPropertiesInputComputeArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:(elasticmapreduce|emr-serverless|emr-containers):.*" - }, - "SparkEmrPropertiesInputJavaVirtualEnvString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "SparkEmrPropertiesInputLogUriString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "s3://.+" - }, - "SparkEmrPropertiesInputManagedEndpointArnString": { - "type": "string", - "max": 2048, - "min": 0 - }, - "SparkEmrPropertiesInputPythonVirtualEnvString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "SparkEmrPropertiesInputTrustedCertificatesS3UriString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "s3://.+" - }, - "SparkEmrPropertiesOutput": { - "type": "structure", - "members": { - "computeArn": { - "shape": "String" - }, - "credentials": { - "shape": "UsernamePassword" - }, - "credentialsExpiration": { - "shape": "SyntheticTimestamp_date_time" - }, - "governanceType": { - "shape": "GovernanceType" - }, - "instanceProfileArn": { - "shape": "String" - }, - "javaVirtualEnv": { - "shape": "String" - }, - "livyEndpoint": { - "shape": "String" - }, - "logUri": { - "shape": "String" - }, - "pythonVirtualEnv": { - "shape": "String" - }, - "runtimeRole": { - "shape": "String" - }, - "trustedCertificatesS3Uri": { - "shape": "String" - }, - "certificateData": { - "shape": "String", - "internalonly": true - }, - "managedEndpointArn": { - "shape": "SparkEmrPropertiesOutputManagedEndpointArnString" - }, - "managedEndpointCredentials": { - "shape": "ManagedEndpointCredentials" - } - } - }, - "SparkEmrPropertiesOutputManagedEndpointArnString": { - "type": "string", - "max": 2048, - "min": 0 - }, - "SparkEmrPropertiesPatch": { - "type": "structure", - "members": { - "computeArn": { - "shape": "SparkEmrPropertiesPatchComputeArnString" - }, - "instanceProfileArn": { - "shape": "ServiceRole" - }, - "javaVirtualEnv": { - "shape": "SparkEmrPropertiesPatchJavaVirtualEnvString" - }, - "logUri": { - "shape": "SparkEmrPropertiesPatchLogUriString" - }, - "pythonVirtualEnv": { - "shape": "SparkEmrPropertiesPatchPythonVirtualEnvString" - }, - "runtimeRole": { - "shape": "ServiceRole" - }, - "trustedCertificatesS3Uri": { - "shape": "SparkEmrPropertiesPatchTrustedCertificatesS3UriString" - }, - "managedEndpointArn": { - "shape": "SparkEmrPropertiesPatchManagedEndpointArnString" - } - } - }, - "SparkEmrPropertiesPatchComputeArnString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "arn:aws(-(cn|us-gov|iso(-[bef])?))?:(elasticmapreduce|emr-serverless|emr-containers):.*" - }, - "SparkEmrPropertiesPatchJavaVirtualEnvString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "SparkEmrPropertiesPatchLogUriString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "s3://.+" - }, - "SparkEmrPropertiesPatchManagedEndpointArnString": { - "type": "string", - "max": 2048, - "min": 0 - }, - "SparkEmrPropertiesPatchPythonVirtualEnvString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "SparkEmrPropertiesPatchTrustedCertificatesS3UriString": { - "type": "string", - "max": 2048, - "min": 0, - "pattern": "s3://.+" - }, - "SparkGlueArgs": { - "type": "structure", - "members": { - "connection": { - "shape": "ConnectionId" - } - } - }, - "SparkGluePropertiesInput": { - "type": "structure", - "members": { - "additionalArgs": { - "shape": "SparkGlueArgs" - }, - "glueConnectionName": { - "shape": "GlueConnectionName" - }, - "glueVersion": { - "shape": "SparkGluePropertiesInputGlueVersionString" - }, - "idleTimeout": { - "shape": "SparkGluePropertiesInputIdleTimeoutInteger" - }, - "javaVirtualEnv": { - "shape": "SparkGluePropertiesInputJavaVirtualEnvString" - }, - "numberOfWorkers": { - "shape": "SparkGluePropertiesInputNumberOfWorkersInteger" - }, - "pythonVirtualEnv": { - "shape": "SparkGluePropertiesInputPythonVirtualEnvString" - }, - "workerType": { - "shape": "SparkGluePropertiesInputWorkerTypeString" - } - } - }, - "SparkGluePropertiesInputGlueVersionString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "\\w+\\.\\w+" - }, - "SparkGluePropertiesInputIdleTimeoutInteger": { - "type": "integer", - "box": true, - "max": 3000, - "min": 1 - }, - "SparkGluePropertiesInputJavaVirtualEnvString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "SparkGluePropertiesInputNumberOfWorkersInteger": { - "type": "integer", - "box": true, - "max": 1000, - "min": 1 - }, - "SparkGluePropertiesInputPythonVirtualEnvString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\S]*" - }, - "SparkGluePropertiesInputWorkerTypeString": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[G|Z].*" - }, - "SparkGluePropertiesOutput": { - "type": "structure", - "members": { - "additionalArgs": { - "shape": "SparkGlueArgs" - }, - "glueConnectionName": { - "shape": "String" - }, - "glueVersion": { - "shape": "String" - }, - "idleTimeout": { - "shape": "Integer" - }, - "javaVirtualEnv": { - "shape": "String" - }, - "numberOfWorkers": { - "shape": "Integer" - }, - "pythonVirtualEnv": { - "shape": "String" - }, - "workerType": { - "shape": "String" - } - } - }, - "SsoLoginRequest": { - "type": "structure", - "required": ["domainId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "additionalState": { - "shape": "String" - }, - "state": { - "shape": "String" - }, - "code": { - "shape": "String" - }, - "redirectToLocalhost": { - "shape": "Boolean" - } - } - }, - "SsoLoginResponse": { - "type": "structure", - "members": { - "cookieStrings": { - "shape": "SetCookies", - "location": "header", - "locationName": "Set-Cookie" - }, - "redirectUrl": { - "shape": "String" - }, - "additionalState": { - "shape": "String" - }, - "jwtToken": { - "shape": "String" - }, - "csrfToken": { - "shape": "String" - }, - "credentials": { - "shape": "AwsCredentials" - }, - "userProfile": { - "shape": "UserProfile" - } - } - }, - "SsoLogoutRequest": { - "type": "structure", - "required": ["domainId"], - "members": { - "jwtToken": { - "shape": "String", - "location": "header", - "locationName": "jwt-token" - }, - "csrfToken": { - "shape": "String", - "location": "header", - "locationName": "x-csrf-token" - }, - "domainId": { - "shape": "DomainId" - } - } - }, - "SsoLogoutResponse": { - "type": "structure", - "members": { - "cookieStrings": { - "shape": "SetCookies", - "location": "header", - "locationName": "Set-Cookie" - }, - "CacheControl": { - "shape": "String", - "location": "header", - "locationName": "Cache-Control" - } - } - }, - "SsoUserProfileDetails": { - "type": "structure", - "members": { - "username": { - "shape": "UserProfileName" - }, - "firstName": { - "shape": "FirstName" - }, - "lastName": { - "shape": "LastName" - }, - "email": { - "shape": "String", - "internalonly": true - }, - "userId": { - "shape": "String", - "internalonly": true - } - } - }, - "StartAccountBootstrapActionInput": { - "type": "structure", - "required": ["domainIdentifier", "provisioningRoleArn", "bootstrapConfiguration", "action"], - "members": { - "domainIdentifier": { - "shape": "DomainId" - }, - "provisioningRoleArn": { - "shape": "RoleArn" - }, - "bootstrapConfiguration": { - "shape": "BootstrapConfigurationList" - }, - "action": { - "shape": "Action" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "StartAccountBootstrapActionOutput": { - "type": "structure", - "members": {} - }, - "StartDataSourceRunInput": { - "type": "structure", - "required": ["domainIdentifier", "dataSourceIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "dataSourceIdentifier": { - "shape": "DataSourceId", - "location": "uri", - "locationName": "dataSourceIdentifier" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "StartDataSourceRunOutput": { - "type": "structure", - "required": ["domainId", "dataSourceId", "id", "projectId", "status", "type", "createdAt", "updatedAt"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "dataSourceId": { - "shape": "DataSourceId" - }, - "id": { - "shape": "DataSourceRunId" - }, - "projectId": { - "shape": "ProjectId" - }, - "status": { - "shape": "DataSourceRunStatus" - }, - "type": { - "shape": "DataSourceRunType" - }, - "dataSourceConfigurationSnapshot": { - "shape": "String" - }, - "runStatisticsForAssets": { - "shape": "RunStatisticsForAssets" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - }, - "startedAt": { - "shape": "DateTime" - }, - "stoppedAt": { - "shape": "DateTime" - } - } - }, - "StartMetadataGenerationRunInput": { - "type": "structure", - "required": ["domainIdentifier", "target", "owningProjectIdentifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "type": { - "shape": "MetadataGenerationRunType" - }, - "types": { - "shape": "MetadataGenerationRunTypes", - "internalonly": true - }, - "target": { - "shape": "MetadataGenerationRunTarget" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - }, - "owningProjectIdentifier": { - "shape": "ProjectId" - } - } - }, - "StartMetadataGenerationRunOutput": { - "type": "structure", - "required": ["domainId", "id"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "MetadataGenerationRunIdentifier" - }, - "status": { - "shape": "MetadataGenerationRunStatus" - }, - "type": { - "shape": "MetadataGenerationRunType" - }, - "types": { - "shape": "MetadataGenerationRunTypes", - "internalonly": true - }, - "createdAt": { - "shape": "CreatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "owningProjectId": { - "shape": "ProjectId" - } - } - }, - "Status": { - "type": "string", - "enum": ["ENABLED", "DISABLED"] - }, - "String": { - "type": "string" - }, - "StringList": { - "type": "list", - "member": { - "shape": "String" - } - }, - "SubnetId": { - "type": "string", - "max": 32, - "min": 0, - "pattern": "subnet-[a-z0-9]+" - }, - "SubnetIdList": { - "type": "list", - "member": { - "shape": "SubnetId" - }, - "max": 50, - "min": 1 - }, - "SubscribedAsset": { - "type": "structure", - "required": ["assetId", "assetRevision", "status"], - "members": { - "assetId": { - "shape": "AssetId" - }, - "assetRevision": { - "shape": "Revision" - }, - "status": { - "shape": "SubscriptionGrantStatus" - }, - "targetName": { - "shape": "String" - }, - "failureCause": { - "shape": "FailureCause" - }, - "grantedTimestamp": { - "shape": "Timestamp" - }, - "failureTimestamp": { - "shape": "Timestamp" - }, - "assetScope": { - "shape": "AssetScope" - }, - "outputProperties": { - "shape": "SubscriptionGrantOutputProperties", - "internalonly": true - }, - "permissions": { - "shape": "Permissions" - } - } - }, - "SubscribedAssetListing": { - "type": "structure", - "members": { - "entityId": { - "shape": "AssetId" - }, - "entityRevision": { - "shape": "Revision" - }, - "entityType": { - "shape": "TypeName" - }, - "forms": { - "shape": "Forms" - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - }, - "assetScope": { - "shape": "AssetScope" - }, - "columnNames": { - "shape": "ColumnNames", - "internalonly": true - }, - "rowFilterExpression": { - "shape": "String", - "internalonly": true - }, - "permissions": { - "shape": "Permissions" - } - } - }, - "SubscribedAssets": { - "type": "list", - "member": { - "shape": "SubscribedAsset" - } - }, - "SubscribedGroup": { - "type": "structure", - "members": { - "id": { - "shape": "GroupProfileId" - }, - "name": { - "shape": "GroupProfileName" - } - } - }, - "SubscribedGroupInput": { - "type": "structure", - "members": { - "identifier": { - "shape": "GroupProfileId" - } - } - }, - "SubscribedListing": { - "type": "structure", - "required": ["id", "name", "description", "item", "ownerProjectId"], - "members": { - "id": { - "shape": "ListingId" - }, - "revision": { - "shape": "Revision" - }, - "name": { - "shape": "ListingName" - }, - "description": { - "shape": "Description" - }, - "item": { - "shape": "SubscribedListingItem" - }, - "ownerProjectId": { - "shape": "ProjectId" - }, - "ownerProjectName": { - "shape": "String" - } - } - }, - "SubscribedListingInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "ListingId" - }, - "subscriptionSettings": { - "shape": "SubscriptionSettings" - } - } - }, - "SubscribedListingInputs": { - "type": "list", - "member": { - "shape": "SubscribedListingInput" - }, - "max": 1, - "min": 1 - }, - "SubscribedListingItem": { - "type": "structure", - "members": { - "assetListing": { - "shape": "SubscribedAssetListing" - }, - "productListing": { - "shape": "SubscribedProductListing" - } - }, - "union": true - }, - "SubscribedPrincipal": { - "type": "structure", - "members": { - "project": { - "shape": "SubscribedProject" - }, - "user": { - "shape": "SubscribedUser" - }, - "group": { - "shape": "SubscribedGroup" - } - }, - "union": true - }, - "SubscribedPrincipalInput": { - "type": "structure", - "members": { - "project": { - "shape": "SubscribedProjectInput" - }, - "user": { - "shape": "SubscribedUserInput" - }, - "group": { - "shape": "SubscribedGroupInput" - } - }, - "union": true - }, - "SubscribedPrincipalInputs": { - "type": "list", - "member": { - "shape": "SubscribedPrincipalInput" - }, - "max": 1, - "min": 1 - }, - "SubscribedProductListing": { - "type": "structure", - "members": { - "entityId": { - "shape": "AssetId" - }, - "entityRevision": { - "shape": "Revision" - }, - "glossaryTerms": { - "shape": "DetailedGlossaryTerms" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "assetListings": { - "shape": "AssetInDataProductListingItems" - } - } - }, - "SubscribedProject": { - "type": "structure", - "members": { - "id": { - "shape": "ProjectId" - }, - "name": { - "shape": "ProjectName" - } - } - }, - "SubscribedProjectInput": { - "type": "structure", - "members": { - "identifier": { - "shape": "ProjectId" - } - } - }, - "SubscribedUser": { - "type": "structure", - "members": { - "id": { - "shape": "UserProfileId" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "SubscribedUserInput": { - "type": "structure", - "members": { - "identifier": { - "shape": "UserProfileId" - } - } - }, - "SubscriptionEligibilityStatus": { - "type": "string", - "enum": ["SUBSCRIBE_AND_GRANT", "SUBSCRIBE_ONLY", "NONE"] - }, - "SubscriptionGrantId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "SubscriptionGrantOutputProperties": { - "type": "map", - "key": { - "shape": "String" - }, - "value": { - "shape": "String" - } - }, - "SubscriptionGrantOverallStatus": { - "type": "string", - "enum": [ - "PENDING", - "IN_PROGRESS", - "GRANT_FAILED", - "REVOKE_FAILED", - "GRANT_AND_REVOKE_FAILED", - "COMPLETED", - "INACCESSIBLE" - ] - }, - "SubscriptionGrantStatus": { - "type": "string", - "enum": [ - "GRANT_PENDING", - "REVOKE_PENDING", - "GRANT_IN_PROGRESS", - "REVOKE_IN_PROGRESS", - "GRANTED", - "REVOKED", - "GRANT_FAILED", - "REVOKE_FAILED" - ] - }, - "SubscriptionGrantSummary": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "createdAt", - "updatedAt", - "subscriptionTargetId", - "grantedEntity", - "status" - ], - "members": { - "id": { - "shape": "SubscriptionGrantId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "environmentId": { - "shape": "EnvironmentId", - "internalonly": true - }, - "subscriptionTargetId": { - "shape": "SubscriptionTargetId" - }, - "grantedEntity": { - "shape": "GrantedEntity" - }, - "status": { - "shape": "SubscriptionGrantOverallStatus" - }, - "assets": { - "shape": "SubscribedAssets" - }, - "subscriptionId": { - "shape": "SubscriptionId", - "deprecated": true, - "deprecatedMessage": "Multiple subscriptions can exist for a single grant" - } - } - }, - "SubscriptionGrants": { - "type": "list", - "member": { - "shape": "SubscriptionGrantSummary" - } - }, - "SubscriptionId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "SubscriptionRequestId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "SubscriptionRequestStatus": { - "type": "string", - "enum": ["PENDING", "ACCEPTED", "REJECTED"] - }, - "SubscriptionRequestSummary": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "requestReason", - "subscribedPrincipals", - "subscribedListings" - ], - "members": { - "id": { - "shape": "SubscriptionRequestId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionRequestStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "requestReason": { - "shape": "RequestReason" - }, - "subscribedPrincipals": { - "shape": "SubscriptionRequestSummarySubscribedPrincipalsList" - }, - "subscribedListings": { - "shape": "SubscriptionRequestSummarySubscribedListingsList" - }, - "reviewerId": { - "shape": "String" - }, - "decisionComment": { - "shape": "DecisionComment" - }, - "existingSubscriptionId": { - "shape": "SubscriptionId" - }, - "metadataFormsSummary": { - "shape": "MetadataFormsSummary" - } - } - }, - "SubscriptionRequestSummarySubscribedListingsList": { - "type": "list", - "member": { - "shape": "SubscribedListing" - }, - "max": 1, - "min": 1 - }, - "SubscriptionRequestSummarySubscribedPrincipalsList": { - "type": "list", - "member": { - "shape": "SubscribedPrincipal" - }, - "max": 1, - "min": 1 - }, - "SubscriptionRequests": { - "type": "list", - "member": { - "shape": "SubscriptionRequestSummary" - } - }, - "SubscriptionSettings": { - "type": "structure", - "members": { - "filters": { - "shape": "AcceptedAssetScopes" - }, - "permissions": { - "shape": "AssetPermissions" - } - } - }, - "SubscriptionStatus": { - "type": "string", - "enum": ["APPROVED", "REVOKED", "CANCELLED"] - }, - "SubscriptionSummary": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "subscribedPrincipal", - "subscribedListing" - ], - "members": { - "id": { - "shape": "SubscriptionId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "subscribedPrincipal": { - "shape": "SubscribedPrincipal" - }, - "subscribedListing": { - "shape": "SubscribedListing" - }, - "subscriptionRequestId": { - "shape": "SubscriptionRequestId" - }, - "retainPermissions": { - "shape": "Boolean" - }, - "pushedSubscription": { - "shape": "Boolean" - }, - "expirationTimestamp": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "SubscriptionTargetForm": { - "type": "structure", - "required": ["formName", "content"], - "members": { - "formName": { - "shape": "FormName" - }, - "content": { - "shape": "String" - } - } - }, - "SubscriptionTargetForms": { - "type": "list", - "member": { - "shape": "SubscriptionTargetForm" - } - }, - "SubscriptionTargetId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "SubscriptionTargetName": { - "type": "string", - "max": 256, - "min": 1, - "sensitive": true - }, - "SubscriptionTargetSummary": { - "type": "structure", - "required": [ - "id", - "authorizedPrincipals", - "domainId", - "projectId", - "environmentId", - "name", - "type", - "createdBy", - "createdAt", - "applicableAssetTypes", - "subscriptionTargetConfig", - "provider" - ], - "members": { - "id": { - "shape": "SubscriptionTargetId" - }, - "authorizedPrincipals": { - "shape": "AuthorizedPrincipalIdentifiers" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "SubscriptionTargetName" - }, - "type": { - "shape": "String" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "manageAccessRole": { - "shape": "IamRoleArn" - }, - "applicableAssetTypes": { - "shape": "ApplicableAssetTypes" - }, - "subscriptionTargetConfig": { - "shape": "SubscriptionTargetForms" - }, - "provider": { - "shape": "String" - }, - "timeoutMinutes": { - "shape": "SubscriptionTargetSummaryTimeoutMinutesInteger" - } - } - }, - "SubscriptionTargetSummaryTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "min": 1 - }, - "SubscriptionTargets": { - "type": "list", - "member": { - "shape": "SubscriptionTargetSummary" - } - }, - "Subscriptions": { - "type": "list", - "member": { - "shape": "SubscriptionSummary" - } - }, - "SupportedDomainVersions": { - "type": "list", - "member": { - "shape": "DomainVersion" - } - }, - "SupportedDomainVersionsList": { - "type": "list", - "member": { - "shape": "DataZoneDomainVersion" - } - }, - "SyntheticTimestamp_date_time": { - "type": "timestamp", - "timestampFormat": "iso8601" - }, - "TagKey": { - "type": "string", - "max": 128, - "min": 1, - "pattern": "[\\w \\.:/=+@-]+" - }, - "TagKeyList": { - "type": "list", - "member": { - "shape": "TagKey" - } - }, - "TagResourceRequest": { - "type": "structure", - "required": ["resourceArn", "tags"], - "members": { - "resourceArn": { - "shape": "String", - "location": "uri", - "locationName": "resourceArn" - }, - "tags": { - "shape": "Tags" - } - } - }, - "TagResourceResponse": { - "type": "structure", - "members": {} - }, - "TagValue": { - "type": "string", - "max": 256, - "min": 0, - "pattern": "[\\w \\.:/=+@-]*" - }, - "Tags": { - "type": "map", - "key": { - "shape": "TagKey" - }, - "value": { - "shape": "TagValue" - } - }, - "TargetEntityType": { - "type": "string", - "enum": [ - "DomainUnit", - "EnvironmentBlueprintConfiguration", - "EnvironmentProfile", - "DOMAIN_UNIT", - "ENVIRONMENT_BLUEPRINT_CONFIGURATION", - "ENVIRONMENT_PROFILE", - "ASSET_TYPE", - "GLOSSARY" - ] - }, - "TaskId": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "TaskStatus": { - "type": "string", - "enum": ["ACTIVE", "INACTIVE"] - }, - "TermRelations": { - "type": "structure", - "members": { - "isA": { - "shape": "TermRelationsIsAList" - }, - "classifies": { - "shape": "TermRelationsClassifiesList" - } - } - }, - "TermRelationsClassifiesList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 10, - "min": 1 - }, - "TermRelationsIsAList": { - "type": "list", - "member": { - "shape": "GlossaryTermId" - }, - "max": 10, - "min": 1 - }, - "TextMatchItem": { - "type": "structure", - "members": { - "attribute": { - "shape": "Attribute" - }, - "text": { - "shape": "String" - }, - "matchOffsets": { - "shape": "MatchOffsets" - } - } - }, - "TextMatches": { - "type": "list", - "member": { - "shape": "TextMatchItem" - } - }, - "ThrottlingException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 429, - "senderFault": true - }, - "exception": true, - "retryable": { - "throttling": false - } - }, - "TimeSeriesDataPointFormInput": { - "type": "structure", - "required": ["formName", "typeIdentifier", "timestamp", "content"], - "members": { - "formName": { - "shape": "TimeSeriesFormName" - }, - "typeIdentifier": { - "shape": "FormTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "timestamp": { - "shape": "Timestamp" - }, - "content": { - "shape": "TimeSeriesDataPointFormInputContentString" - } - }, - "sensitive": true - }, - "TimeSeriesDataPointFormInputContentString": { - "type": "string", - "max": 500000, - "min": 0 - }, - "TimeSeriesDataPointFormInputList": { - "type": "list", - "member": { - "shape": "TimeSeriesDataPointFormInput" - }, - "sensitive": true - }, - "TimeSeriesDataPointFormOutput": { - "type": "structure", - "required": ["formName", "typeIdentifier", "timestamp"], - "members": { - "formName": { - "shape": "TimeSeriesFormName" - }, - "typeIdentifier": { - "shape": "FormTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "timestamp": { - "shape": "Timestamp" - }, - "content": { - "shape": "TimeSeriesDataPointFormOutputContentString" - }, - "id": { - "shape": "DataPointIdentifier" - } - } - }, - "TimeSeriesDataPointFormOutputContentString": { - "type": "string", - "max": 500000, - "min": 0 - }, - "TimeSeriesDataPointFormOutputList": { - "type": "list", - "member": { - "shape": "TimeSeriesDataPointFormOutput" - } - }, - "TimeSeriesDataPointIdentifier": { - "type": "string", - "pattern": "[a-zA-Z0-9_-]{1,36}" - }, - "TimeSeriesDataPointSummaryFormOutput": { - "type": "structure", - "required": ["formName", "typeIdentifier", "timestamp"], - "members": { - "formName": { - "shape": "TimeSeriesFormName" - }, - "typeIdentifier": { - "shape": "FormTypeIdentifier" - }, - "typeRevision": { - "shape": "Revision" - }, - "timestamp": { - "shape": "Timestamp" - }, - "contentSummary": { - "shape": "TimeSeriesDataPointSummaryFormOutputContentSummaryString" - }, - "id": { - "shape": "DataPointIdentifier" - } - } - }, - "TimeSeriesDataPointSummaryFormOutputContentSummaryString": { - "type": "string", - "max": 20000, - "min": 0 - }, - "TimeSeriesDataPointSummaryFormOutputList": { - "type": "list", - "member": { - "shape": "TimeSeriesDataPointSummaryFormOutput" - } - }, - "TimeSeriesEntityType": { - "type": "string", - "enum": ["ASSET", "LISTING", "PROJECT"] - }, - "TimeSeriesFormName": { - "type": "string", - "max": 128, - "min": 1 - }, - "Timestamp": { - "type": "timestamp" - }, - "Timezone": { - "type": "string", - "enum": [ - "UTC", - "AFRICA_JOHANNESBURG", - "AMERICA_MONTREAL", - "AMERICA_SAO_PAULO", - "ASIA_BAHRAIN", - "ASIA_BANGKOK", - "ASIA_CALCUTTA", - "ASIA_DUBAI", - "ASIA_HONG_KONG", - "ASIA_JAKARTA", - "ASIA_KUALA_LUMPUR", - "ASIA_SEOUL", - "ASIA_SHANGHAI", - "ASIA_SINGAPORE", - "ASIA_TAIPEI", - "ASIA_TOKYO", - "AUSTRALIA_MELBOURNE", - "AUSTRALIA_SYDNEY", - "CANADA_CENTRAL", - "CET", - "CST6CDT", - "ETC_GMT", - "ETC_GMT0", - "ETC_GMT_ADD_0", - "ETC_GMT_ADD_1", - "ETC_GMT_ADD_10", - "ETC_GMT_ADD_11", - "ETC_GMT_ADD_12", - "ETC_GMT_ADD_2", - "ETC_GMT_ADD_3", - "ETC_GMT_ADD_4", - "ETC_GMT_ADD_5", - "ETC_GMT_ADD_6", - "ETC_GMT_ADD_7", - "ETC_GMT_ADD_8", - "ETC_GMT_ADD_9", - "ETC_GMT_NEG_0", - "ETC_GMT_NEG_1", - "ETC_GMT_NEG_10", - "ETC_GMT_NEG_11", - "ETC_GMT_NEG_12", - "ETC_GMT_NEG_13", - "ETC_GMT_NEG_14", - "ETC_GMT_NEG_2", - "ETC_GMT_NEG_3", - "ETC_GMT_NEG_4", - "ETC_GMT_NEG_5", - "ETC_GMT_NEG_6", - "ETC_GMT_NEG_7", - "ETC_GMT_NEG_8", - "ETC_GMT_NEG_9", - "EUROPE_DUBLIN", - "EUROPE_LONDON", - "EUROPE_PARIS", - "EUROPE_STOCKHOLM", - "EUROPE_ZURICH", - "ISRAEL", - "MEXICO_GENERAL", - "MST7MDT", - "PACIFIC_AUCKLAND", - "US_CENTRAL", - "US_EASTERN", - "US_MOUNTAIN", - "US_PACIFIC" - ] - }, - "Title": { - "type": "string", - "max": 1000, - "min": 0, - "sensitive": true - }, - "TokenUrlParametersMap": { - "type": "map", - "key": { - "shape": "TokenUrlParametersMapKeyString" - }, - "value": { - "shape": "TokenUrlParametersMapValueString" - } - }, - "TokenUrlParametersMapKeyString": { - "type": "string", - "max": 128, - "min": 1 - }, - "TokenUrlParametersMapValueString": { - "type": "string", - "max": 512, - "min": 1 - }, - "Topic": { - "type": "structure", - "required": ["subject", "resource", "role"], - "members": { - "subject": { - "shape": "String" - }, - "resource": { - "shape": "NotificationResource" - }, - "role": { - "shape": "NotificationRole" - } - } - }, - "TrackingAssetArns": { - "type": "list", - "member": { - "shape": "SageMakerResourceArn" - }, - "max": 500, - "min": 0 - }, - "TrackingAssets": { - "type": "map", - "key": { - "shape": "SageMakerAssetType" - }, - "value": { - "shape": "TrackingAssetArns" - }, - "max": 1, - "min": 1 - }, - "TreatmentCodes": { - "type": "list", - "member": { - "shape": "String" - } - }, - "TypeName": { - "type": "string", - "max": 256, - "min": 1, - "pattern": "[^\\.]*.*" - }, - "TypesSearchScope": { - "type": "string", - "enum": ["ASSET_TYPE", "FORM_TYPE", "LINEAGE_NODE_TYPE"] - }, - "UnauthorizedException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 401, - "senderFault": true - }, - "exception": true - }, - "Unit": { - "type": "structure", - "members": {} - }, - "UntagResourceRequest": { - "type": "structure", - "required": ["resourceArn", "tagKeys"], - "members": { - "resourceArn": { - "shape": "String", - "location": "uri", - "locationName": "resourceArn" - }, - "tagKeys": { - "shape": "TagKeyList", - "location": "querystring", - "locationName": "tagKeys" - } - } - }, - "UntagResourceResponse": { - "type": "structure", - "members": {} - }, - "UpdateAccountPoolInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "AccountPoolId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "AccountPoolName" - }, - "description": { - "shape": "Description" - }, - "resolutionStrategy": { - "shape": "ResolutionStrategy" - }, - "accountSource": { - "shape": "AccountSource" - } - } - }, - "UpdateAccountPoolOutput": { - "type": "structure", - "required": ["accountSource", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "AccountPoolName" - }, - "id": { - "shape": "AccountPoolId" - }, - "description": { - "shape": "Description" - }, - "resolutionStrategy": { - "shape": "ResolutionStrategy" - }, - "accountSource": { - "shape": "AccountSource" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainUnitId": { - "shape": "DomainUnitId" - } - } - }, - "UpdateAssetFilterInput": { - "type": "structure", - "required": ["domainIdentifier", "assetIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "assetIdentifier": { - "shape": "AssetId", - "location": "uri", - "locationName": "assetIdentifier" - }, - "identifier": { - "shape": "FilterId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "Description" - }, - "configuration": { - "shape": "AssetFilterConfiguration" - } - } - }, - "UpdateAssetFilterOutput": { - "type": "structure", - "required": ["id", "domainId", "assetId", "name", "configuration"], - "members": { - "id": { - "shape": "FilterId" - }, - "domainId": { - "shape": "DomainId" - }, - "assetId": { - "shape": "AssetId" - }, - "name": { - "shape": "FilterName" - }, - "description": { - "shape": "Description" - }, - "status": { - "shape": "FilterStatus" - }, - "configuration": { - "shape": "AssetFilterConfiguration" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "errorMessage": { - "shape": "String" - }, - "effectiveColumnNames": { - "shape": "ColumnNameList" - }, - "effectiveRowFilter": { - "shape": "String" - } - } - }, - "UpdateConnectionInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "configurations": { - "shape": "Configurations", - "internalonly": true - }, - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ConnectionId", - "location": "uri", - "locationName": "identifier" - }, - "description": { - "shape": "UpdateConnectionInputDescriptionString" - }, - "awsLocation": { - "shape": "AwsLocation" - }, - "credentialId": { - "shape": "CredentialId", - "internalonly": true - }, - "props": { - "shape": "ConnectionPropertiesPatch" - } - } - }, - "UpdateConnectionInputDescriptionString": { - "type": "string", - "max": 128, - "min": 0, - "pattern": "[\\S\\s]*", - "sensitive": true - }, - "UpdateConnectionOutput": { - "type": "structure", - "required": ["connectionId", "domainId", "domainUnitId", "name", "physicalEndpoints", "type"], - "members": { - "configurations": { - "shape": "Configurations", - "internalonly": true - }, - "connectionId": { - "shape": "ConnectionId" - }, - "description": { - "shape": "Description" - }, - "domainId": { - "shape": "DomainId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "ConnectionName" - }, - "physicalEndpoints": { - "shape": "PhysicalEndpoints" - }, - "projectId": { - "shape": "ProjectId" - }, - "props": { - "shape": "ConnectionPropertiesOutput" - }, - "type": { - "shape": "ConnectionType" - }, - "credentialId": { - "shape": "CredentialId", - "internalonly": true - }, - "scope": { - "shape": "ConnectionScope", - "internalonly": true - } - } - }, - "UpdateDataSourceInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataSourceId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "enableSetting": { - "shape": "EnableSetting" - }, - "publishOnImport": { - "shape": "Boolean" - }, - "assetFormsInput": { - "shape": "FormInputList" - }, - "schedule": { - "shape": "ScheduleConfiguration" - }, - "configuration": { - "shape": "DataSourceConfigurationInput" - }, - "recommendation": { - "shape": "RecommendationConfiguration" - }, - "retainPermissionsOnRevokeFailure": { - "shape": "Boolean" - } - } - }, - "UpdateDataSourceOutput": { - "type": "structure", - "required": ["id", "name", "domainId", "projectId"], - "members": { - "id": { - "shape": "DataSourceId" - }, - "status": { - "shape": "DataSourceStatus" - }, - "type": { - "shape": "String" - }, - "name": { - "shape": "Name" - }, - "description": { - "shape": "Description" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "connectionId": { - "shape": "String" - }, - "configuration": { - "shape": "DataSourceConfigurationOutput" - }, - "recommendation": { - "shape": "RecommendationConfiguration" - }, - "enableSetting": { - "shape": "EnableSetting" - }, - "publishOnImport": { - "shape": "Boolean" - }, - "assetFormsOutput": { - "shape": "FormOutputList" - }, - "schedule": { - "shape": "ScheduleConfiguration" - }, - "lastRunStatus": { - "shape": "DataSourceRunStatus" - }, - "lastRunAt": { - "shape": "DateTime" - }, - "lastRunErrorMessage": { - "shape": "DataSourceErrorMessage" - }, - "errorMessage": { - "shape": "DataSourceErrorMessage" - }, - "createdAt": { - "shape": "DateTime" - }, - "updatedAt": { - "shape": "DateTime" - }, - "selfGrantStatus": { - "shape": "SelfGrantStatusOutput" - }, - "retainPermissionsOnRevokeFailure": { - "shape": "Boolean" - } - } - }, - "UpdateDataSourceRunActivitiesInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier", "completionStatus", "assets"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DataSourceRunId", - "location": "uri", - "locationName": "identifier" - }, - "completionStatus": { - "shape": "DataSourceRunCompletionStatus" - }, - "assets": { - "shape": "DataAssetIngestionDetails" - } - } - }, - "UpdateDataSourceRunActivitiesOutput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "DataSourceRunId" - } - } - }, - "UpdateDomainInput": { - "type": "structure", - "required": ["identifier"], - "members": { - "identifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "identifier" - }, - "description": { - "shape": "String" - }, - "singleSignOn": { - "shape": "SingleSignOn" - }, - "domainExecutionRole": { - "shape": "RoleArn" - }, - "serviceRole": { - "shape": "AdminApiRoleArn" - }, - "domainServiceRole": { - "shape": "AdminApiRoleArn", - "deprecated": true, - "deprecatedMessage": "This shape is no longer used. Use ServiceRole.", - "internalonly": true - }, - "name": { - "shape": "String" - }, - "domainVersion": { - "shape": "DomainVersion", - "internalonly": true - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true, - "location": "querystring", - "locationName": "clientToken" - }, - "scopes": { - "shape": "Scopes", - "internalonly": true - }, - "deactivatePortalVersion": { - "shape": "DeactivatePortalVersion", - "internalonly": true - } - } - }, - "UpdateDomainOutput": { - "type": "structure", - "required": ["id"], - "members": { - "id": { - "shape": "DomainId" - }, - "rootDomainUnitId": { - "shape": "DomainUnitId" - }, - "description": { - "shape": "String" - }, - "singleSignOn": { - "shape": "SingleSignOn" - }, - "domainExecutionRole": { - "shape": "RoleArn" - }, - "serviceRole": { - "shape": "AdminApiRoleArn" - }, - "domainServiceRole": { - "shape": "AdminApiRoleArn", - "internalonly": true - }, - "name": { - "shape": "String" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "preferences": { - "shape": "Preferences", - "internalonly": true - } - } - }, - "UpdateDomainPolicyInput": { - "type": "structure", - "required": ["domainId", "policyId"], - "members": { - "domainId": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainId" - }, - "policyId": { - "shape": "PolicyId", - "location": "uri", - "locationName": "policyId" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "policyContent": { - "shape": "PolicyContent" - }, - "clientToken": { - "shape": "String", - "idempotencyToken": true - } - } - }, - "UpdateDomainPolicyOutput": { - "type": "structure", - "required": ["domainId", "policyId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "policyId": { - "shape": "PolicyId" - } - } - }, - "UpdateDomainUnitInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DomainUnitId", - "location": "uri", - "locationName": "identifier" - }, - "description": { - "shape": "DomainUnitDescription" - }, - "name": { - "shape": "DomainUnitName" - } - } - }, - "UpdateDomainUnitOutput": { - "type": "structure", - "required": ["id", "domainId", "name", "owners", "ancestorDomainUnitIds"], - "members": { - "id": { - "shape": "DomainUnitId" - }, - "domainUnitId": { - "shape": "DomainUnitId", - "internalonly": true - }, - "domainId": { - "shape": "DomainId" - }, - "name": { - "shape": "DomainUnitName" - }, - "owners": { - "shape": "DomainUnitOwners" - }, - "ancestorDomainUnitIds": { - "shape": "DomainUnitIds" - }, - "description": { - "shape": "DomainUnitDescription" - }, - "parentDomainUnitId": { - "shape": "DomainUnitId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "lastUpdatedBy": { - "shape": "UpdatedBy" - } - } - }, - "UpdateDomainUnitPolicyInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier", "description"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "DomainUnitPolicyId", - "location": "uri", - "locationName": "identifier" - }, - "description": { - "shape": "String" - } - } - }, - "UpdateDomainUnitPolicyOutput": { - "type": "structure", - "required": ["domainId", "id", "description", "policyTarget", "details"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "DomainUnitPolicyId" - }, - "description": { - "shape": "String" - }, - "policyTarget": { - "shape": "PolicyTarget" - }, - "details": { - "shape": "Details" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "lastUpdatedAt": { - "shape": "UpdatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "lastUpdatedBy": { - "shape": "UpdatedBy" - } - } - }, - "UpdateEnvironmentActionInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "identifier": { - "shape": "String", - "location": "uri", - "locationName": "identifier" - }, - "parameters": { - "shape": "ActionParameters" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - } - } - }, - "UpdateEnvironmentActionOutput": { - "type": "structure", - "required": ["domainId", "environmentId", "id", "name", "parameters"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "id": { - "shape": "EnvironmentActionId" - }, - "name": { - "shape": "String" - }, - "parameters": { - "shape": "ActionParameters" - }, - "description": { - "shape": "String" - } - } - }, - "UpdateEnvironmentBlueprintInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentBlueprintId", - "location": "uri", - "locationName": "identifier" - }, - "description": { - "shape": "String" - }, - "provider": { - "shape": "String", - "internalonly": true - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "provisioningPolicy": { - "shape": "ProvisioningPolicy", - "internalonly": true - }, - "deploymentProperties": { - "shape": "DeploymentProperties", - "internalonly": true - }, - "deploymentParameters": { - "shape": "CustomParameterList", - "internalonly": true - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms", - "internalonly": true - } - } - }, - "UpdateEnvironmentBlueprintOutput": { - "type": "structure", - "required": ["id", "name", "provider", "provisioningProperties"], - "members": { - "id": { - "shape": "EnvironmentBlueprintId" - }, - "name": { - "shape": "EnvironmentBlueprintName" - }, - "description": { - "shape": "Description" - }, - "changeLog": { - "shape": "String", - "internalonly": true - }, - "provider": { - "shape": "String" - }, - "provisioningPolicy": { - "shape": "ProvisioningPolicy", - "internalonly": true - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "deploymentProperties": { - "shape": "DeploymentProperties" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "blueprintCategory": { - "shape": "String", - "internalonly": true - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - } - } - }, - "UpdateEnvironmentConfigurationInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "environmentDeploymentResult"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "environmentDeploymentResult": { - "shape": "EnvironmentDeploymentResult" - }, - "failureReason": { - "shape": "EnvironmentError" - }, - "provisionedResources": { - "shape": "ResourceList" - }, - "environmentActions": { - "shape": "EnvironmentActionList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - } - } - }, - "UpdateEnvironmentConfigurationOutput": { - "type": "structure", - "required": ["id"], - "members": { - "id": { - "shape": "EnvironmentId" - } - } - }, - "UpdateEnvironmentDeploymentStatusInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "deploymentStatus"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "deploymentIdentifier": { - "shape": "DeploymentId" - }, - "deploymentStatus": { - "shape": "DeploymentStatus" - }, - "statusMessage": { - "shape": "String" - }, - "failureReasons": { - "shape": "EnvironmentError" - } - } - }, - "UpdateEnvironmentDeploymentStatusOutput": { - "type": "structure", - "members": {} - }, - "UpdateEnvironmentInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "String" - }, - "description": { - "shape": "String" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "blueprintVersion": { - "shape": "String" - }, - "userParameters": { - "shape": "EnvironmentParametersList" - } - } - }, - "UpdateEnvironmentOutput": { - "type": "structure", - "required": ["projectId", "domainId", "createdBy", "name", "provider"], - "members": { - "projectId": { - "shape": "ProjectId" - }, - "id": { - "shape": "EnvironmentId" - }, - "domainId": { - "shape": "DomainId" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentName" - }, - "description": { - "shape": "Description" - }, - "environmentProfileId": { - "shape": "EnvironmentProfileId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "provider": { - "shape": "String" - }, - "provisionedResources": { - "shape": "ResourceList" - }, - "permittedResources": { - "shape": "ResourceList", - "internalonly": true - }, - "status": { - "shape": "EnvironmentStatus" - }, - "environmentActions": { - "shape": "EnvironmentActionList" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "lastDeployment": { - "shape": "Deployment" - }, - "provisioningProperties": { - "shape": "ProvisioningProperties" - }, - "deploymentProperties": { - "shape": "DeploymentProperties" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "environmentConfigurationId": { - "shape": "EnvironmentConfigurationId", - "internalonly": true - } - } - }, - "UpdateEnvironmentProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "EnvironmentProfileId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "EnvironmentProfileName" - }, - "description": { - "shape": "String" - }, - "userParameters": { - "shape": "EnvironmentParametersList" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "blueprintVersion": { - "shape": "String", - "internalonly": true - }, - "resourceConfigurationId": { - "shape": "ResourceConfigurationId" - } - } - }, - "UpdateEnvironmentProfileOutput": { - "type": "structure", - "required": ["id", "domainId", "createdBy", "name", "environmentBlueprintId"], - "members": { - "id": { - "shape": "EnvironmentProfileId" - }, - "domainId": { - "shape": "DomainId" - }, - "awsAccountId": { - "shape": "AwsAccountId" - }, - "awsAccountRegion": { - "shape": "AwsRegion" - }, - "createdBy": { - "shape": "String" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "updatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "name": { - "shape": "EnvironmentProfileName" - }, - "description": { - "shape": "Description" - }, - "environmentBlueprintId": { - "shape": "EnvironmentBlueprintId" - }, - "projectId": { - "shape": "ProjectId" - }, - "userParameters": { - "shape": "CustomParameterList" - }, - "resourceConfigurationId": { - "shape": "ResourceConfigurationId" - } - } - }, - "UpdateEnvironmentRoleInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "environmentRoleArn"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "environmentRoleArn": { - "shape": "RoleArn", - "location": "uri", - "locationName": "environmentRoleArn" - }, - "roleTag": { - "shape": "RoleTag" - } - } - }, - "UpdateEnvironmentRoleOutput": { - "type": "structure", - "required": ["domainId", "environmentId", "arn", "provider", "roleTag"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "arn": { - "shape": "RoleArn" - }, - "provider": { - "shape": "String" - }, - "type": { - "shape": "EnvironmentRoleType" - }, - "roleTag": { - "shape": "RoleTag" - } - } - }, - "UpdateGlossaryInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "GlossaryId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "GlossaryName" - }, - "description": { - "shape": "GlossaryDescription" - }, - "status": { - "shape": "GlossaryStatus" - }, - "clientToken": { - "shape": "ClientToken", - "idempotencyToken": true - } - } - }, - "UpdateGlossaryOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "owningProjectId"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GlossaryId" - }, - "name": { - "shape": "GlossaryName" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "description": { - "shape": "GlossaryDescription" - }, - "status": { - "shape": "GlossaryStatus" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - } - } - }, - "UpdateGlossaryTermInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "glossaryIdentifier": { - "shape": "GlossaryTermId" - }, - "identifier": { - "shape": "GlossaryTermId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "GlossaryTermName" - }, - "shortDescription": { - "shape": "ShortDescription" - }, - "longDescription": { - "shape": "LongDescription" - }, - "termRelations": { - "shape": "TermRelations" - }, - "status": { - "shape": "GlossaryTermStatus" - } - } - }, - "UpdateGlossaryTermOutput": { - "type": "structure", - "required": ["id", "domainId", "glossaryId", "name", "status"], - "members": { - "id": { - "shape": "GlossaryTermId" - }, - "domainId": { - "shape": "DomainId" - }, - "glossaryId": { - "shape": "GlossaryId" - }, - "name": { - "shape": "GlossaryTermName" - }, - "status": { - "shape": "GlossaryTermStatus" - }, - "shortDescription": { - "shape": "ShortDescription" - }, - "longDescription": { - "shape": "LongDescription" - }, - "termRelations": { - "shape": "TermRelations" - }, - "usageRestrictions": { - "shape": "GlossaryUsageRestrictions" - } - } - }, - "UpdateGroupProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "groupIdentifier", "status"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "groupIdentifier": { - "shape": "GroupIdentifier", - "location": "uri", - "locationName": "groupIdentifier" - }, - "status": { - "shape": "GroupProfileStatus" - } - } - }, - "UpdateGroupProfileOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "GroupProfileId" - }, - "status": { - "shape": "GroupProfileStatus" - }, - "groupName": { - "shape": "GroupProfileName" - } - } - }, - "UpdatePartnerIntegrationInput": { - "type": "structure", - "required": ["identifier", "props"], - "members": { - "identifier": { - "shape": "PartnerIntegrationId", - "location": "uri", - "locationName": "identifier" - }, - "description": { - "shape": "Description" - }, - "props": { - "shape": "PartnerIntegrationPropertiesPatch" - } - }, - "internalonly": true - }, - "UpdatePartnerIntegrationOutput": { - "type": "structure", - "required": ["id", "status", "partnerId", "name"], - "members": { - "id": { - "shape": "PartnerIntegrationId" - }, - "createdAt": { - "shape": "CreatedAtTimestamp" - }, - "updatedAt": { - "shape": "UpdatedAtTimestamp" - }, - "status": { - "shape": "PartnerIntegrationStatus" - }, - "partnerId": { - "shape": "PartnerId" - }, - "name": { - "shape": "Name" - }, - "props": { - "shape": "PartnerIntegrationPropertiesOutput" - } - }, - "internalonly": true - }, - "UpdateProjectInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "ProjectName" - }, - "description": { - "shape": "Description" - }, - "tags": { - "shape": "Tags", - "internalonly": true - }, - "resourceTags": { - "shape": "UpdateProjectInputResourceTagsMap" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "environmentDeploymentDetails": { - "shape": "EnvironmentDeploymentDetails", - "internalonly": true - }, - "userParameters": { - "shape": "EnvironmentConfigurationUserParametersList" - }, - "projectProfileVersion": { - "shape": "String" - } - } - }, - "UpdateProjectInputResourceTagsMap": { - "type": "map", - "key": { - "shape": "TagKey" - }, - "value": { - "shape": "TagValue" - }, - "max": 25, - "min": 0 - }, - "UpdateProjectMembershipInput": { - "type": "structure", - "required": ["domainIdentifier", "projectIdentifier", "currentMembershipAssignment"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "projectIdentifier": { - "shape": "ProjectId", - "location": "uri", - "locationName": "projectIdentifier" - }, - "currentMembershipAssignment": { - "shape": "ProjectMember" - }, - "newMember": { - "shape": "Member" - } - } - }, - "UpdateProjectMembershipOutput": { - "type": "structure", - "members": {} - }, - "UpdateProjectOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectId" - }, - "name": { - "shape": "ProjectName" - }, - "description": { - "shape": "Description" - }, - "projectStatus": { - "shape": "ProjectStatus", - "documentation": "

Status of the project

" - }, - "failureReasons": { - "shape": "FailureReasons", - "documentation": "

Reasons for failed project deletion

" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "tags": { - "shape": "Tags", - "internalonly": true - }, - "resourceTags": { - "shape": "ResourceTags" - }, - "glossaryTerms": { - "shape": "GlossaryTerms" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "projectProfileId": { - "shape": "ProjectProfileId", - "internalonly": true - }, - "userParameters": { - "shape": "EnvironmentConfigurationUserParametersList", - "internalonly": true - }, - "environmentDeploymentDetails": { - "shape": "EnvironmentDeploymentDetails", - "internalonly": true - }, - "projectCategory": { - "shape": "String", - "internalonly": true - } - } - }, - "UpdateProjectProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ProjectProfileId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "ProjectProfileName" - }, - "description": { - "shape": "Description" - }, - "changeLog": { - "shape": "String", - "internalonly": true - }, - "status": { - "shape": "Status" - }, - "projectResourceTags": { - "shape": "ProjectResourceTagParameters" - }, - "allowCustomProjectResourceTags": { - "shape": "Boolean" - }, - "projectScopes": { - "shape": "ProjectScopesList", - "internalonly": true - }, - "environmentConfigurations": { - "shape": "EnvironmentConfigurationsList" - }, - "domainUnitIdentifier": { - "shape": "DomainUnitId" - }, - "designationConfigurations": { - "shape": "DesignationConfigurations", - "internalonly": true - } - } - }, - "UpdateProjectProfileOutput": { - "type": "structure", - "required": ["domainId", "id", "name", "createdBy"], - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "ProjectProfileId" - }, - "name": { - "shape": "ProjectProfileName" - }, - "description": { - "shape": "Description" - }, - "changeLog": { - "shape": "String", - "internalonly": true - }, - "status": { - "shape": "Status" - }, - "projectResourceTags": { - "shape": "ProjectResourceTagParameters" - }, - "allowCustomProjectResourceTags": { - "shape": "Boolean" - }, - "projectScopes": { - "shape": "ProjectScopesList", - "internalonly": true - }, - "environmentConfigurations": { - "shape": "EnvironmentConfigurationsList" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "createdAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "lastUpdatedAt": { - "shape": "SyntheticTimestamp_date_time" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "designationConfigurations": { - "shape": "DesignationConfigurations", - "internalonly": true - } - } - }, - "UpdateResourceSharingStateRequest": { - "type": "structure", - "required": ["action", "ownerAccountId", "resource", "consumerAccountId", "sequenceNumber"], - "members": { - "action": { - "shape": "RAMSharingAction" - }, - "ownerAccountId": { - "shape": "AwsAccountId" - }, - "resource": { - "shape": "RAMResourceARN" - }, - "consumerAccountId": { - "shape": "AwsAccountId" - }, - "sequenceNumber": { - "shape": "RAMSequenceNumber" - }, - "internalId": { - "shape": "RAMInternalId" - } - } - }, - "UpdateResourceSharingStateResponse": { - "type": "structure", - "members": { - "sharingResult": { - "shape": "RAMSharingResult" - } - } - }, - "UpdateRootDomainUnitOwnerInput": { - "type": "structure", - "required": ["domainIdentifier", "currentOwner", "newOwner"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "currentOwner": { - "shape": "UserIdentifier" - }, - "newOwner": { - "shape": "String" - } - } - }, - "UpdateRootDomainUnitOwnerOutput": { - "type": "structure", - "members": {} - }, - "UpdateRuleInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "RuleId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "RuleName" - }, - "description": { - "shape": "Description" - }, - "scope": { - "shape": "RuleScope" - }, - "detail": { - "shape": "RuleDetail" - }, - "includeChildDomainUnits": { - "shape": "Boolean" - } - } - }, - "UpdateRuleOutput": { - "type": "structure", - "required": [ - "identifier", - "revision", - "name", - "ruleType", - "target", - "action", - "scope", - "detail", - "createdAt", - "updatedAt", - "createdBy", - "lastUpdatedBy" - ], - "members": { - "identifier": { - "shape": "RuleId" - }, - "revision": { - "shape": "Revision" - }, - "name": { - "shape": "RuleName" - }, - "ruleType": { - "shape": "RuleType" - }, - "target": { - "shape": "RuleTarget" - }, - "action": { - "shape": "RuleAction" - }, - "scope": { - "shape": "RuleScope" - }, - "detail": { - "shape": "RuleDetail" - }, - "description": { - "shape": "Description" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "lastUpdatedBy": { - "shape": "UpdatedBy" - } - } - }, - "UpdateServiceLinkInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "ServiceLinkId", - "location": "uri", - "locationName": "identifier" - }, - "identityMapping": { - "shape": "ServiceLinkIdentityMapping" - }, - "delegations": { - "shape": "ServiceLinkDelegations" - }, - "configurationInput": { - "shape": "ServiceLinkConfigurationInput" - } - }, - "internalonly": true - }, - "UpdateServiceLinkOutput": { - "type": "structure", - "required": [ - "id", - "domainId", - "owningProjectId", - "domainUnitId", - "createdAt", - "updatedAt", - "status", - "type", - "name" - ], - "members": { - "id": { - "shape": "ServiceLinkId" - }, - "domainId": { - "shape": "DomainId" - }, - "owningProjectId": { - "shape": "ProjectId" - }, - "domainUnitId": { - "shape": "DomainUnitId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "status": { - "shape": "ServiceLinkStatus" - }, - "type": { - "shape": "ServiceLinkType" - }, - "name": { - "shape": "ServiceLinkName" - } - }, - "internalonly": true - }, - "UpdateSubscriptionGrantStatusInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier", "assetIdentifier", "status"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionGrantId", - "location": "uri", - "locationName": "identifier" - }, - "assetIdentifier": { - "shape": "AssetId", - "location": "uri", - "locationName": "assetIdentifier" - }, - "status": { - "shape": "SubscriptionGrantStatus" - }, - "failureCause": { - "shape": "FailureCause" - }, - "targetName": { - "shape": "String" - } - } - }, - "UpdateSubscriptionGrantStatusOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "createdAt", - "updatedAt", - "subscriptionTargetId", - "grantedEntity", - "status" - ], - "members": { - "id": { - "shape": "SubscriptionGrantId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "environmentId": { - "shape": "EnvironmentId", - "internalonly": true - }, - "subscriptionTargetId": { - "shape": "SubscriptionTargetId" - }, - "grantedEntity": { - "shape": "GrantedEntity" - }, - "status": { - "shape": "SubscriptionGrantOverallStatus" - }, - "assets": { - "shape": "SubscribedAssets" - }, - "subscriptionId": { - "shape": "SubscriptionId", - "deprecated": true, - "deprecatedMessage": "Multiple subscriptions can exist for a single grant" - } - } - }, - "UpdateSubscriptionRequestInput": { - "type": "structure", - "required": ["domainIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "identifier": { - "shape": "SubscriptionRequestId", - "location": "uri", - "locationName": "identifier" - }, - "requestReason": { - "shape": "RequestReason" - } - } - }, - "UpdateSubscriptionRequestOutput": { - "type": "structure", - "required": [ - "id", - "createdBy", - "domainId", - "status", - "createdAt", - "updatedAt", - "requestReason", - "subscribedPrincipals", - "subscribedListings" - ], - "members": { - "id": { - "shape": "SubscriptionRequestId" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "domainId": { - "shape": "DomainId" - }, - "status": { - "shape": "SubscriptionRequestStatus" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "requestReason": { - "shape": "RequestReason" - }, - "subscribedPrincipals": { - "shape": "UpdateSubscriptionRequestOutputSubscribedPrincipalsList" - }, - "subscribedListings": { - "shape": "UpdateSubscriptionRequestOutputSubscribedListingsList" - }, - "reviewerId": { - "shape": "String" - }, - "decisionComment": { - "shape": "DecisionComment" - }, - "existingSubscriptionId": { - "shape": "SubscriptionId" - }, - "metadataForms": { - "shape": "MetadataForms" - } - } - }, - "UpdateSubscriptionRequestOutputSubscribedListingsList": { - "type": "list", - "member": { - "shape": "SubscribedListing" - }, - "max": 1, - "min": 1 - }, - "UpdateSubscriptionRequestOutputSubscribedPrincipalsList": { - "type": "list", - "member": { - "shape": "SubscribedPrincipal" - }, - "max": 1, - "min": 1 - }, - "UpdateSubscriptionTargetInput": { - "type": "structure", - "required": ["domainIdentifier", "environmentIdentifier", "identifier"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "environmentIdentifier": { - "shape": "EnvironmentId", - "location": "uri", - "locationName": "environmentIdentifier" - }, - "identifier": { - "shape": "SubscriptionTargetId", - "location": "uri", - "locationName": "identifier" - }, - "name": { - "shape": "SubscriptionTargetName" - }, - "authorizedPrincipals": { - "shape": "AuthorizedPrincipalIdentifiers" - }, - "applicableAssetTypes": { - "shape": "ApplicableAssetTypes" - }, - "subscriptionTargetConfig": { - "shape": "SubscriptionTargetForms" - }, - "manageAccessRole": { - "shape": "IamRoleArn" - }, - "provider": { - "shape": "String" - }, - "timeoutMinutes": { - "shape": "UpdateSubscriptionTargetInputTimeoutMinutesInteger" - } - } - }, - "UpdateSubscriptionTargetInputTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "min": 1 - }, - "UpdateSubscriptionTargetOutput": { - "type": "structure", - "required": [ - "id", - "authorizedPrincipals", - "domainId", - "projectId", - "environmentId", - "name", - "type", - "createdBy", - "createdAt", - "applicableAssetTypes", - "subscriptionTargetConfig", - "provider" - ], - "members": { - "id": { - "shape": "SubscriptionTargetId" - }, - "authorizedPrincipals": { - "shape": "AuthorizedPrincipalIdentifiers" - }, - "domainId": { - "shape": "DomainId" - }, - "projectId": { - "shape": "ProjectId" - }, - "environmentId": { - "shape": "EnvironmentId" - }, - "name": { - "shape": "SubscriptionTargetName" - }, - "type": { - "shape": "String" - }, - "createdBy": { - "shape": "CreatedBy" - }, - "updatedBy": { - "shape": "UpdatedBy" - }, - "createdAt": { - "shape": "CreatedAt" - }, - "updatedAt": { - "shape": "UpdatedAt" - }, - "manageAccessRole": { - "shape": "IamRoleArn" - }, - "applicableAssetTypes": { - "shape": "ApplicableAssetTypes" - }, - "subscriptionTargetConfig": { - "shape": "SubscriptionTargetForms" - }, - "provider": { - "shape": "String" - }, - "timeoutMinutes": { - "shape": "UpdateSubscriptionTargetOutputTimeoutMinutesInteger" - } - } - }, - "UpdateSubscriptionTargetOutputTimeoutMinutesInteger": { - "type": "integer", - "box": true, - "min": 1 - }, - "UpdateUserProfileInput": { - "type": "structure", - "required": ["domainIdentifier", "userIdentifier", "status"], - "members": { - "domainIdentifier": { - "shape": "DomainId", - "location": "uri", - "locationName": "domainIdentifier" - }, - "userIdentifier": { - "shape": "UserIdentifier", - "location": "uri", - "locationName": "userIdentifier" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - } - } - }, - "UpdateUserProfileOutput": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "UserProfileId" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "UpdatedAt": { - "type": "timestamp" - }, - "UpdatedAtTimestamp": { - "type": "timestamp", - "timestampFormat": "iso8601" - }, - "UpdatedBy": { - "type": "string" - }, - "UseAssetTypePolicyGrantDetail": { - "type": "structure", - "members": { - "domainUnitId": { - "shape": "DomainUnitId" - } - } - }, - "UserAssignment": { - "type": "string", - "enum": ["AUTOMATIC", "MANUAL"] - }, - "UserDesignation": { - "type": "string", - "enum": [ - "PROJECT_OWNER", - "PROJECT_CONTRIBUTOR", - "PROJECT_CATALOG_VIEWER", - "PROJECT_CATALOG_CONSUMER", - "PROJECT_CATALOG_STEWARD", - "PROJECT_ADMIN", - "PROJECT_MANAGER" - ] - }, - "UserDetails": { - "type": "structure", - "required": ["userId"], - "members": { - "userId": { - "shape": "String" - } - } - }, - "UserGroupPolicyPrincipal": { - "type": "structure", - "members": { - "user": { - "shape": "UserPolicyPrincipal" - }, - "group": { - "shape": "GroupPolicyPrincipal" - } - }, - "union": true - }, - "UserIdentifier": { - "type": "string", - "pattern": ".*(^([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}$|^[a-zA-Z_0-9+=,.@-]+$|^arn:aws[^:]*:iam::\\d{12}:.+$).*" - }, - "UserPolicyGrantPrincipal": { - "type": "structure", - "members": { - "userIdentifier": { - "shape": "UserIdentifier" - }, - "allUsersGrantFilter": { - "shape": "AllUsersGrantFilter" - } - }, - "union": true - }, - "UserPolicyPrincipal": { - "type": "structure", - "members": { - "userIdentifier": { - "shape": "UserIdentifier" - } - } - }, - "UserProfile": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "UserProfileId" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "UserProfileDetails": { - "type": "structure", - "members": { - "iam": { - "shape": "IamUserProfileDetails" - }, - "sso": { - "shape": "SsoUserProfileDetails" - } - }, - "union": true - }, - "UserProfileId": { - "type": "string", - "pattern": "([0-9a-f]{10}-|)[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}" - }, - "UserProfileName": { - "type": "string", - "max": 1024, - "min": 1, - "pattern": "[a-zA-Z_0-9+=,.@-]+", - "sensitive": true - }, - "UserProfileStatus": { - "type": "string", - "enum": ["ASSIGNED", "NOT_ASSIGNED", "ACTIVATED", "DEACTIVATED", "ARCHIVED"] - }, - "UserProfileSummaries": { - "type": "list", - "member": { - "shape": "UserProfileSummary" - } - }, - "UserProfileSummary": { - "type": "structure", - "members": { - "domainId": { - "shape": "DomainId" - }, - "id": { - "shape": "UserProfileId" - }, - "type": { - "shape": "UserProfileType" - }, - "status": { - "shape": "UserProfileStatus" - }, - "details": { - "shape": "UserProfileDetails" - } - } - }, - "UserProfileType": { - "type": "string", - "enum": ["IAM", "SSO", "SAML"] - }, - "UserSearchText": { - "type": "string", - "max": 1024, - "min": 0, - "sensitive": true - }, - "UserSearchType": { - "type": "string", - "enum": ["SSO_USER", "DATAZONE_USER", "DATAZONE_SSO_USER", "DATAZONE_IAM_USER"] - }, - "UserType": { - "type": "string", - "enum": ["IAM_USER", "IAM_ROLE", "SSO_USER"] - }, - "Username": { - "type": "string", - "max": 127, - "min": 1, - "pattern": "[\\S]*" - }, - "UsernamePassword": { - "type": "structure", - "required": ["password", "username"], - "members": { - "password": { - "shape": "Password" - }, - "username": { - "shape": "Username" - } - }, - "sensitive": true - }, - "UsernamePasswordCredentials": { - "type": "structure", - "required": ["username", "password"], - "members": { - "username": { - "shape": "String" - }, - "password": { - "shape": "String" - } - }, - "internalonly": true, - "sensitive": true - }, - "ValidatePassRoleRequest": { - "type": "structure", - "required": ["roleArn", "domainId"], - "members": { - "roleArn": { - "shape": "String" - }, - "domainId": { - "shape": "DomainId" - } - } - }, - "ValidatePassRoleResponse": { - "type": "structure", - "members": { - "validationSuccessful": { - "shape": "Boolean" - } - } - }, - "ValidateResourceSharingRequest": { - "type": "structure", - "required": ["ownerAccountId", "resource"], - "members": { - "ownerAccountId": { - "shape": "AwsAccountId" - }, - "resource": { - "shape": "RAMResourceARN" - }, - "internalId": { - "shape": "RAMInternalId" - } - } - }, - "ValidateResourceSharingResponse": { - "type": "structure", - "required": ["validationResult"], - "members": { - "validationResult": { - "shape": "RAMValidationResult" - }, - "validationMessage": { - "shape": "String" - }, - "internalId": { - "shape": "RAMInternalId" - } - } - }, - "ValidationException": { - "type": "structure", - "required": ["message"], - "members": { - "message": { - "shape": "ErrorMessage" - } - }, - "error": { - "httpStatusCode": 400, - "senderFault": true - }, - "exception": true - }, - "WarehouseMetadataListingTarget": { - "type": "string", - "enum": ["CLUSTER", "WORKGROUP"] - }, - "WorkflowsMwaaPropertiesInput": { - "type": "structure", - "members": { - "mwaaEnvironmentName": { - "shape": "String" - } - } - }, - "WorkflowsMwaaPropertiesOutput": { - "type": "structure", - "members": { - "mwaaEnvironmentName": { - "shape": "String" - } - } - }, - "WorkflowsServerlessPropertiesInput": { - "type": "structure", - "members": {} - }, - "WorkflowsServerlessPropertiesOutput": { - "type": "structure", - "members": {} - } - } -} diff --git a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts index 7a48a2761d3..2222f490c55 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/smusUtils.ts @@ -11,7 +11,6 @@ import fetch from 'node-fetch' import { CredentialsProvider, CredentialsProviderType } from '../../auth/providers/credentials' import { CredentialType } from '../../shared/telemetry/telemetry' import { AwsCredentialIdentity } from '@aws-sdk/types' -import { DataZoneDomainPreferencesClient } from './client/datazoneDomainPreferencesClient' /** * Represents SSO instance information retrieved from DataZone @@ -397,31 +396,37 @@ export class SmusUtils { } /** - * Checks if we're in SMUS Express mode - * @param domainId The DataZone domain ID to check - * @param region The AWS region where the domain is located - * @param credentialsProvider The credentials provider to use for API calls - * @returns Promise resolving to true if the domain is in Express mode + * Extracts the session name from an assumed role ARN. + * + * Note: This function ONLY works for assumed role ARNs (arn:aws:sts::*:assumed-role/*). + * It will return undefined for other IAM principal types such as: + * - IAM users (arn:aws:iam::*:user/*) + * - IAM roles (arn:aws:iam::*:role/*) + * + * @param arn The assumed role ARN (format: arn:aws:sts::ACCOUNT:assumed-role/ROLE_NAME/SESSION_NAME) + * @returns The session name if the ARN is a valid assumed role ARN, undefined otherwise */ - public static async isInSmusExpressMode( - domainId: string, - region: string, - credentialsProvider: CredentialsProvider - ): Promise { + public static extractSessionNameFromArn(arn: string): string | undefined { try { - this.logger.info(`SMUS: Checking if domain ${domainId} is Express mode`) + // Expected format: arn:aws:sts::ACCOUNT:assumed-role/ROLE_NAME/SESSION_NAME + const parts = arn.split(':') + if (parts.length < 6) { + return undefined + } - // Get DataZoneDomainPreferencesClient instance - const domainPreferencesClient = DataZoneDomainPreferencesClient.getInstance(credentialsProvider, region) + // The resource part is after the 5th colon + const resourcePart = parts.slice(5).join(':') - // Check if the specific domain is an Express domain - const isExpress = await domainPreferencesClient.isExpressDomain(domainId) + // Split by '/' to get assumed-role, ROLE_NAME, and SESSION_NAME + const resourceParts = resourcePart.split('/') + if (resourceParts.length < 3 || resourceParts[0] !== 'assumed-role') { + return undefined + } - this.logger.debug(`SMUS: Domain ${domainId} is ${isExpress ? ' Express mode' : 'not Express mode'}`) - return isExpress - } catch (error) { - this.logger.error('SMUS: Failed to check Express mode: %s', error as Error) - return false + // Session name is the last part + return resourceParts[2] + } catch (err) { + return undefined } } diff --git a/packages/core/src/shared/clients/sagemaker.ts b/packages/core/src/shared/clients/sagemaker.ts index fda420effef..1b5ab92e7d4 100644 --- a/packages/core/src/shared/clients/sagemaker.ts +++ b/packages/core/src/shared/clients/sagemaker.ts @@ -72,11 +72,12 @@ export class SagemakerClient extends ClientWrapper { protected override getClient(ignoreCache: boolean = false) { if (!this.client || ignoreCache) { + const endpoint = process.env.SAGEMAKER_ENDPOINT || `https://sagemaker.${this.regionCode}.amazonaws.com` const args = { serviceClient: SageMakerClient, region: this.regionCode, clientOptions: { - endpoint: `https://sagemaker.${this.regionCode}.amazonaws.com`, + endpoint: endpoint, region: this.regionCode, ...(this.credentialsProvider && { credentials: this.credentialsProvider }), }, diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 5f7ca4989a2..1aecc1a146f 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -1374,8 +1374,10 @@ describe('SmusAuthenticationProvider', function () { describe('initExpressModeContextInSpaceEnvironment', function () { let getResourceMetadataStub: sinon.SinonStub let getDerCredentialsProviderStub: sinon.SinonStub - let isInSmusExpressModeStub: sinon.SinonStub + let getInstanceStub: sinon.SinonStub + let isExpressDomainStub: sinon.SinonStub let mockCredentialsProvider: any + let mockClientHelper: any const testResourceMetadata = { AdditionalMetadata: { @@ -1387,7 +1389,6 @@ describe('SmusAuthenticationProvider', function () { beforeEach(function () { getResourceMetadataStub = sinon.stub(resourceMetadataUtils, 'getResourceMetadata') - isInSmusExpressModeStub = sinon.stub(SmusUtils, 'isInSmusExpressMode') // Reset the global setContext stub history for clean test state setContextStubGlobal.resetHistory() @@ -1402,6 +1403,20 @@ describe('SmusAuthenticationProvider', function () { getDerCredentialsProviderStub = sinon .stub(smusAuthProvider, 'getDerCredentialsProvider') .resolves(mockCredentialsProvider) + + // Mock DataZoneCustomClientHelper + isExpressDomainStub = sinon.stub() + mockClientHelper = { + isExpressDomain: isExpressDomainStub, + } + + getInstanceStub = sinon + .stub( + require('../../../sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper') + .DataZoneCustomClientHelper, + 'getInstance' + ) + .returns(mockClientHelper) }) afterEach(function () { @@ -1410,37 +1425,37 @@ describe('SmusAuthenticationProvider', function () { it('should set express mode context to true when domain is express mode', async function () { getResourceMetadataStub.returns(testResourceMetadata) - isInSmusExpressModeStub.resolves(true) + isExpressDomainStub.resolves(true) await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() assert.ok(getResourceMetadataStub.called) assert.ok(getDerCredentialsProviderStub.called) assert.ok( - isInSmusExpressModeStub.calledWith( - testResourceMetadata.AdditionalMetadata.DataZoneDomainId, - testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion, - mockCredentialsProvider + getInstanceStub.calledWith( + mockCredentialsProvider, + testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion ) ) + assert.ok(isExpressDomainStub.calledWith(testResourceMetadata.AdditionalMetadata.DataZoneDomainId)) assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', true)) }) it('should set express mode context to false when domain is not express mode', async function () { getResourceMetadataStub.returns(testResourceMetadata) - isInSmusExpressModeStub.resolves(false) + isExpressDomainStub.resolves(false) await smusAuthProvider['initExpressModeContextInSpaceEnvironment']() assert.ok(getResourceMetadataStub.called) assert.ok(getDerCredentialsProviderStub.called) assert.ok( - isInSmusExpressModeStub.calledWith( - testResourceMetadata.AdditionalMetadata.DataZoneDomainId, - testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion, - mockCredentialsProvider + getInstanceStub.calledWith( + mockCredentialsProvider, + testResourceMetadata.AdditionalMetadata.DataZoneDomainRegion ) ) + assert.ok(isExpressDomainStub.calledWith(testResourceMetadata.AdditionalMetadata.DataZoneDomainId)) assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', false)) }) @@ -1451,7 +1466,8 @@ describe('SmusAuthenticationProvider', function () { assert.ok(getResourceMetadataStub.called) assert.ok(getDerCredentialsProviderStub.notCalled) - assert.ok(isInSmusExpressModeStub.notCalled) + assert.ok(getInstanceStub.notCalled) + assert.ok(isExpressDomainStub.notCalled) assert.ok(setContextStubGlobal.notCalled) }) @@ -1464,7 +1480,8 @@ describe('SmusAuthenticationProvider', function () { assert.ok(getResourceMetadataStub.called) assert.ok(getDerCredentialsProviderStub.called) - assert.ok(isInSmusExpressModeStub.notCalled) + assert.ok(getInstanceStub.notCalled) + assert.ok(isExpressDomainStub.notCalled) assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', false)) }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts index 8ee30cc64dc..71674db8dae 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioRootNode.test.ts @@ -18,6 +18,10 @@ import * as pickerPrompter from '../../../../shared/ui/pickerPrompter' import { getTestWindow } from '../../../shared/vscode/window' import { assertTelemetry } from '../../../../../src/test/testUtil' import { createMockExtensionContext, createMockUnauthenticatedAuthProvider } from '../../testUtils' +import { DataZoneCustomClientHelper } from '../../../../sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper' +import { DefaultStsClient } from '../../../../shared/clients/stsClient' +import { SmusUtils } from '../../../../sagemakerunifiedstudio/shared/smusUtils' +import { ToolkitError } from '../../../../shared/errors' describe('SmusRootNode', function () { let rootNode: SageMakerUnifiedStudioRootNode @@ -546,16 +550,8 @@ describe('selectSMUSProject - Additional Tests', function () { assert.strictEqual(result, undefined) const testWindow = getTestWindow() assert.ok(testWindow.shownMessages.some((msg) => msg.message === 'No projects found in the domain')) - assert.ok( - createQuickPickStub.calledWith([ - { - label: 'No projects found', - detail: '', - description: '', - data: {}, - }, - ]) - ) + // When no projects are found, createQuickPick should not be called + assert.ok(!createQuickPickStub.called) }) it('handles invalid selected project object', async function () { @@ -581,6 +577,7 @@ describe('selectSMUSProject - Express Mode', function () { let createQuickPickStub: sinon.SinonStub let executeCommandStub: sinon.SinonStub let getContextStub: sinon.SinonStub + let getInstanceStub: sinon.SinonStub let createDZClientStub: sinon.SinonStub const testDomainId = 'test-domain-123' @@ -605,10 +602,11 @@ describe('selectSMUSProject - Express Mode', function () { } beforeEach(function () { + const mockGroupProfileId = 'group-profile-123' + mockDataZoneClient = { getDomainId: sinon.stub().returns(testDomainId), fetchAllProjects: sinon.stub(), - getUserProfileId: sinon.stub().resolves(testUserProfileId), } as any mockProjectNode = { @@ -624,19 +622,47 @@ describe('selectSMUSProject - Express Mode', function () { createDZClientStub ) - sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ - activeConnection: { domainId: testDomainId, ssoRegion: 'us-west-2' }, + // Mock credentials provider + const mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + } + + const mockAuthProvider = { + activeConnection: { + type: 'iam' as const, + profileName: 'test-profile', + region: 'us-west-2', + domainId: testDomainId, + domainUrl: `https://${testDomainId}.sagemaker.us-west-2.on.aws/`, + }, getDomainAccountId: sinon.stub().resolves('123456789012'), getDomainId: sinon.stub().returns(testDomainId), getDomainRegion: sinon.stub().returns('us-west-2'), - getDerCredentialsProvider: sinon.stub().resolves({ - getCredentials: sinon.stub().resolves({ - accessKeyId: 'test-key', - secretAccessKey: 'test-secret', - sessionToken: 'test-token', - }), - }), - } as any) + getCredentialsProviderForIamProfile: sinon.stub().resolves(mockCredentialsProvider), + } + sinon.stub(SmusAuthenticationProvider, 'fromContext').returns(mockAuthProvider as any) + + // Mock DataZoneCustomClientHelper + const mockDataZoneCustomClientHelper = { + getGroupProfileId: sinon.stub().resolves(mockGroupProfileId), + } + getInstanceStub = sinon + .stub(DataZoneCustomClientHelper, 'getInstance') + .returns(mockDataZoneCustomClientHelper as any) + + // Mock STS client + sinon.stub(DefaultStsClient.prototype, 'getCallerIdentity').resolves({ + Arn: 'arn:aws:sts::123456789012:assumed-role/TestRole/test-session', + UserId: 'AIDAI123456789EXAMPLE:test-session', + Account: '123456789012', + }) + + // Mock SmusUtils + sinon.stub(SmusUtils, 'convertAssumedRoleArnToIamRoleArn').returns('arn:aws:iam::123456789012:role/TestRole') const mockQuickPick = { prompt: sinon.stub().resolves(userProject), @@ -660,36 +686,38 @@ describe('selectSMUSProject - Express Mode', function () { const result = await selectSMUSProject(mockProjectNode as any) - // Verify getUserProfileId was called - assert.ok(mockDataZoneClient.getUserProfileId.calledOnce) + // Verify DataZoneCustomClientHelper.getInstance was called + assert.ok(getInstanceStub.called) - // Verify only user-created projects are shown in quick pick - const quickPickCall = createQuickPickStub.getCall(0) - const items = quickPickCall.args[0] - assert.strictEqual(items.length, 1) - assert.strictEqual(items[0].data.id, userProject.id) - assert.strictEqual(items[0].data.createdBy, testUserProfileId) + // Verify projects were fetched with group identifier + assert.ok(mockDataZoneClient.fetchAllProjects.calledOnce) + const fetchCallArgs = mockDataZoneClient.fetchAllProjects.getCall(0).args[0] + assert.ok(fetchCallArgs?.groupIdentifier) - // Verify the user project was selected and set + // Verify the project was selected and set assert.strictEqual(result, userProject) assert.ok(mockProjectNode.setProject.calledOnce) assert.ok(executeCommandStub.calledWith('aws.smus.rootView.refresh')) }) it('shows message when no user-created projects found in Express mode', async function () { - mockDataZoneClient.fetchAllProjects.resolves([otherUserProject]) + mockDataZoneClient.fetchAllProjects.resolves([]) const result = await selectSMUSProject(mockProjectNode as any) - // Verify getUserProfileId was called - assert.ok(mockDataZoneClient.getUserProfileId.calledOnce) + // Verify DataZoneCustomClientHelper.getInstance was called + assert.ok(getInstanceStub.called) // Verify no projects were shown in quick pick assert.ok(!createQuickPickStub.called) // Verify appropriate message was shown const testWindow = getTestWindow() - assert.ok(testWindow.shownMessages.some((msg) => msg.message === 'No accessible projects found')) + assert.ok( + testWindow.shownMessages.some( + (msg) => msg.message === 'No accessible projects found for your IAM principal' + ) + ) // Verify no project was set assert.strictEqual(result, undefined) @@ -706,18 +734,23 @@ describe('selectSMUSProject - Express Mode', function () { updatedAt: new Date(Date.now() - 172800000), // 2 days ago } - mockDataZoneClient.fetchAllProjects.resolves([userProject, otherUserProject, userProject2]) + // In Express mode, fetchAllProjects is called with groupIdentifier filter + // So the API returns only projects for that group (already filtered) + mockDataZoneClient.fetchAllProjects.resolves([userProject, userProject2]) await selectSMUSProject(mockProjectNode as any) - // Verify only user-created projects are shown + // Verify projects were fetched with group identifier + assert.ok(mockDataZoneClient.fetchAllProjects.calledOnce) + const fetchCallArgs = mockDataZoneClient.fetchAllProjects.getCall(0).args[0] + assert.ok(fetchCallArgs?.groupIdentifier) + + // Verify all returned projects are shown in quick pick const quickPickCall = createQuickPickStub.getCall(0) const items = quickPickCall.args[0] assert.strictEqual(items.length, 2) - assert.ok(items.every((item: any) => item.data.createdBy === testUserProfileId)) assert.ok(items.some((item: any) => item.data.id === userProject.id)) assert.ok(items.some((item: any) => item.data.id === userProject2.id)) - assert.ok(!items.some((item: any) => item.data.id === otherUserProject.id)) }) it('does not filter projects in non-Express mode', async function () { @@ -728,8 +761,8 @@ describe('selectSMUSProject - Express Mode', function () { await selectSMUSProject(mockProjectNode as any) - // Verify getUserProfileId was NOT called - assert.ok(!mockDataZoneClient.getUserProfileId.called) + // Verify DataZoneCustomClientHelper.getInstance was NOT called in non-Express mode + assert.ok(!getInstanceStub.called) // Verify all projects are shown in quick pick const quickPickCall = createQuickPickStub.getCall(0) @@ -809,16 +842,8 @@ describe('selectSMUSProject - Error Handling', function () { assert.strictEqual(result, undefined) const testWindow = getTestWindow() assert.ok(testWindow.shownMessages.some((msg) => msg.message === 'No projects found in the domain')) - assert.ok( - createQuickPickStub.calledWith([ - { - label: 'No projects found', - detail: '', - description: '', - data: {}, - }, - ]) - ) + // createQuickPick should NOT be called when there are no projects + assert.ok(!createQuickPickStub.called) assert.ok(!mockProjectNode.setProject.called) }) }) @@ -826,46 +851,158 @@ describe('selectSMUSProject - Error Handling', function () { describe('No accessible projects in Express mode', function () { beforeEach(function () { getContextStub.withArgs('aws.smus.isExpressMode').returns(true) - }) - it('displays "No accessible projects found" when user has no projects they created', async function () { - const otherUserProject: DataZoneProject = { - id: 'project-456', - name: 'Other User Project', - description: 'Project created by another user', - domainId: testDomainId, - createdBy: 'other-user-profile-456', - updatedAt: new Date(), + // Override the SSO connection with IAM connection for Express mode tests + sinon.restore() + + // Re-setup mocks with IAM connection + mockDataZoneClient = { + getDomainId: sinon.stub().returns(testDomainId), + fetchAllProjects: sinon.stub(), + getUserProfileId: sinon.stub().resolves(testUserProfileId), + } as any + + mockProjectNode = { + setProject: sinon.stub(), + } as any + + createDZClientStub = sinon.stub() + createDZClientStub.resolves(mockDataZoneClient) + sinon.replace( + require('../../../../sagemakerunifiedstudio/explorer/nodes/utils'), + 'createDZClientBaseOnDomainMode', + createDZClientStub + ) + + // Mock credentials provider + const mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + } + + const mockAuthProvider = { + activeConnection: { + type: 'iam' as const, + profileName: 'test-profile', + region: 'us-west-2', + domainId: testDomainId, + domainUrl: `https://${testDomainId}.sagemaker.us-west-2.on.aws/`, + }, + getDomainAccountId: sinon.stub().resolves('123456789012'), + getDomainId: sinon.stub().returns(testDomainId), + getDomainRegion: sinon.stub().returns('us-west-2'), + getCredentialsProviderForIamProfile: sinon.stub().resolves(mockCredentialsProvider), + } + sinon.stub(SmusAuthenticationProvider, 'fromContext').returns(mockAuthProvider as any) + + // Mock DataZoneCustomClientHelper + const mockDataZoneCustomClientHelper = { + getGroupProfileId: sinon.stub().resolves('group-profile-123'), + } + sinon.stub(DataZoneCustomClientHelper, 'getInstance').returns(mockDataZoneCustomClientHelper as any) + + // Mock STS client + sinon.stub(DefaultStsClient.prototype, 'getCallerIdentity').resolves({ + Arn: 'arn:aws:sts::123456789012:assumed-role/TestRole/test-session', + UserId: 'AIDAI123456789EXAMPLE:test-session', + Account: '123456789012', + }) + + const mockQuickPick = { + prompt: sinon.stub().resolves(mockProject), } + createQuickPickStub = sinon.stub(pickerPrompter, 'createQuickPick').returns(mockQuickPick as any) + + getContextStub = sinon.stub() + getContextStub.withArgs('aws.smus.isExpressMode').returns(true) + getContextStub.callThrough() + sinon.replace(require('../../../../shared/vscode/setContext'), 'getContext', getContextStub) + }) - mockDataZoneClient.fetchAllProjects.resolves([otherUserProject]) + it('displays "No accessible projects found" when user has no projects they created', async function () { + // In Express mode, fetchAllProjects is called with groupIdentifier filter + // which should return empty array when no projects match + mockDataZoneClient.fetchAllProjects.resolves([]) const result = await selectSMUSProject(mockProjectNode as any) assert.strictEqual(result, undefined) - assert.ok(mockDataZoneClient.getUserProfileId.calledOnce) const testWindow = getTestWindow() - assert.ok(testWindow.shownMessages.some((msg) => msg.message === 'No accessible projects found')) + assert.ok( + testWindow.shownMessages.some( + (msg) => msg.message === 'No accessible projects found for your IAM principal' + ) + ) assert.ok(!mockProjectNode.setProject.called) }) - it('handles getUserProfileId failure with appropriate error message', async function () { - const profileError = new Error('User profile not found') - mockDataZoneClient.getUserProfileId.rejects(profileError) - mockDataZoneClient.fetchAllProjects.resolves([mockProject]) + it('handles getGroupProfileId failure with appropriate error message', async function () { + // Mock getGroupProfileId to throw a ToolkitError with "No group profile found" + const groupProfileError = new ToolkitError( + 'No group profile found for IAM role: arn:aws:iam::123456789012:role/TestRole', + { + code: 'NoGroupProfileFound', + name: 'ToolkitError', + } + ) + const mockDataZoneCustomClientHelper = { + getGroupProfileId: sinon.stub().rejects(groupProfileError), + } + sinon.restore() + sinon.stub(DataZoneCustomClientHelper, 'getInstance').returns(mockDataZoneCustomClientHelper as any) + + // Re-stub other dependencies + sinon.stub(SmusAuthenticationProvider, 'fromContext').returns({ + activeConnection: { + type: 'iam' as const, + profileName: 'test-profile', + region: 'us-west-2', + domainId: testDomainId, + domainUrl: `https://${testDomainId}.sagemaker.us-west-2.on.aws/`, + }, + getDomainAccountId: sinon.stub().resolves('123456789012'), + getDomainId: sinon.stub().returns(testDomainId), + getDomainRegion: sinon.stub().returns('us-west-2'), + getCredentialsProviderForIamProfile: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), + } as any) + + sinon.stub(DefaultStsClient.prototype, 'getCallerIdentity').resolves({ + Arn: 'arn:aws:sts::123456789012:assumed-role/TestRole/test-session', + UserId: 'AIDAI123456789EXAMPLE:test-session', + Account: '123456789012', + }) + + const getContextStub = sinon.stub() + getContextStub.withArgs('aws.smus.isExpressMode').returns(true) + getContextStub.callThrough() + sinon.replace(require('../../../../shared/vscode/setContext'), 'getContext', getContextStub) + + sinon.replace( + require('../../../../sagemakerunifiedstudio/explorer/nodes/utils'), + 'createDZClientBaseOnDomainMode', + sinon.stub().resolves(mockDataZoneClient) + ) const result = await selectSMUSProject(mockProjectNode as any) - assert.strictEqual(result, undefined) + assert.ok(result instanceof Error) const testWindow = getTestWindow() assert.ok( testWindow.shownMessages.some( (msg) => msg.message === - 'No project found for IAM principal. Ensure you have created a project through console or portal for this IAM principal before attempting access from Toolkit extension.' + 'No resources found for your IAM principal. Ensure SageMaker Unified Studio resources exist for this IAM principal.' ) ) - assert.ok(!mockProjectNode.setProject.called) }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts index bac76fa094c..a073e258aad 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioSpacesParentNode.test.ts @@ -14,6 +14,7 @@ import { SagemakerClient } from '../../../../shared/clients/sagemaker' import { SmusAuthenticationProvider } from '../../../../sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider' import { getLogger } from '../../../../shared/logger/logger' import { SmusUtils } from '../../../../sagemakerunifiedstudio/shared/smusUtils' +import * as vscodeUtils from '../../../../shared/vscode/setContext' describe('SageMakerUnifiedStudioSpacesParentNode', function () { let spacesNode: SageMakerUnifiedStudioSpacesParentNode @@ -29,7 +30,7 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { extensionUri: vscode.Uri.file('/test'), } as any mockAuthProvider = { - activeConnection: { domainId: 'test-domain', ssoRegion: 'us-west-2' }, + activeConnection: { domainId: 'test-domain', ssoRegion: 'us-west-2', profileName: 'test-profile' }, getDomainId: sinon.stub().returns('test-domain'), getDomainRegion: sinon.stub().returns('us-west-2'), getDerCredentialsProvider: sinon.stub().resolves({ @@ -39,6 +40,13 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { sessionToken: 'test-token', }), }), + getCredentialsProviderForIamProfile: sinon.stub().resolves({ + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-key', + secretAccessKey: 'test-secret', + sessionToken: 'test-token', + }), + }), } as any mockSagemakerClient = sinon.createStubInstance(SagemakerClient) mockSagemakerClient.fetchSpaceAppsAndDomains.resolves([new Map(), new Map()]) @@ -57,6 +65,7 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { sinon.stub(getLogger(), 'debug') sinon.stub(getLogger(), 'error') sinon.stub(SmusUtils, 'extractSSOIdFromUserId').returns('user-12345') + sinon.stub(vscodeUtils, 'getContext').returns(false) spacesNode = new SageMakerUnifiedStudioSpacesParentNode( mockParent, @@ -427,4 +436,46 @@ describe('SageMakerUnifiedStudioSpacesParentNode', function () { await assert.rejects(async () => await spacesNode['updateChildren'](), /Access denied to spaces/) }) }) + + describe('Express mode error handling', function () { + it('should return no user profile error node when Express mode fails with no profile error', async function () { + const noProfileError = new Error('No user profile found for your session') + const updateChildrenStub = sinon.stub(spacesNode as any, 'updateChildren') + updateChildrenStub.rejects(noProfileError) + + const children = await spacesNode.getChildren() + + assert.strictEqual(children.length, 1) + assert.strictEqual(children[0].id, 'smusNoUserProfile') + + const treeItem = await children[0].getTreeItem() + assert.strictEqual(treeItem.label, 'No spaces found for your IAM principal') + }) + + it('should return access denied error node when Express mode returns AccessDeniedException', async function () { + const accessDeniedError = new Error("You don't have permissions to access this resource") + accessDeniedError.name = 'AccessDeniedException' + const updateChildrenStub = sinon.stub(spacesNode as any, 'updateChildren') + updateChildrenStub.rejects(accessDeniedError) + + const children = await spacesNode.getChildren() + + assert.strictEqual(children.length, 1) + assert.strictEqual(children[0].id, 'smusAccessDenied') + }) + + it('should return user profile error node when Express mode returns generic error', async function () { + const genericError = new Error('Failed to retrieve user profile information') + const updateChildrenStub = sinon.stub(spacesNode as any, 'updateChildren') + updateChildrenStub.rejects(genericError) + + const children = await spacesNode.getChildren() + + assert.strictEqual(children.length, 1) + assert.strictEqual(children[0].id, 'smusUserProfileError') + + const treeItem = await children[0].getTreeItem() + assert.strictEqual(treeItem.label, 'Failed to retrieve spaces. Please try again.') + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts new file mode 100644 index 00000000000..655165e4c3d --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts @@ -0,0 +1,1270 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import * as sinon from 'sinon' +import { DataZoneCustomClientHelper } from '../../../../sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper' +import * as DataZoneCustomClient from '../../../../sagemakerunifiedstudio/shared/client/datazonecustomclient' + +type DataZoneDomain = DataZoneCustomClient.Types.DomainSummary + +describe('DataZoneCustomClientHelper', () => { + let client: DataZoneCustomClientHelper + let mockAuthProvider: any + const testRegion = 'us-east-1' + + beforeEach(() => { + // Create mock auth provider + mockAuthProvider = { + isConnected: sinon.stub().returns(true), + onDidChangeActiveConnection: sinon.stub().returns({ + dispose: sinon.stub(), + }), + } as any + + // Clear instances and create new client + DataZoneCustomClientHelper.dispose() + client = DataZoneCustomClientHelper.getInstance(mockAuthProvider, testRegion) + }) + + afterEach(() => { + sinon.restore() + DataZoneCustomClientHelper.dispose() + }) + + describe('getInstance', () => { + it('should return singleton instance for same region', () => { + const instance1 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, testRegion) + const instance2 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, testRegion) + + assert.strictEqual(instance1, instance2) + }) + + it('should create different instances for different regions', () => { + const instance1 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, 'us-east-1') + const instance2 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, 'us-west-2') + + assert.notStrictEqual(instance1, instance2) + }) + + it('should create new instance after dispose', () => { + const instance1 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, testRegion) + DataZoneCustomClientHelper.dispose() + const instance2 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, testRegion) + + assert.notStrictEqual(instance1, instance2) + }) + }) + + describe('dispose', () => { + it('should clear all instances', () => { + const instance1 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, 'us-east-1') + const instance2 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, 'us-west-2') + + DataZoneCustomClientHelper.dispose() + + // Should create new instance after dispose + const newInstance1 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, 'us-east-1') + const newInstance2 = DataZoneCustomClientHelper.getInstance(mockAuthProvider, 'us-west-2') + + assert.notStrictEqual(instance1, newInstance1) + assert.notStrictEqual(instance2, newInstance2) + }) + }) + + describe('getRegion', () => { + it('should return configured region', () => { + const result = client.getRegion() + assert.strictEqual(result, testRegion) + }) + }) + + describe('listDomains', () => { + it('should list domains with pagination', async () => { + const mockResponse = { + items: [ + { + id: 'dzd_domain1', + name: 'Test Domain 1', + description: 'First test domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1', + managedAccountId: '123456789012', + status: 'AVAILABLE', + portalUrl: 'https://domain1.datazone.aws', + createdAt: new Date('2023-01-01T00:00:00Z'), + lastUpdatedAt: new Date('2023-01-02T00:00:00Z'), + domainVersion: '1.0', + preferences: { DOMAIN_MODE: 'STANDARD' }, + }, + ], + nextToken: 'next-token', + } + + const mockDataZoneClient = { + listDomains: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.listDomains({ + maxResults: 10, + status: 'AVAILABLE', + }) + + assert.strictEqual(result.domains.length, 1) + assert.strictEqual(result.domains[0].id, 'dzd_domain1') + assert.strictEqual(result.domains[0].name, 'Test Domain 1') + assert.strictEqual(result.domains[0].arn, 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1') + assert.strictEqual(result.domains[0].managedAccountId, '123456789012') + assert.strictEqual(result.domains[0].status, 'AVAILABLE') + assert.strictEqual(result.nextToken, 'next-token') + assert.ok(result.domains[0].createdAt instanceof Date) + assert.ok(result.domains[0].lastUpdatedAt instanceof Date) + }) + + it('should handle empty results', async () => { + const mockResponse = { + items: [], + nextToken: undefined, + } + + const mockDataZoneClient = { + listDomains: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.listDomains() + + assert.strictEqual(result.domains.length, 0) + assert.strictEqual(result.nextToken, undefined) + }) + + it('should handle API errors', async () => { + const error = new Error('API Error') + sinon.stub(client as any, 'getDataZoneCustomClient').rejects(error) + + await assert.rejects(() => client.listDomains(), error) + }) + }) + + describe('fetchAllDomains', () => { + it('should fetch all domains by handling pagination', async () => { + const listDomainsStub = sinon.stub() + + // First call returns first page with nextToken + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_domain1', + name: 'Domain 1', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1', + managedAccountId: '123456789012', + status: 'AVAILABLE', + createdAt: new Date(), + } as DataZoneDomain, + ], + nextToken: 'next-page-token', + }) + + // Second call returns second page with no nextToken + listDomainsStub.onSecondCall().resolves({ + domains: [ + { + id: 'dzd_domain2', + name: 'Domain 2', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain2', + managedAccountId: '123456789012', + status: 'AVAILABLE', + createdAt: new Date(), + } as DataZoneDomain, + ], + nextToken: undefined, + }) + + // Replace the listDomains method with our stub + client.listDomains = listDomainsStub + + const result = await client.fetchAllDomains({ status: 'AVAILABLE' }) + + assert.strictEqual(result.length, 2) + assert.strictEqual(result[0].id, 'dzd_domain1') + assert.strictEqual(result[1].id, 'dzd_domain2') + + // Verify listDomains was called correctly + assert.strictEqual(listDomainsStub.callCount, 2) + assert.deepStrictEqual(listDomainsStub.firstCall.args[0], { + status: 'AVAILABLE', + maxResults: 25, + nextToken: undefined, + }) + assert.deepStrictEqual(listDomainsStub.secondCall.args[0], { + status: 'AVAILABLE', + maxResults: 25, + nextToken: 'next-page-token', + }) + }) + + it('should return empty array when no domains found', async () => { + const listDomainsStub = sinon.stub().resolves({ + domains: [], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.fetchAllDomains() + + assert.strictEqual(result.length, 0) + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should handle errors gracefully', async () => { + const listDomainsStub = sinon.stub().rejects(new Error('API error')) + + client.listDomains = listDomainsStub + + await assert.rejects(() => client.fetchAllDomains(), /API error/) + }) + }) + + describe('getDomain', () => { + it('should find EXPRESS domain', async () => { + const listDomainsStub = sinon.stub() + + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_standard', + name: 'Standard Domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_standard', + managedAccountId: '123456789012', + status: 'AVAILABLE', + createdAt: new Date(), + preferences: { DOMAIN_MODE: 'STANDARD' }, + }, + { + id: 'dzd_express', + name: 'Express Domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_express', + managedAccountId: '123456789012', + status: 'AVAILABLE', + createdAt: new Date(), + preferences: { DOMAIN_MODE: 'EXPRESS' }, + }, + ] as DataZoneDomain[], + nextToken: 'next-token', + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.ok(result) + assert.strictEqual(result.id, 'dzd_express') + assert.strictEqual(result.name, 'Express Domain') + assert.strictEqual(result.preferences?.DOMAIN_MODE, 'EXPRESS') + + // Should only call once since EXPRESS domain found on first page + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should return undefined when no EXPRESS domain found', async () => { + const listDomainsStub = sinon.stub() + + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_standard', + name: 'Standard Domain', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_standard', + managedAccountId: '123456789012', + status: 'AVAILABLE', + createdAt: new Date(), + preferences: { DOMAIN_MODE: 'STANDARD' }, + }, + ] as DataZoneDomain[], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.strictEqual(result, undefined) + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should return undefined when no domains found', async () => { + const listDomainsStub = sinon.stub().resolves({ + domains: [], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.strictEqual(result, undefined) + assert.strictEqual(listDomainsStub.callCount, 1) + }) + + it('should handle domains without preferences', async () => { + const listDomainsStub = sinon.stub() + + listDomainsStub.onFirstCall().resolves({ + domains: [ + { + id: 'dzd_no_prefs', + name: 'Domain Without Preferences', + arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_no_prefs', + managedAccountId: '123456789012', + status: 'AVAILABLE', + createdAt: new Date(), + // No preferences field + }, + ] as DataZoneDomain[], + nextToken: undefined, + }) + + client.listDomains = listDomainsStub + + const result = await client.getExpressDomain() + + assert.strictEqual(result, undefined) + }) + + it('should handle API errors', async () => { + const listDomainsStub = sinon.stub().rejects(new Error('API error')) + + client.listDomains = listDomainsStub + + await assert.rejects(() => client.getExpressDomain(), /Failed to get domain info: API error/) + }) + }) + + describe('getDomain', () => { + it('should get domain by ID successfully', async () => { + const mockDomainId = 'dzd_test123' + const mockResponse = { + id: mockDomainId, + name: 'Test Domain', + description: 'A test domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + portalUrl: 'https://test.datazone.aws', + createdAt: '2023-01-01T00:00:00Z', + lastUpdatedAt: '2023-01-02T00:00:00Z', + domainVersion: '1.0', + preferences: { DOMAIN_MODE: 'EXPRESS' }, + } + const mockDataZoneClient = { + getDomain: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.getDomain(mockDomainId) + + assert.strictEqual(result.id, mockDomainId) + assert.strictEqual(result.name, 'Test Domain') + assert.strictEqual(result.description, 'A test domain') + assert.strictEqual(result.arn, `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`) + assert.strictEqual(result.status, 'AVAILABLE') + assert.strictEqual(result.portalUrl, 'https://test.datazone.aws') + assert.strictEqual(result.domainVersion, '1.0') + assert.deepStrictEqual(result.preferences, { DOMAIN_MODE: 'EXPRESS' }) + + // Verify the API was called with correct parameters + assert.ok(mockDataZoneClient.getDomain.calledOnce) + assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { + identifier: mockDomainId, + }) + }) + + it('should handle API errors when getting domain', async () => { + const mockDomainId = 'dzd_test123' + const error = new Error('Domain not found') + + const mockDataZoneClient = { + getDomain: sinon.stub().returns({ + promise: () => Promise.reject(error), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + await assert.rejects(() => client.getDomain(mockDomainId), error) + + // Verify the API was called with correct parameters + assert.ok(mockDataZoneClient.getDomain.calledOnce) + assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { + identifier: mockDomainId, + }) + }) + }) + + describe('isExpressDomain', () => { + it('should return true for EXPRESS domain', async () => { + const mockDomainId = 'dzd_express123' + const mockResponse = { + id: mockDomainId, + name: 'Express Domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'EXPRESS' }, + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, true) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + + it('should return false for STANDARD domain', async () => { + const mockDomainId = 'dzd_standard123' + const mockResponse = { + id: mockDomainId, + name: 'Standard Domain', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + preferences: { DOMAIN_MODE: 'STANDARD' }, + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, false) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + + it('should return false for domain without preferences', async () => { + const mockDomainId = 'dzd_no_prefs123' + const mockResponse = { + id: mockDomainId, + name: 'Domain Without Preferences', + arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, + status: 'AVAILABLE', + // No preferences field + } + + const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) + + const result = await client.isExpressDomain(mockDomainId) + + assert.strictEqual(result, false) + assert.ok(getDomainStub.calledOnce) + assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) + }) + }) + + describe('searchGroupProfiles', () => { + const mockDomainId = 'dzd_test123' + + it('should search group profiles successfully', async () => { + const mockResponse = { + items: [ + { + domainId: mockDomainId, + id: 'gp_profile1', + status: 'ACTIVATED', + groupName: 'AdminGroup', + rolePrincipalArn: 'arn:aws:iam::123456789012:role/AdminRole', + rolePrincipalId: 'AIDAI123456789EXAMPLE', + }, + { + domainId: mockDomainId, + id: 'gp_profile2', + status: 'ACTIVATED', + groupName: 'DeveloperGroup', + rolePrincipalArn: 'arn:aws:iam::123456789012:role/DeveloperRole', + rolePrincipalId: 'AIDAI987654321EXAMPLE', + }, + ], + nextToken: 'next-token', + } + + const mockDataZoneClient = { + searchGroupProfiles: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.searchGroupProfiles(mockDomainId, { + groupType: 'IAM_ROLE_SESSION_GROUP', + maxResults: 50, + }) + + assert.strictEqual(result.items.length, 2) + assert.strictEqual(result.items[0].id, 'gp_profile1') + assert.strictEqual(result.items[0].rolePrincipalArn, 'arn:aws:iam::123456789012:role/AdminRole') + assert.strictEqual(result.items[1].id, 'gp_profile2') + assert.strictEqual(result.nextToken, 'next-token') + + // Verify API was called with correct parameters + assert.ok(mockDataZoneClient.searchGroupProfiles.calledOnce) + const callArgs = mockDataZoneClient.searchGroupProfiles.firstCall.args[0] + assert.strictEqual(callArgs.domainIdentifier, mockDomainId) + assert.strictEqual(callArgs.groupType, 'IAM_ROLE_SESSION_GROUP') + assert.strictEqual(callArgs.maxResults, 50) + }) + + it('should handle empty results', async () => { + const mockResponse = { + items: [], + nextToken: undefined, + } + + const mockDataZoneClient = { + searchGroupProfiles: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.searchGroupProfiles(mockDomainId) + + assert.strictEqual(result.items.length, 0) + assert.strictEqual(result.nextToken, undefined) + }) + + it('should handle API errors', async () => { + const error = new Error('API Error') + const mockDataZoneClient = { + searchGroupProfiles: sinon.stub().returns({ + promise: () => Promise.reject(error), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + await assert.rejects(() => client.searchGroupProfiles(mockDomainId), error) + }) + + it('should support pagination with nextToken', async () => { + const mockResponse = { + items: [ + { + domainId: mockDomainId, + id: 'gp_profile3', + status: 'ACTIVATED', + groupName: 'TestGroup', + rolePrincipalArn: 'arn:aws:iam::123456789012:role/TestRole', + rolePrincipalId: 'AIDAI111111111EXAMPLE', + }, + ], + nextToken: undefined, + } + + const mockDataZoneClient = { + searchGroupProfiles: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.searchGroupProfiles(mockDomainId, { + nextToken: 'previous-token', + }) + + assert.strictEqual(result.items.length, 1) + assert.strictEqual(result.nextToken, undefined) + + // Verify nextToken was passed + const callArgs = mockDataZoneClient.searchGroupProfiles.firstCall.args[0] + assert.strictEqual(callArgs.nextToken, 'previous-token') + }) + }) + + describe('searchUserProfiles', () => { + const mockDomainId = 'dzd_test123' + + it('should search user profiles successfully', async () => { + const mockResponse = { + items: [ + { + domainId: mockDomainId, + id: 'up_user1', + type: 'IAM', + status: 'ACTIVATED', + details: { + iam: { + arn: 'arn:aws:iam::123456789012:role/AdminRole', + principalId: 'AIDAI123456789EXAMPLE:session1', + }, + }, + }, + { + domainId: mockDomainId, + id: 'up_user2', + type: 'IAM', + status: 'ACTIVATED', + details: { + iam: { + arn: 'arn:aws:iam::123456789012:role/DeveloperRole', + principalId: 'AIDAI987654321EXAMPLE:session2', + }, + }, + }, + ], + nextToken: 'next-token', + } + + const mockDataZoneClient = { + searchUserProfiles: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.searchUserProfiles(mockDomainId, { + userType: 'DATAZONE_IAM_USER', + maxResults: 50, + }) + + assert.strictEqual(result.items.length, 2) + assert.strictEqual(result.items[0].id, 'up_user1') + assert.strictEqual(result.items[0].details?.iam?.principalId, 'AIDAI123456789EXAMPLE:session1') + assert.strictEqual(result.items[1].id, 'up_user2') + assert.strictEqual(result.nextToken, 'next-token') + + // Verify API was called with correct parameters + assert.ok(mockDataZoneClient.searchUserProfiles.calledOnce) + const callArgs = mockDataZoneClient.searchUserProfiles.firstCall.args[0] + assert.strictEqual(callArgs.domainIdentifier, mockDomainId) + assert.strictEqual(callArgs.userType, 'DATAZONE_IAM_USER') + assert.strictEqual(callArgs.maxResults, 50) + }) + + it('should handle SSO user profiles', async () => { + const mockResponse = { + items: [ + { + domainId: mockDomainId, + id: 'up_sso_user', + type: 'SSO', + status: 'ACTIVATED', + details: { + sso: { + firstName: 'John', + lastName: 'Doe', + username: 'jdoe', + }, + }, + }, + ], + nextToken: undefined, + } + + const mockDataZoneClient = { + searchUserProfiles: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.searchUserProfiles(mockDomainId, { + userType: 'SSO_USER', + }) + + assert.strictEqual(result.items.length, 1) + assert.strictEqual(result.items[0].details?.sso?.username, 'jdoe') + assert.strictEqual(result.items[0].details?.sso?.firstName, 'John') + }) + + it('should handle empty results', async () => { + const mockResponse = { + items: [], + nextToken: undefined, + } + + const mockDataZoneClient = { + searchUserProfiles: sinon.stub().returns({ + promise: () => Promise.resolve(mockResponse), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + const result = await client.searchUserProfiles(mockDomainId, { + userType: 'DATAZONE_IAM_USER', + }) + + assert.strictEqual(result.items.length, 0) + assert.strictEqual(result.nextToken, undefined) + }) + + it('should handle API errors', async () => { + const error = new Error('API Error') + const mockDataZoneClient = { + searchUserProfiles: sinon.stub().returns({ + promise: () => Promise.reject(error), + }), + } + + sinon.stub(client as any, 'getDataZoneCustomClient').resolves(mockDataZoneClient) + + await assert.rejects( + () => + client.searchUserProfiles(mockDomainId, { + userType: 'DATAZONE_IAM_USER', + }), + error + ) + }) + }) + + describe('getGroupProfileId', () => { + const mockDomainId = 'dzd_test123' + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + + it('should find matching group profile on first page', async () => { + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.onFirstCall().resolves({ + items: [ + { + id: 'gp_profile1', + rolePrincipalArn: mockRoleArn, + status: 'ACTIVATED', + }, + ], + nextToken: undefined, + }) + + const result = await client.getGroupProfileId(mockDomainId, mockRoleArn) + + assert.strictEqual(result, 'gp_profile1') + assert.ok(searchStub.calledOnce) + assert.strictEqual(searchStub.firstCall.args[0], mockDomainId) + assert.strictEqual(searchStub.firstCall.args[1]?.groupType, 'IAM_ROLE_SESSION_GROUP') + }) + + it('should throw ToolkitError when no matching profile found', async () => { + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.resolves({ + items: [ + { + id: 'gp_profile1', + rolePrincipalArn: 'arn:aws:iam::123456789012:role/OtherRole', + status: 'ACTIVATED', + }, + ], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('No group profile found')) + assert.strictEqual(err.code, 'NoGroupProfileFound') + return true + } + ) + }) + + it('should handle API errors', async () => { + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.rejects(new Error('API Error')) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get group profile ID')) + return true + } + ) + }) + }) + + describe('getUserProfileIdForSession', () => { + const mockDomainId = 'dzd_test123' + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + + it('should find matching user profile by session name', async () => { + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.onFirstCall().resolves({ + items: [ + { + id: 'up_user1', + status: 'ACTIVATED', + details: { + iam: { + principalId: 'AIDAI123456789EXAMPLE:my-session', + }, + }, + }, + ], + nextToken: undefined, + }) + + const result = await client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn) + + assert.strictEqual(result, 'up_user1') + assert.ok(searchStub.calledOnce) + assert.strictEqual(searchStub.firstCall.args[0], mockDomainId) + assert.strictEqual(searchStub.firstCall.args[1].userType, 'DATAZONE_IAM_USER') + }) + + it('should find matching user profile across multiple pages', async () => { + const searchStub = sinon.stub(client, 'searchUserProfiles') + + // First page - no match + searchStub.onFirstCall().resolves({ + items: [ + { + id: 'up_user1', + status: 'ACTIVATED', + details: { + iam: { + principalId: 'AIDAI123456789EXAMPLE:other-session', + }, + }, + }, + ], + nextToken: 'next-token', + }) + + // Second page - match found + searchStub.onSecondCall().resolves({ + items: [ + { + id: 'up_user2', + status: 'ACTIVATED', + details: { + iam: { + principalId: 'AIDAI987654321EXAMPLE:my-session', + }, + }, + }, + ], + nextToken: undefined, + }) + + const result = await client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn) + + assert.strictEqual(result, 'up_user2') + assert.strictEqual(searchStub.callCount, 2) + }) + + it('should throw ToolkitError when session name cannot be extracted', async () => { + const invalidArn = 'arn:aws:iam::123456789012:role/AdminRole' + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, invalidArn), + (err: any) => { + assert.ok(err.message.includes('Unable to extract session name')) + assert.strictEqual(err.code, 'NoUserProfileFound') + return true + } + ) + }) + + it('should throw ToolkitError when no matching profile found', async () => { + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.resolves({ + items: [ + { + id: 'up_user1', + status: 'ACTIVATED', + details: { + iam: { + principalId: 'AIDAI123456789EXAMPLE:other-session', + }, + }, + }, + ], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('No user profile found')) + assert.strictEqual(err.code, 'NoUserProfileFound') + return true + } + ) + }) + + it('should handle profiles without IAM details', async () => { + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.resolves({ + items: [ + { + id: 'up_user1', + status: 'ACTIVATED', + details: { + // No iam field + }, + }, + ], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('No user profile found')) + return true + } + ) + }) + + it('should handle API errors', async () => { + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.rejects(new Error('API Error')) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get user profile ID')) + return true + } + ) + }) + + it('should handle various role ARN formats', async () => { + const testCases = [ + { + arn: 'arn:aws:sts::123456789012:assumed-role/MyRole/session-123', + expectedSession: 'session-123', + }, + { + arn: 'arn:aws:sts::123456789012:assumed-role/DeveloperRole/user-session-name', + expectedSession: 'user-session-name', + }, + { + arn: 'arn:aws:sts::999888777666:assumed-role/AdminRole/admin-session', + expectedSession: 'admin-session', + }, + ] + + for (const testCase of testCases) { + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.resolves({ + items: [ + { + id: 'up_test', + status: 'ACTIVATED', + details: { + iam: { + principalId: `PRINCIPAL:${testCase.expectedSession}`, + }, + }, + }, + ], + nextToken: undefined, + }) + + const result = await client.getUserProfileIdForSession(mockDomainId, testCase.arn) + assert.strictEqual(result, 'up_test') + + searchStub.restore() + } + }) + }) + + describe('Project and Space Filtering', () => { + const mockDomainId = 'dzd_test123' + + describe('Project filtering by group profile', () => { + it('should filter projects when group profile is found', async () => { + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + const mockGroupProfileId = 'gp_profile1' + + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.resolves({ + items: [ + { + id: mockGroupProfileId, + rolePrincipalArn: mockRoleArn, + status: 'ACTIVATED', + }, + ], + nextToken: undefined, + }) + + const result = await client.getGroupProfileId(mockDomainId, mockRoleArn) + + assert.strictEqual(result, mockGroupProfileId) + assert.ok(searchStub.calledOnce) + }) + + it('should handle empty project list for group profile', async () => { + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.resolves({ + items: [], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('No group profile found')) + assert.strictEqual(err.code, 'NoGroupProfileFound') + return true + } + ) + }) + + it('should handle API errors during project filtering', async () => { + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.rejects(new Error('API Error')) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get group profile ID')) + return true + } + ) + }) + + it('should handle AccessDeniedException during project filtering', async () => { + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + const accessDeniedError = new Error('Access denied') + accessDeniedError.name = 'AccessDeniedException' + + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.rejects(accessDeniedError) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get group profile ID')) + return true + } + ) + }) + }) + + describe('Space filtering by user profile', () => { + it('should filter spaces when user profile is found', async () => { + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + const mockUserProfileId = 'up_user1' + + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.resolves({ + items: [ + { + id: mockUserProfileId, + status: 'ACTIVATED', + details: { + iam: { + principalId: 'AIDAI123456789EXAMPLE:my-session', + }, + }, + }, + ], + nextToken: undefined, + }) + + const result = await client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn) + + assert.strictEqual(result, mockUserProfileId) + assert.ok(searchStub.calledOnce) + }) + + it('should handle empty space list for user profile', async () => { + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.resolves({ + items: [], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('No user profile found')) + assert.strictEqual(err.code, 'NoUserProfileFound') + return true + } + ) + }) + + it('should handle API errors during space filtering', async () => { + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.rejects(new Error('API Error')) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get user profile ID')) + return true + } + ) + }) + + it('should handle AccessDeniedException during space filtering', async () => { + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + const accessDeniedError = new Error('Access denied') + accessDeniedError.name = 'AccessDeniedException' + + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.rejects(accessDeniedError) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get user profile ID')) + return true + } + ) + }) + + it('should handle profiles with missing principalId', async () => { + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.resolves({ + items: [ + { + id: 'up_user1', + status: 'ACTIVATED', + details: { + iam: { + // Missing principalId + }, + }, + }, + ], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('No user profile found')) + return true + } + ) + }) + }) + + describe('Error scenarios in filtering logic', () => { + it('should handle network errors during group profile search', async () => { + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + const networkError = new Error('Network error') + networkError.name = 'NetworkError' + + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.rejects(networkError) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get group profile ID')) + return true + } + ) + }) + + it('should handle network errors during user profile search', async () => { + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + const networkError = new Error('Network error') + networkError.name = 'NetworkError' + + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.rejects(networkError) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get user profile ID')) + return true + } + ) + }) + + it('should handle timeout errors during group profile search', async () => { + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + const timeoutError = new Error('Request timeout') + timeoutError.name = 'TimeoutError' + + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.rejects(timeoutError) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('Failed to get group profile ID')) + return true + } + ) + }) + + it('should handle malformed response during group profile search', async () => { + const mockRoleArn = 'arn:aws:iam::123456789012:role/AdminRole' + + const searchStub = sinon.stub(client, 'searchGroupProfiles') + searchStub.resolves({ + items: [ + { + // Missing required fields + status: 'ACTIVATED', + } as any, + ], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getGroupProfileId(mockDomainId, mockRoleArn), + (err: any) => { + assert.ok(err.message.includes('No group profile found')) + return true + } + ) + }) + + it('should handle malformed response during user profile search', async () => { + const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' + + const searchStub = sinon.stub(client, 'searchUserProfiles') + searchStub.resolves({ + items: [ + { + // Missing required fields + status: 'ACTIVATED', + } as any, + ], + nextToken: undefined, + }) + + await assert.rejects( + () => client.getUserProfileIdForSession(mockDomainId, mockAssumedRoleArn), + (err: any) => { + assert.ok(err.message.includes('No user profile found')) + return true + } + ) + }) + }) + }) +}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts deleted file mode 100644 index a036adb9b7e..00000000000 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient.test.ts +++ /dev/null @@ -1,467 +0,0 @@ -/*! - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -import * as assert from 'assert' -import * as sinon from 'sinon' -import { - DataZoneDomainPreferencesClient, - DataZoneDomain, -} from '../../../../sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient' - -describe('DataZoneDomainPreferencesClient', () => { - let client: DataZoneDomainPreferencesClient - let mockAuthProvider: any - const testRegion = 'us-east-1' - - beforeEach(() => { - // Create mock auth provider - mockAuthProvider = { - isConnected: sinon.stub().returns(true), - onDidChangeActiveConnection: sinon.stub().returns({ - dispose: sinon.stub(), - }), - } as any - - // Clear instances and create new client - DataZoneDomainPreferencesClient.dispose() - client = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) - }) - - afterEach(() => { - sinon.restore() - DataZoneDomainPreferencesClient.dispose() - }) - - describe('getInstance', () => { - it('should return singleton instance for same region', () => { - const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) - const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) - - assert.strictEqual(instance1, instance2) - }) - - it('should create different instances for different regions', () => { - const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-east-1') - const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-west-2') - - assert.notStrictEqual(instance1, instance2) - }) - - it('should create new instance after dispose', () => { - const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) - DataZoneDomainPreferencesClient.dispose() - const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, testRegion) - - assert.notStrictEqual(instance1, instance2) - }) - }) - - describe('dispose', () => { - it('should clear all instances', () => { - const instance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-east-1') - const instance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-west-2') - - DataZoneDomainPreferencesClient.dispose() - - // Should create new instance after dispose - const newInstance1 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-east-1') - const newInstance2 = DataZoneDomainPreferencesClient.getInstance(mockAuthProvider, 'us-west-2') - - assert.notStrictEqual(instance1, newInstance1) - assert.notStrictEqual(instance2, newInstance2) - }) - }) - - describe('getRegion', () => { - it('should return configured region', () => { - const result = client.getRegion() - assert.strictEqual(result, testRegion) - }) - }) - - describe('listDomains', () => { - it('should list domains with pagination', async () => { - const mockResponse = { - items: [ - { - id: 'dzd_domain1', - name: 'Test Domain 1', - description: 'First test domain', - arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1', - managedAccountId: '123456789012', - status: 'AVAILABLE', - portalUrl: 'https://domain1.datazone.aws', - createdAt: '2023-01-01T00:00:00Z', - lastUpdatedAt: '2023-01-02T00:00:00Z', - domainVersion: '1.0', - preferences: { DOMAIN_MODE: 'STANDARD' }, - }, - ], - nextToken: 'next-token', - } - - const mockDataZoneClient = { - listDomains: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), - } - - sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) - - const result = await client.listDomains({ - maxResults: 10, - status: 'AVAILABLE', - }) - - assert.strictEqual(result.domains.length, 1) - assert.strictEqual(result.domains[0].id, 'dzd_domain1') - assert.strictEqual(result.domains[0].name, 'Test Domain 1') - assert.strictEqual(result.domains[0].arn, 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1') - assert.strictEqual(result.domains[0].managedAccountId, '123456789012') - assert.strictEqual(result.domains[0].status, 'AVAILABLE') - assert.strictEqual(result.nextToken, 'next-token') - assert.ok(result.domains[0].createdAt instanceof Date) - assert.ok(result.domains[0].lastUpdatedAt instanceof Date) - }) - - it('should handle empty results', async () => { - const mockResponse = { - items: [], - nextToken: undefined, - } - - const mockDataZoneClient = { - listDomains: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), - } - - sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) - - const result = await client.listDomains() - - assert.strictEqual(result.domains.length, 0) - assert.strictEqual(result.nextToken, undefined) - }) - - it('should handle API errors', async () => { - const error = new Error('API Error') - sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').rejects(error) - - await assert.rejects(() => client.listDomains(), error) - }) - }) - - describe('fetchAllDomains', () => { - it('should fetch all domains by handling pagination', async () => { - const listDomainsStub = sinon.stub() - - // First call returns first page with nextToken - listDomainsStub.onFirstCall().resolves({ - domains: [ - { - id: 'dzd_domain1', - name: 'Domain 1', - arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain1', - managedAccountId: '123456789012', - status: 'AVAILABLE', - } as DataZoneDomain, - ], - nextToken: 'next-page-token', - }) - - // Second call returns second page with no nextToken - listDomainsStub.onSecondCall().resolves({ - domains: [ - { - id: 'dzd_domain2', - name: 'Domain 2', - arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_domain2', - managedAccountId: '123456789012', - status: 'AVAILABLE', - } as DataZoneDomain, - ], - nextToken: undefined, - }) - - // Replace the listDomains method with our stub - client.listDomains = listDomainsStub - - const result = await client.fetchAllDomains({ status: 'AVAILABLE' }) - - assert.strictEqual(result.length, 2) - assert.strictEqual(result[0].id, 'dzd_domain1') - assert.strictEqual(result[1].id, 'dzd_domain2') - - // Verify listDomains was called correctly - assert.strictEqual(listDomainsStub.callCount, 2) - assert.deepStrictEqual(listDomainsStub.firstCall.args[0], { - status: 'AVAILABLE', - maxResults: 25, - nextToken: undefined, - }) - assert.deepStrictEqual(listDomainsStub.secondCall.args[0], { - status: 'AVAILABLE', - maxResults: 25, - nextToken: 'next-page-token', - }) - }) - - it('should return empty array when no domains found', async () => { - const listDomainsStub = sinon.stub().resolves({ - domains: [], - nextToken: undefined, - }) - - client.listDomains = listDomainsStub - - const result = await client.fetchAllDomains() - - assert.strictEqual(result.length, 0) - assert.strictEqual(listDomainsStub.callCount, 1) - }) - - it('should handle errors gracefully', async () => { - const listDomainsStub = sinon.stub().rejects(new Error('API error')) - - client.listDomains = listDomainsStub - - await assert.rejects(() => client.fetchAllDomains(), /API error/) - }) - }) - - describe('getDomain', () => { - it('should find EXPRESS domain', async () => { - const listDomainsStub = sinon.stub() - - listDomainsStub.onFirstCall().resolves({ - domains: [ - { - id: 'dzd_standard', - name: 'Standard Domain', - arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_standard', - managedAccountId: '123456789012', - status: 'AVAILABLE', - preferences: { DOMAIN_MODE: 'STANDARD' }, - }, - { - id: 'dzd_express', - name: 'Express Domain', - arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_express', - managedAccountId: '123456789012', - status: 'AVAILABLE', - preferences: { DOMAIN_MODE: 'EXPRESS' }, - }, - ] as DataZoneDomain[], - nextToken: 'next-token', - }) - - client.listDomains = listDomainsStub - - const result = await client.getExpressDomain() - - assert.ok(result) - assert.strictEqual(result.id, 'dzd_express') - assert.strictEqual(result.name, 'Express Domain') - assert.strictEqual(result.preferences.DOMAIN_MODE, 'EXPRESS') - - // Should only call once since EXPRESS domain found on first page - assert.strictEqual(listDomainsStub.callCount, 1) - }) - - it('should return undefined when no EXPRESS domain found', async () => { - const listDomainsStub = sinon.stub() - - listDomainsStub.onFirstCall().resolves({ - domains: [ - { - id: 'dzd_standard', - name: 'Standard Domain', - arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_standard', - managedAccountId: '123456789012', - status: 'AVAILABLE', - preferences: { DOMAIN_MODE: 'STANDARD' }, - }, - ] as DataZoneDomain[], - nextToken: undefined, - }) - - client.listDomains = listDomainsStub - - const result = await client.getExpressDomain() - - assert.strictEqual(result, undefined) - assert.strictEqual(listDomainsStub.callCount, 1) - }) - - it('should return undefined when no domains found', async () => { - const listDomainsStub = sinon.stub().resolves({ - domains: [], - nextToken: undefined, - }) - - client.listDomains = listDomainsStub - - const result = await client.getExpressDomain() - - assert.strictEqual(result, undefined) - assert.strictEqual(listDomainsStub.callCount, 1) - }) - - it('should handle domains without preferences', async () => { - const listDomainsStub = sinon.stub() - - listDomainsStub.onFirstCall().resolves({ - domains: [ - { - id: 'dzd_no_prefs', - name: 'Domain Without Preferences', - arn: 'arn:aws:datazone:us-east-1:123456789012:domain/dzd_no_prefs', - managedAccountId: '123456789012', - status: 'AVAILABLE', - // No preferences field - }, - ] as DataZoneDomain[], - nextToken: undefined, - }) - - client.listDomains = listDomainsStub - - const result = await client.getExpressDomain() - - assert.strictEqual(result, undefined) - }) - - it('should handle API errors', async () => { - const listDomainsStub = sinon.stub().rejects(new Error('API error')) - - client.listDomains = listDomainsStub - - await assert.rejects(() => client.getExpressDomain(), /Failed to get domain info: API error/) - }) - }) - - describe('getDomain', () => { - it('should get domain by ID successfully', async () => { - const mockDomainId = 'dzd_test123' - const mockResponse = { - id: mockDomainId, - name: 'Test Domain', - description: 'A test domain', - arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, - status: 'AVAILABLE', - portalUrl: 'https://test.datazone.aws', - createdAt: '2023-01-01T00:00:00Z', - lastUpdatedAt: '2023-01-02T00:00:00Z', - domainVersion: '1.0', - preferences: { DOMAIN_MODE: 'EXPRESS' }, - } - const mockDataZoneClient = { - getDomain: sinon.stub().returns({ - promise: () => Promise.resolve(mockResponse), - }), - } - - sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) - - const result = await client.getDomain(mockDomainId) - - assert.strictEqual(result.id, mockDomainId) - assert.strictEqual(result.name, 'Test Domain') - assert.strictEqual(result.description, 'A test domain') - assert.strictEqual(result.arn, `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`) - assert.strictEqual(result.status, 'AVAILABLE') - assert.strictEqual(result.portalUrl, 'https://test.datazone.aws') - assert.strictEqual(result.domainVersion, '1.0') - assert.deepStrictEqual(result.preferences, { DOMAIN_MODE: 'EXPRESS' }) - - // Verify the API was called with correct parameters - assert.ok(mockDataZoneClient.getDomain.calledOnce) - assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { - identifier: mockDomainId, - }) - }) - - it('should handle API errors when getting domain', async () => { - const mockDomainId = 'dzd_test123' - const error = new Error('Domain not found') - - const mockDataZoneClient = { - getDomain: sinon.stub().returns({ - promise: () => Promise.reject(error), - }), - } - - sinon.stub(client as any, 'getDataZoneDomainPreferencesClient').resolves(mockDataZoneClient) - - await assert.rejects(() => client.getDomain(mockDomainId), error) - - // Verify the API was called with correct parameters - assert.ok(mockDataZoneClient.getDomain.calledOnce) - assert.deepStrictEqual(mockDataZoneClient.getDomain.firstCall.args[0], { - identifier: mockDomainId, - }) - }) - }) - - describe('isExpressDomain', () => { - it('should return true for EXPRESS domain', async () => { - const mockDomainId = 'dzd_express123' - const mockResponse = { - id: mockDomainId, - name: 'Express Domain', - arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, - status: 'AVAILABLE', - preferences: { DOMAIN_MODE: 'EXPRESS' }, - } - - const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) - - const result = await client.isExpressDomain(mockDomainId) - - assert.strictEqual(result, true) - assert.ok(getDomainStub.calledOnce) - assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) - }) - - it('should return false for STANDARD domain', async () => { - const mockDomainId = 'dzd_standard123' - const mockResponse = { - id: mockDomainId, - name: 'Standard Domain', - arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, - status: 'AVAILABLE', - preferences: { DOMAIN_MODE: 'STANDARD' }, - } - - const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) - - const result = await client.isExpressDomain(mockDomainId) - - assert.strictEqual(result, false) - assert.ok(getDomainStub.calledOnce) - assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) - }) - - it('should return false for domain without preferences', async () => { - const mockDomainId = 'dzd_no_prefs123' - const mockResponse = { - id: mockDomainId, - name: 'Domain Without Preferences', - arn: `arn:aws:datazone:us-east-1:123456789012:domain/${mockDomainId}`, - status: 'AVAILABLE', - // No preferences field - } - - const getDomainStub = sinon.stub(client, 'getDomain').resolves(mockResponse) - - const result = await client.isExpressDomain(mockDomainId) - - assert.strictEqual(result, false) - assert.ok(getDomainStub.calledOnce) - assert.strictEqual(getDomainStub.firstCall.args[0], mockDomainId) - }) - }) -}) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts index 65dc98f415a..ad14344f3eb 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/smusUtils.test.ts @@ -463,71 +463,6 @@ describe('SmusUtils', () => { }) }) - describe('isInSmusExpressMode', () => { - let mockCredentialsProvider: any - let mockDomainPreferencesClient: any - let getInstanceStub: sinon.SinonStub - - const testDomainId = 'dzd_test123' - const testRegion = 'us-east-1' - - beforeEach(() => { - // Mock credentials provider - mockCredentialsProvider = { - getCredentials: sinon.stub().resolves({ - accessKeyId: 'test-key', - secretAccessKey: 'test-secret', - sessionToken: 'test-token', - }), - getCredentialsId: sinon.stub().returns({ credentialSource: 'test', credentialTypeId: 'test' }), - getProviderType: sinon.stub().returns('test'), - getTelemetryType: sinon.stub().returns('other'), - getDefaultRegion: sinon.stub().returns(testRegion), - getHashCode: sinon.stub().returns('test-hash'), - canAutoConnect: sinon.stub().resolves(false), - isAvailable: sinon.stub().resolves(true), - } - - // Mock DataZoneDomainPreferencesClient - mockDomainPreferencesClient = { - isExpressDomain: sinon.stub(), - } - - // Stub the getInstance method - getInstanceStub = sinon - .stub( - require('../../../sagemakerunifiedstudio/shared/client/datazoneDomainPreferencesClient') - .DataZoneDomainPreferencesClient, - 'getInstance' - ) - .returns(mockDomainPreferencesClient) - }) - - afterEach(() => { - sinon.restore() - }) - - it('should return true when domain is in Express mode', async () => { - mockDomainPreferencesClient.isExpressDomain.resolves(true) - - const result = await SmusUtils.isInSmusExpressMode(testDomainId, testRegion, mockCredentialsProvider) - - assert.strictEqual(result, true) - assert.ok(getInstanceStub.calledWith(mockCredentialsProvider, testRegion)) - assert.ok(mockDomainPreferencesClient.isExpressDomain.calledWith(testDomainId)) - }) - - it('should return false when domain is not in Express mode', async () => { - mockDomainPreferencesClient.isExpressDomain.resolves(false) - - const result = await SmusUtils.isInSmusExpressMode(testDomainId, testRegion, mockCredentialsProvider) - - assert.strictEqual(result, false) - assert.ok(getInstanceStub.calledWith(mockCredentialsProvider, testRegion)) - assert.ok(mockDomainPreferencesClient.isExpressDomain.calledWith(testDomainId)) - }) - }) - describe('convertAssumedRoleArnToIamRoleArn', () => { it('should convert basic assumed role ARN to IAM role ARN', () => { const stsArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/MySession' From 06427bbe67bd1fe677b9877de15273a9a69e60aa Mon Sep 17 00:00:00 2001 From: Bhargav Date: Mon, 3 Nov 2025 14:36:59 -0800 Subject: [PATCH 25/53] Merge staging into feature/smus m2 (#2278) ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- Co-authored-by: David <60020664+dhasani23@users.noreply.github.com> Co-authored-by: David Hasani Co-authored-by: aws-ides-bot Co-authored-by: Arkaprava De Co-authored-by: Arkaprava De Co-authored-by: Keyu Wu Co-authored-by: chungjac Co-authored-by: aws-asolidu Co-authored-by: Newton Der Co-authored-by: Newton Der Co-authored-by: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Co-authored-by: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Co-authored-by: Boyu Co-authored-by: atontb <104926752+atonaamz@users.noreply.github.com> Co-authored-by: kzr Co-authored-by: Richard Li <742829+rli@users.noreply.github.com> Co-authored-by: Shruti Sinha <44882001+shruti0085@users.noreply.github.com> Co-authored-by: Roger Zhang Co-authored-by: aws-toolkit-automation <43144436+aws-toolkit-automation@users.noreply.github.com> Co-authored-by: Tai Lai Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> Co-authored-by: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Co-authored-by: BlakeLazarine Co-authored-by: Blake Lazarine Co-authored-by: tobixlea Co-authored-by: Sherry Lu <75588211+XiaoxuanLu@users.noreply.github.com> Co-authored-by: seshubaws <116689586+seshubaws@users.noreply.github.com> Co-authored-by: Bhavya Sharma Co-authored-by: Bhargava Varadharajan --- package-lock.json | 13008 +++++++++++----- packages/amazonq/.changes/1.101.0.json | 5 + packages/amazonq/.changes/1.102.0.json | 5 + ...-ab31cbb6-3fe4-4ee3-a0a3-290430277856.json | 4 + packages/amazonq/CHANGELOG.md | 8 + packages/amazonq/package.json | 54 +- .../service/codewhisperer.test.ts | 7 +- packages/core/package.json | 27 +- packages/core/package.nls.json | 3 +- .../chat/controller/controller.ts | 8 +- .../chat/controller/messenger/messenger.ts | 21 +- .../accessanalyzer/vue/constants.ts | 2 - .../accessanalyzer/vue/iamPolicyChecks.ts | 161 +- .../awsService/apigateway/commands/copyUrl.ts | 2 +- .../apigateway/explorer/apiGatewayNodes.ts | 2 +- .../apigateway/explorer/apiNodes.ts | 2 +- .../apigateway/vue/invokeRemoteRestApi.ts | 2 +- .../src/awsService/appBuilder/activation.ts | 3 + .../appBuilder/explorer/nodes/deployedNode.ts | 14 +- .../appBuilder/explorer/samProject.ts | 3 +- .../appBuilder/lambda2sam/lambda2sam.ts | 17 +- .../core/src/awsService/appBuilder/utils.ts | 131 +- packages/core/src/awsService/ec2/utils.ts | 4 +- packages/core/src/awsService/ecs/model.ts | 10 +- packages/core/src/awsService/ecs/util.ts | 17 +- .../iot/commands/attachCertificate.ts | 10 +- .../awsService/iot/commands/attachPolicy.ts | 10 +- .../src/awsService/iot/commands/createCert.ts | 4 +- .../awsService/iot/explorer/iotPolicyNode.ts | 4 +- .../iot/explorer/iotPolicyVersionNode.ts | 6 +- .../explorer/redshiftWarehouseNode.ts | 2 +- .../notebook/redshiftNotebookController.ts | 10 +- .../redshift/wizards/connectionWizard.ts | 4 +- .../core/src/awsService/sagemaker/commands.ts | 46 +- .../sagemaker/detached-server/utils.ts | 10 +- .../sagemaker/explorer/sagemakerParentNode.ts | 4 +- .../core/src/awsService/sagemaker/model.ts | 12 +- packages/core/src/codecatalyst/utils.ts | 4 +- .../src/codecatalyst/vue/create/backend.ts | 2 +- .../commands/startSecurityScan.ts | 5 +- .../commands/startTransformByQ.ts | 7 +- .../core/src/codewhisperer/models/model.ts | 12 +- .../region/regionProfileManager.ts | 5 +- .../service/recommendationHandler.ts | 18 +- .../transformByQ/transformApiHandler.ts | 19 +- .../transformationHistoryHandler.ts | 35 +- .../transformationHubViewProvider.ts | 15 + .../view/connector/connector.ts | 3 +- .../dynamicResources/commands/saveResource.ts | 4 +- .../explorer/nodes/resourceTypeNode.ts | 17 +- .../commands/downloadSchemaItemCode.ts | 8 +- .../eventSchemas/explorer/registryItemNode.ts | 6 +- .../eventSchemas/explorer/schemaItemNode.ts | 9 +- .../eventSchemas/models/schemaCodeLangs.ts | 2 +- .../providers/schemasDataProvider.ts | 4 +- packages/core/src/eventSchemas/utils.ts | 8 +- .../src/eventSchemas/vue/searchSchemas.ts | 6 +- packages/core/src/lambda/activation.ts | 4 +- .../core/src/lambda/commands/copyLambdaUrl.ts | 16 +- .../src/lambda/commands/createNewSamApp.ts | 11 +- .../core/src/lambda/commands/deleteLambda.ts | 2 +- .../core/src/lambda/commands/uploadLambda.ts | 2 +- .../lambda/explorer/cloudFormationNodes.ts | 10 +- .../src/lambda/explorer/lambdaFunctionNode.ts | 6 +- .../core/src/lambda/explorer/lambdaNodes.ts | 8 +- .../src/lambda/models/samLambdaRuntime.ts | 23 +- .../core/src/lambda/models/samTemplates.ts | 2 +- .../lambda/remoteDebugging/lambdaDebugger.ts | 14 +- .../src/lambda/remoteDebugging/ldkClient.ts | 57 +- .../lambda/remoteDebugging/ldkController.ts | 20 +- .../localStackLambdaDebugger.ts | 8 +- .../remoteDebugging/remoteLambdaDebugger.ts | 10 +- .../core/src/lambda/remoteDebugging/utils.ts | 17 +- packages/core/src/lambda/utils.ts | 8 +- .../lambda/vue/remoteInvoke/invokeLambda.ts | 27 +- .../lambda/vue/remoteInvoke/remoteInvoke.vue | 8 +- .../core/src/lambda/wizards/samInitWizard.ts | 4 +- .../core/src/shared/activationReloadState.ts | 4 +- .../src/shared/clients/codecatalystClient.ts | 28 +- .../src/shared/clients/ec2MetadataClient.ts | 102 +- packages/core/src/shared/clients/ecrClient.ts | 57 +- packages/core/src/shared/clients/ecsClient.ts | 111 +- packages/core/src/shared/clients/iotClient.ts | 272 +- .../core/src/shared/clients/lambdaClient.ts | 156 +- .../core/src/shared/clients/redshiftClient.ts | 122 +- .../core/src/shared/clients/schemaClient.ts | 110 +- .../shared/clients/secretsManagerClient.ts | 25 +- .../src/shared/clients/ssmDocumentClient.ts | 100 +- packages/core/src/shared/clients/stsClient.ts | 57 +- packages/core/src/shared/errors.ts | 4 + packages/core/src/shared/extensions/ssh.ts | 4 +- .../core/src/shared/fs/templateRegistry.ts | 3 +- .../core/src/shared/sam/cli/samCliInit.ts | 2 +- .../src/shared/sam/cli/samCliLocalInvoke.ts | 2 +- .../sam/debugger/awsSamDebugConfiguration.ts | 2 +- .../awsSamDebugConfigurationValidator.ts | 10 +- .../src/shared/sam/debugger/awsSamDebugger.ts | 9 +- .../src/shared/sam/debugger/pythonSamDebug.ts | 4 +- .../core/src/shared/sam/localLambdaRunner.ts | 5 +- packages/core/src/shared/sam/utils.ts | 3 +- .../src/shared/telemetry/vscodeTelemetry.json | 14 + .../core/src/shared/ui/sam/stackPrompter.ts | 7 +- .../core/src/shared/utilities/cliUtils.ts | 22 +- .../ssmDocument/commands/openDocumentItem.ts | 6 +- .../ssmDocument/commands/publishDocument.ts | 6 +- .../commands/updateDocumentVersion.ts | 4 +- .../ssmDocument/explorer/documentItemNode.ts | 15 +- .../explorer/documentItemNodeWriteable.ts | 10 +- .../ssmDocument/explorer/registryItemNode.ts | 8 +- .../wizards/publishDocumentWizard.ts | 6 +- .../src/stepFunctions/workflowStudio/types.ts | 8 +- .../transformationJobHistory.test.ts | 56 +- .../accessanalyzer/iamPolicyChecks.test.ts | 9 +- .../commands/invokeRemoteRestApi.test.ts | 2 +- .../lambda2sam/lambda2samCoreLogic.test.ts | 6 +- .../test/awsService/appBuilder/utils.test.ts | 48 +- .../awsService/appBuilder/walkthrough.test.ts | 18 + .../document/logDataDocumentProvider.test.ts | 2 +- .../registry/logDataRegistry.test.ts | 6 +- .../iot/commands/attachCertificate.test.ts | 10 +- .../iot/commands/createCert.test.ts | 4 +- .../iot/commands/deletePolicy.test.ts | 10 +- .../iot/explorer/iotCertFolderNode.test.ts | 4 +- .../iot/explorer/iotCertificateNode.test.ts | 4 +- .../iot/explorer/iotPolicyFolderNode.test.ts | 4 +- .../iot/explorer/iotPolicyNode.test.ts | 8 +- .../iot/explorer/iotPolicyVersionNode.test.ts | 6 +- .../iot/explorer/iotThingFolderNode.test.ts | 4 +- .../iot/explorer/iotThingNode.test.ts | 4 +- .../explorer/redshiftDatabaseNode.test.ts | 23 +- .../redshift/explorer/redshiftNode.test.ts | 76 +- .../explorer/redshiftSchemaNode.test.ts | 39 +- .../explorer/redshiftWarehouseNode.test.ts | 36 +- .../redshiftNotebookController.test.ts | 13 +- .../test/awsService/sagemaker/model.test.ts | 22 + .../commands/transformByQ.test.ts | 4 +- .../codewhisperer/startSecurityScan.test.ts | 136 +- .../provider/ecsCredentialsProvider.test.ts | 4 +- .../explorer/resourceTypeNode.test.ts | 4 +- .../commands/downloadSchemaItemCode.test.ts | 30 +- .../commands/searchSchemas.test.ts | 14 +- .../commands/viewSchemaItem.test.ts | 5 +- .../explorer/registryItemNode.test.ts | 12 +- .../model/schemaCodeLangs.test.ts | 3 +- .../lambda/commands/copyLambdaUrl.test.ts | 16 +- .../lambda/commands/createNewSamApp.test.ts | 2 +- .../lambda/local/debugConfiguration.test.ts | 2 +- .../lambda/models/samLambdaRuntime.test.ts | 10 +- .../test/lambda/models/samTemplates.test.ts | 3 +- .../lambda/remoteDebugging/ldkClient.test.ts | 144 +- .../remoteDebugging/ldkController.test.ts | 24 +- .../localStackLambdaDebugger.test.ts | 6 +- .../test/lambda/remoteDebugging/testUtils.ts | 12 +- packages/core/src/test/lambda/utils.test.ts | 3 +- .../vue/remoteInvoke/invokeLambda.test.ts | 14 +- .../invokeLambdaDebugging.test.ts | 17 +- .../vue/remoteInvoke/remoteInvoke.test.ts | 8 +- packages/core/src/test/setupUtil.ts | 32 +- .../test/shared/activationReloadState.test.ts | 7 +- .../explorer/nodes/deployedNode.test.ts | 3 +- .../explorer/nodes/resourceNode.test.ts | 2 +- .../shared/clients/defaultIotClient.test.ts | 343 +- .../clients/defaultRedshiftClient.test.ts | 135 +- .../src/test/shared/defaultAwsContext.test.ts | 4 +- .../test/shared/extensionUtilities.test.ts | 6 +- .../src/test/shared/extensions/ssh.test.ts | 10 +- .../core/src/test/shared/sam/build.test.ts | 3 + .../debugger/samDebugConfigProvider.test.ts | 7 +- .../core/src/test/shared/sam/sync.test.ts | 4 +- .../core/src/test/shared/sshConfig.test.ts | 2 +- .../commands/deleteDocument.test.ts | 6 +- .../commands/openDocumentItem.test.ts | 12 +- .../commands/publishDocument.test.ts | 13 +- .../commands/updateDocumentVersion.test.ts | 8 +- .../explorer/documentItemNode.test.ts | 4 +- .../src/testE2E/codecatalyst/client.test.ts | 6 +- .../appBuilder/sidebar/appBuilderNode.test.ts | 8 +- packages/core/src/testInteg/sam.test.ts | 10 +- packages/toolkit/.changes/3.81.0.json | 5 + packages/toolkit/.changes/3.82.0.json | 10 + packages/toolkit/CHANGELOG.md | 8 + packages/toolkit/package.json | 15 +- 182 files changed, 11200 insertions(+), 5736 deletions(-) create mode 100644 packages/amazonq/.changes/1.101.0.json create mode 100644 packages/amazonq/.changes/1.102.0.json create mode 100644 packages/amazonq/.changes/next-release/Feature-ab31cbb6-3fe4-4ee3-a0a3-290430277856.json create mode 100644 packages/toolkit/.changes/3.81.0.json create mode 100644 packages/toolkit/.changes/3.82.0.json diff --git a/package-lock.json b/package-lock.json index 627dba549de..7ad26d71ac9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1118,444 +1118,472 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-api-gateway": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-accessanalyzer/-/client-accessanalyzer-3.888.0.tgz", + "integrity": "sha512-wtyBy3z2sUvuJxEcQhere+ttQWIVx5GauJaYahWAWBRhuZIkqMMebKC0ofJMBSEGTRXL98L3G96pCwoIffFbBw==", "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.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-sdk-api-gateway": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-stream": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-node": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/client-sso": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.888.0.tgz", + "integrity": "sha512-8CLy/ehGKUmekjH+VtZJ4w40PqDg3u0K7uPziq/4P8Q7LLgsy8YQoHNbuY4am7JU3HWrqLXJI9aaz1+vPGPoWA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/core": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.888.0.tgz", + "integrity": "sha512-L3S2FZywACo4lmWv37Y4TbefuPJ1fXWyWwIJ3J4wkPYFJ47mmtUPqThlVrSbdTHkEjnZgJe5cRfxk0qCLsFh1w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.887.0", + "@aws-sdk/xml-builder": "3.887.0", + "@smithy/core": "^3.11.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.2.1", + "@smithy/signature-v4": "^5.1.3", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.888.0.tgz", + "integrity": "sha512-shPi4AhUKbIk7LugJWvNpeZA8va7e5bOHAEKo89S0Ac8WDZt2OaNzbh/b9l0iSL2eEyte8UgIsYGcFxOwIF1VA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.888.0.tgz", + "integrity": "sha512-Jvuk6nul0lE7o5qlQutcqlySBHLXOyoPtiwE6zyKbGc7RVl0//h39Lab7zMeY2drMn8xAnIopL4606Fd8JI/Hw==", "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.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/property-provider": "^4.0.5", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/util-stream": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/core": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.888.0.tgz", + "integrity": "sha512-M82ItvS5yq+tO6ZOV1ruaVs2xOne+v8HW85GFCXnz8pecrzYdgxh6IsVqEbbWruryG/mUGkWMbkBZoEsy4MgyA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/credential-provider-env": "3.888.0", + "@aws-sdk/credential-provider-http": "3.888.0", + "@aws-sdk/credential-provider-process": "3.888.0", + "@aws-sdk/credential-provider-sso": "3.888.0", + "@aws-sdk/credential-provider-web-identity": "3.888.0", + "@aws-sdk/nested-clients": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.888.0.tgz", + "integrity": "sha512-KCrQh1dCDC8Y+Ap3SZa6S81kHk+p+yAaOQ5jC3dak4zhHW3RCrsGR/jYdemTOgbEGcA6ye51UbhWfrrlMmeJSA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@aws-sdk/credential-provider-env": "3.888.0", + "@aws-sdk/credential-provider-http": "3.888.0", + "@aws-sdk/credential-provider-ini": "3.888.0", + "@aws-sdk/credential-provider-process": "3.888.0", + "@aws-sdk/credential-provider-sso": "3.888.0", + "@aws-sdk/credential-provider-web-identity": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/credential-provider-imds": "^4.0.7", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.888.0.tgz", + "integrity": "sha512-+aX6piSukPQ8DUS4JAH344GePg8/+Q1t0+kvSHAZHhYvtQ/1Zek3ySOJWH2TuzTPCafY4nmWLcQcqvU1w9+4Lw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.888.0.tgz", + "integrity": "sha512-b1ZJji7LJ6E/j1PhFTyvp51in2iCOQ3VP6mj5H6f5OUnqn7efm41iNMoinKr87n0IKZw7qput5ggXVxEdPhouA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/client-sso": "3.888.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/token-providers": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.888.0.tgz", + "integrity": "sha512-7P0QNtsDzMZdmBAaY/vY1BsZHwTGvEz3bsn2bm5VSKFAeMmZqsHK1QeYdNsFjLtegnVh+wodxMq50jqLv3LFlA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/nested-clients": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.887.0.tgz", + "integrity": "sha512-ulzqXv6NNqdu/kr0sgBYupWmahISHY+azpJidtK6ZwQIC+vBUk9NdZeqQpy7KVhIk2xd4+5Oq9rxapPwPI21CA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.887.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/middleware-logger": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.887.0.tgz", + "integrity": "sha512-YbbgLI6jKp2qSoAcHnXrQ5jcuc5EYAmGLVFgMVdk8dfCfJLfGGSaOLxF4CXC7QYhO50s+mPPkhBYejCik02Kug==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.887.0.tgz", + "integrity": "sha512-tjrUXFtQnFLo+qwMveq5faxP5MQakoLArXtqieHphSqZTXm21wDJM73hgT4/PQQGTwgYjDKqnqsE1hvk0hcfDw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.887.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.888.0.tgz", + "integrity": "sha512-ZkcUkoys8AdrNNG7ATjqw2WiXqrhTvT+r4CIK3KhOqIGPHX0p0DQWzqjaIl7ZhSUToKoZ4Ud7MjF795yUr73oA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@smithy/core": "^3.11.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/nested-clients": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.888.0.tgz", + "integrity": "sha512-py4o4RPSGt+uwGvSBzR6S6cCBjS4oTX5F8hrHFHfPCdIOMVjyOBejn820jXkCrcdpSj3Qg1yUZXxsByvxc9Lyg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/middleware-host-header": "3.887.0", + "@aws-sdk/middleware-logger": "3.887.0", + "@aws-sdk/middleware-recursion-detection": "3.887.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/region-config-resolver": "3.887.0", + "@aws-sdk/types": "3.887.0", + "@aws-sdk/util-endpoints": "3.887.0", + "@aws-sdk/util-user-agent-browser": "3.887.0", + "@aws-sdk/util-user-agent-node": "3.888.0", + "@smithy/config-resolver": "^4.2.1", + "@smithy/core": "^3.11.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/hash-node": "^4.1.1", + "@smithy/invalid-dependency": "^4.1.1", + "@smithy/middleware-content-length": "^4.1.1", + "@smithy/middleware-endpoint": "^4.2.1", + "@smithy/middleware-retry": "^4.2.1", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/smithy-client": "^4.6.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-body-length-node": "^4.1.0", + "@smithy/util-defaults-mode-browser": "^4.1.1", + "@smithy/util-defaults-mode-node": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@smithy/util-utf8": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.887.0.tgz", + "integrity": "sha512-VdSMrIqJ3yjJb/fY+YAxrH/lCVv0iL8uA+lbMNfQGtO5tB3Zx6SU9LEpUwBNX8fPK1tUpI65CNE4w42+MY/7Mg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.887.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.1.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/token-providers": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.888.0.tgz", + "integrity": "sha512-WA3NF+3W8GEuCMG1WvkDYbB4z10G3O8xuhT7QSjhvLYWQ9CPt3w4VpVIfdqmUn131TCIbhCzD0KN/1VJTjAjyw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@aws-sdk/core": "3.888.0", + "@aws-sdk/nested-clients": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/property-provider": "^4.0.5", + "@smithy/shared-ini-file-loader": "^4.0.5", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/types": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.887.0.tgz", + "integrity": "sha512-fmTEJpUhsPsovQ12vZSpVTEP/IaRoJAMBGQXlQNjtCpkBp6Iq3KQDa/HDaPINE+3xxo6XvTdtibsNOd5zJLV9A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/util-endpoints": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.887.0.tgz", + "integrity": "sha512-kpegvT53KT33BMeIcGLPA65CQVxLUL/C3gTz9AzlU/SDmeusBHX4nRApAicNzI/ltQ5lxZXbQn18UczzBuwF1w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-endpoints": "^3.1.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.887.0.tgz", + "integrity": "sha512-X71UmVsYc6ZTH4KU6hA5urOzYowSXc3qvroagJNLJYU1ilgZ529lP4J9XOYfEvTXkLR1hPFSRxa43SrwgelMjA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.887.0", + "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.888.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.888.0.tgz", + "integrity": "sha512-rSB3OHyuKXotIGfYEo//9sU0lXAUrTY28SUUnxzOGYuQsAt0XR5iYwBAp+RjV6x8f+Hmtbg0PdCsy1iNAXa0UQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/middleware-user-agent": "3.888.0", + "@aws-sdk/types": "3.887.0", + "@smithy/node-config-provider": "^4.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -1566,517 +1594,620 @@ } } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@aws-sdk/xml-builder": { + "version": "3.887.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.887.0.tgz", + "integrity": "sha512-lMwgWK1kNgUhHGfBvO/5uLe7TKhycwOn3eRCqsKPT9aPCx/HWuTlpcQp8oW2pCRGLS7qzcxqpQulcD+bbUL7XQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/abort-controller": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.1.1.tgz", + "integrity": "sha512-vkzula+IwRvPR6oKQhMYioM3A/oX/lFCZiwuxkQbRhqJS2S4YRY2k7k/SyR2jMf3607HLtbEwlRxi0ndXHMjRg==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/config-resolver": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.2.2.tgz", + "integrity": "sha512-IT6MatgBWagLybZl1xQcURXRICvqz1z3APSCAI9IqdvfCkrA7RaQIEfgC6G/KvfxnDfQUDqFV+ZlixcuFznGBQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/types": "^4.5.0", + "@smithy/util-config-provider": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/core": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.11.0.tgz", + "integrity": "sha512-Abs5rdP1o8/OINtE49wwNeWuynCu0kme1r4RI3VXVrHr4odVDG7h7mTnw1WXXfN5Il+c25QOnrdL2y56USfxkA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-body-length-browser": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-stream": "^4.3.1", + "@smithy/util-utf8": "^4.1.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/credential-provider-imds": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.1.2.tgz", + "integrity": "sha512-JlYNq8TShnqCLg0h+afqe2wLAwZpuoSgOyzhYvTgbiKBWRov+uUve+vrZEQO6lkdLOWPh7gK5dtb9dS+KGendg==", "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.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/fetch-http-handler": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.2.1.tgz", + "integrity": "sha512-5/3wxKNtV3wO/hk1is+CZUhL8a1yy/U+9u9LKQ9kZTkMsHaQjJhc3stFfiujtMnkITjzWfndGA2f7g9Uh9vKng==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/querystring-builder": "^4.1.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/hash-node": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.1.1.tgz", + "integrity": "sha512-H9DIU9WBLhYrvPs9v4sYvnZ1PiAI0oc8CgNQUJ1rpN3pP7QADbTOUjchI2FB764Ub0DstH5xbTqcMJu1pnVqxA==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.5.0", + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/invalid-dependency": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.1.1.tgz", + "integrity": "sha512-1AqLyFlfrrDkyES8uhINRlJXmHA2FkG+3DY8X+rmLSqmFwk3DJnvhyGzyByPyewh2jbmV+TYQBEfngQax8IFGg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/is-array-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.1.0.tgz", + "integrity": "sha512-ePTYUOV54wMogio+he4pBybe8fwg4sDvEVDBU8ZlHOZXbXK3/C0XfJgUCu6qAZcawv05ZhZzODGUerFBPsPUDQ==", "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.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/core": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/middleware-content-length": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.1.1.tgz", + "integrity": "sha512-9wlfBBgTsRvC2JxLJxv4xDGNBrZuio3AgSl0lSFX7fneW2cGskXTYpFxCdRYD2+5yzmsiTuaAJD1Wp7gWt9y9w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/middleware-endpoint": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.2.2.tgz", + "integrity": "sha512-M51KcwD+UeSOFtpALGf5OijWt915aQT5eJhqnMKJt7ZTfDfNcvg2UZgIgTZUoiORawb6o5lk4n3rv7vnzQXgsA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@smithy/core": "^3.11.0", + "@smithy/middleware-serde": "^4.1.1", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", + "@smithy/url-parser": "^4.1.1", + "@smithy/util-middleware": "^4.1.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/middleware-retry": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.2.2.tgz", + "integrity": "sha512-KZJueEOO+PWqflv2oGx9jICpHdBYXwCI19j7e2V3IMwKgFcXc9D9q/dsTf4B+uCnYxjNoS1jpyv6pGNGRsKOXA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/protocol-http": "^5.2.1", + "@smithy/service-error-classification": "^4.1.1", + "@smithy/smithy-client": "^4.6.2", + "@smithy/types": "^4.5.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-retry": "^4.1.1", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/middleware-serde": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.1.1.tgz", + "integrity": "sha512-lh48uQdbCoj619kRouev5XbWhCwRKLmphAif16c4J6JgJ4uXjub1PI6RL38d3BLliUvSso6klyB/LTNpWSNIyg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/middleware-stack": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.1.1.tgz", + "integrity": "sha512-ygRnniqNcDhHzs6QAPIdia26M7e7z9gpkIMUe/pK0RsrQ7i5MblwxY8078/QCnGq6AmlUUWgljK2HlelsKIb/A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/node-config-provider": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.2.2.tgz", + "integrity": "sha512-SYGTKyPvyCfEzIN5rD8q/bYaOPZprYUPD2f5g9M7OjaYupWOoQFYJ5ho+0wvxIRf471i2SR4GoiZ2r94Jq9h6A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/property-provider": "^4.1.1", + "@smithy/shared-ini-file-loader": "^4.2.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/node-http-handler": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.2.1.tgz", + "integrity": "sha512-REyybygHlxo3TJICPF89N2pMQSf+p+tBJqpVe1+77Cfi9HBPReNjTgtZ1Vg73exq24vkqJskKDpfF74reXjxfw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/abort-controller": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/querystring-builder": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/property-provider": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.1.1.tgz", + "integrity": "sha512-gm3ZS7DHxUbzC2wr8MUCsAabyiXY0gaj3ROWnhSx/9sPMc6eYLMM4rX81w1zsMaObj2Lq3PZtNCC1J6lpEY7zg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/protocol-http": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.2.1.tgz", + "integrity": "sha512-T8SlkLYCwfT/6m33SIU/JOVGNwoelkrvGjFKDSDtVvAXj/9gOT78JVJEas5a+ETjOu4SVvpCstKgd0PxSu/aHw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/querystring-builder": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.1.1.tgz", + "integrity": "sha512-J9b55bfimP4z/Jg1gNo+AT84hr90p716/nvxDkPGCD4W70MPms0h8KF50RDRgBGZeL83/u59DWNqJv6tEP/DHA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.5.0", + "@smithy/util-uri-escape": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/querystring-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.1.1.tgz", + "integrity": "sha512-63TEp92YFz0oQ7Pj9IuI3IgnprP92LrZtRAkE3c6wLWJxfy/yOPRt39IOKerVr0JS770olzl0kGafXlAXZ1vng==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/service-error-classification": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.1.1.tgz", + "integrity": "sha512-Iam75b/JNXyDE41UvrlM6n8DNOa/r1ylFyvgruTUx7h2Uk7vDNV9AAwP1vfL1fOL8ls0xArwEGVcGZVd7IO/Cw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.5.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.2.0.tgz", + "integrity": "sha512-OQTfmIEp2LLuWdxa8nEEPhZmiOREO6bcB6pjs0AySf4yiZhl6kMOfqmcwcY8BaBPX+0Tb+tG7/Ia/6mwpoZ7Pw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/signature-v4": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.2.1.tgz", + "integrity": "sha512-M9rZhWQLjlQVCCR37cSjHfhriGRN+FQ8UfgrYNufv66TJgk+acaggShl3KS5U/ssxivvZLlnj7QH2CUOKlxPyA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/is-array-buffer": "^4.1.0", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/util-middleware": "^4.1.1", + "@smithy/util-uri-escape": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/smithy-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.6.2.tgz", + "integrity": "sha512-u82cjh/x7MlMat76Z38TRmEcG6JtrrxN4N2CSNG5o2v2S3hfLAxRgSgFqf0FKM3dglH41Evknt/HOX+7nfzZ3g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/core": "^3.11.0", + "@smithy/middleware-endpoint": "^4.2.2", + "@smithy/middleware-stack": "^4.1.1", + "@smithy/protocol-http": "^5.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-stream": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.5.0.tgz", + "integrity": "sha512-RkUpIOsVlAwUIZXO1dsz8Zm+N72LClFfsNqf173catVlvRZiwPy0x2u0JLEA4byreOPKDZPGjmPDylMoP8ZJRg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/url-parser": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.1.1.tgz", + "integrity": "sha512-bx32FUpkhcaKlEoOMbScvc93isaSiRM75pQ5IgIBaMkT7qMlIibpPRONyx/0CvrXHzJLpOn/u6YiDX2hcvs7Dg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.1.1", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-base64": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.1.0.tgz", + "integrity": "sha512-RUGd4wNb8GeW7xk+AY5ghGnIwM96V0l2uzvs/uVHf+tIuVX2WSvynk5CxNoBCsM2rQRSZElAo9rt3G5mJ/gktQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-body-length-browser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.1.0.tgz", + "integrity": "sha512-V2E2Iez+bo6bUMOTENPr6eEmepdY8Hbs+Uc1vkDKgKNA/brTJqOW/ai3JO1BGj9GbCeLqw90pbbH7HFQyFotGQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-body-length-node": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.1.0.tgz", + "integrity": "sha512-BOI5dYjheZdgR9XiEM3HJcEMCXSoqbzu7CzIgYrx0UtmvtC3tC2iDGpJLsSRFffUpy8ymsg2ARMP5fR8mtuUQQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-buffer-from": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.1.0.tgz", + "integrity": "sha512-N6yXcjfe/E+xKEccWEKzK6M+crMrlwaCepKja0pNnlSkm6SjAeLKKA++er5Ba0I17gvKfN/ThV+ZOx/CntKTVw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-config-provider": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.1.0.tgz", + "integrity": "sha512-swXz2vMjrP1ZusZWVTB/ai5gK+J8U0BWvP10v9fpcFvg+Xi/87LHvHfst2IgCs1i0v4qFZfGwCmeD/KNCdJZbQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.1.2.tgz", + "integrity": "sha512-QKrOw01DvNHKgY+3p4r9Ut4u6EHLVZ01u6SkOMe6V6v5C+nRPXJeWh72qCT1HgwU3O7sxAIu23nNh+FOpYVZKA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.1.1", + "@smithy/smithy-client": "^4.6.2", + "@smithy/types": "^4.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.1.2.tgz", + "integrity": "sha512-l2yRmSfx5haYHswPxMmCR6jGwgPs5LjHLuBwlj9U7nNBMS43YV/eevj+Xq1869UYdiynnMrCKtoOYQcwtb6lKg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/config-resolver": "^4.2.2", + "@smithy/credential-provider-imds": "^4.1.2", + "@smithy/node-config-provider": "^4.2.2", + "@smithy/property-provider": "^4.1.1", + "@smithy/smithy-client": "^4.6.2", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-endpoints": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.1.2.tgz", + "integrity": "sha512-+AJsaaEGb5ySvf1SKMRrPZdYHRYSzMkCoK16jWnIMpREAnflVspMIDeCVSZJuj+5muZfgGpNpijE3mUNtjv01Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.2.2", + "@smithy/types": "^4.5.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "aws-crt": ">=1.0.0" + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-hex-encoding": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.1.0.tgz", + "integrity": "sha512-1LcueNN5GYC4tr8mo14yVYbh/Ur8jHhWOxniZXii+1+ePiIbsLZ5fEI0QQGtbRRP5mOhmooos+rLmVASGGoq5w==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-middleware": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.1.1.tgz", + "integrity": "sha512-CGmZ72mL29VMfESz7S6dekqzCh8ZISj3B+w0g1hZFXaOjGTVaSqfAEFAq8EGp8fUL+Q2l8aqNmt8U1tglTikeg==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-retry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.1.1.tgz", + "integrity": "sha512-jGeybqEZ/LIordPLMh5bnmnoIgsqnp4IEimmUp5c5voZ8yx+5kAlN5+juyr7p+f7AtZTgvhmInQk4Q0UVbrZ0Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/service-error-classification": "^4.1.1", + "@smithy/types": "^4.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-apprunner/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-stream": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.3.1.tgz", + "integrity": "sha512-khKkW/Jqkgh6caxMWbMuox9+YfGlsk9OnHOYCGVEdYQb/XVzcORXHLYUubHmmda0pubEDncofUrPNniS9d+uAA==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/fetch-http-handler": "^5.2.1", + "@smithy/node-http-handler": "^4.2.1", + "@smithy/types": "^4.5.0", + "@smithy/util-base64": "^4.1.0", + "@smithy/util-buffer-from": "^4.1.0", + "@smithy/util-hex-encoding": "^4.1.0", + "@smithy/util-utf8": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol": { + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-uri-escape": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.1.0.tgz", + "integrity": "sha512-b0EFQkq35K5NHUYxU72JuoheM6+pytEVUGlTwiFxWFpmddA+Bpz3LgsPRIpBk8lnPE47yT7AF2Egc3jVnKLuPg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/@smithy/util-utf8": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.1.0.tgz", + "integrity": "sha512-mEu1/UIXAdNYuBcyEPbjScKi/+MQVXNIuY/7Cm5XLIWe319kDrT5SizBE95jqtmEXoDbGoZxKLCMttdZdqTZKQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-accessanalyzer/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws-sdk/client-api-gateway": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2089,6 +2220,7 @@ "@aws-sdk/middleware-host-header": "3.693.0", "@aws-sdk/middleware-logger": "3.693.0", "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-sdk-api-gateway": "3.693.0", "@aws-sdk/middleware-user-agent": "3.693.0", "@aws-sdk/region-config-resolver": "3.693.0", "@aws-sdk/types": "3.692.0", @@ -2119,17 +2251,15 @@ "@smithy/util-endpoints": "^2.1.5", "@smithy/util-middleware": "^3.0.9", "@smithy/util-retry": "^3.0.9", + "@smithy/util-stream": "^3.3.0", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2176,7 +2306,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2227,7 +2357,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2276,7 +2406,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/core": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2296,7 +2426,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2315,7 +2445,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2339,7 +2469,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2360,7 +2490,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2377,7 +2507,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2394,7 +2524,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2407,7 +2537,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2419,7 +2549,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2432,7 +2562,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2448,7 +2578,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2463,7 +2593,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2480,7 +2610,7 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2493,7 +2623,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2503,7 +2633,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", "license": "Apache-2.0", "dependencies": { @@ -2525,7 +2655,7 @@ } } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2535,7 +2665,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2546,7 +2676,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/util-utf8": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -2557,99 +2687,96 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner": { + "version": "3.693.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.682.0", - "@aws-sdk/client-sts": "3.682.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.682.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", "@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-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.6", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", "@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-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -2657,47 +2784,47 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.682.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", "@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-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -2705,51 +2832,51 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.682.0" + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sts": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/client-sts": { + "version": "3.693.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.682.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.682.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", "@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-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -2757,19 +2884,19 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/core": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/core": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/core": "^2.4.8", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/property-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.4", - "@smithy/signature-v4": "^4.2.0", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/util-middleware": "^3.0.7", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, @@ -2777,261 +2904,221 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.679.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/types": "^3.5.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/util-stream": "^3.1.9", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-env": "3.679.0", - "@aws-sdk/credential-provider-http": "3.679.0", - "@aws-sdk/credential-provider-process": "3.679.0", - "@aws-sdk/credential-provider-sso": "3.682.0", - "@aws-sdk/credential-provider-web-identity": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/credential-provider-imds": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.682.0" - } - }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.682.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.679.0", - "@aws-sdk/credential-provider-http": "3.679.0", - "@aws-sdk/credential-provider-ini": "3.682.0", - "@aws-sdk/credential-provider-process": "3.679.0", - "@aws-sdk/credential-provider-sso": "3.682.0", - "@aws-sdk/credential-provider-web-identity": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/credential-provider-imds": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.682.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/token-providers": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/types": "^3.5.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.679.0" + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-logger": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@smithy/core": "^2.4.8", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.7", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/token-providers": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.679.0" - } - }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/types": { - "version": "3.679.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.5.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", - "@smithy/util-endpoints": "^2.1.3", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-apprunner/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/types": "3.679.0", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { @@ -3046,18 +3133,7 @@ } } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.9", - "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-cloudformation/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-apprunner/node_modules/@smithy/is-array-buffer": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3067,7 +3143,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-apprunner/node_modules/@smithy/util-buffer-from": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3078,7 +3154,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-apprunner/node_modules/@smithy/util-utf8": { "version": "3.0.0", "license": "Apache-2.0", "dependencies": { @@ -3089,54 +3165,52 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol": { + "version": "3.693.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.682.0", - "@aws-sdk/client-sts": "3.682.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.682.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/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", - "@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", - "@types/uuid": "^9.0.1", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -3144,46 +3218,46 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", "@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-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -3191,47 +3265,47 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.682.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", "@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-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -3239,51 +3313,51 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.682.0" + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sts": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/client-sts": { + "version": "3.693.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.682.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-node": "3.682.0", - "@aws-sdk/middleware-host-header": "3.679.0", - "@aws-sdk/middleware-logger": "3.679.0", - "@aws-sdk/middleware-recursion-detection": "3.679.0", - "@aws-sdk/middleware-user-agent": "3.682.0", - "@aws-sdk/region-config-resolver": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@aws-sdk/util-user-agent-browser": "3.679.0", - "@aws-sdk/util-user-agent-node": "3.682.0", - "@smithy/config-resolver": "^3.0.9", - "@smithy/core": "^2.4.8", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/hash-node": "^3.0.7", - "@smithy/invalid-dependency": "^3.0.7", - "@smithy/middleware-content-length": "^3.0.9", - "@smithy/middleware-endpoint": "^3.1.4", - "@smithy/middleware-retry": "^3.0.23", - "@smithy/middleware-serde": "^3.0.7", - "@smithy/middleware-stack": "^3.0.7", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/url-parser": "^3.0.7", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", "@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-defaults-mode-browser": "^3.0.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -3291,19 +3365,19 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/core": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/core": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/core": "^2.4.8", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/property-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.4", - "@smithy/signature-v4": "^4.2.0", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/util-middleware": "^3.0.7", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, @@ -3311,1021 +3385,1481 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/types": "^3.5.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/fetch-http-handler": "^3.2.9", - "@smithy/node-http-handler": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/protocol-http": "^4.1.4", - "@smithy/smithy-client": "^3.4.0", - "@smithy/types": "^3.5.0", - "@smithy/util-stream": "^3.1.9", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/credential-provider-env": "3.679.0", - "@aws-sdk/credential-provider-http": "3.679.0", - "@aws-sdk/credential-provider-process": "3.679.0", - "@aws-sdk/credential-provider-sso": "3.682.0", - "@aws-sdk/credential-provider-web-identity": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/credential-provider-imds": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.682.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.679.0", - "@aws-sdk/credential-provider-http": "3.679.0", - "@aws-sdk/credential-provider-ini": "3.682.0", - "@aws-sdk/credential-provider-process": "3.679.0", - "@aws-sdk/credential-provider-sso": "3.682.0", - "@aws-sdk/credential-provider-web-identity": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/credential-provider-imds": "^3.2.4", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.682.0", - "@aws-sdk/core": "3.679.0", - "@aws-sdk/token-providers": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.679.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-logger": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.682.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.679.0", - "@aws-sdk/types": "3.679.0", - "@aws-sdk/util-endpoints": "3.679.0", - "@smithy/core": "^2.4.8", - "@smithy/protocol-http": "^4.1.4", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/node-config-provider": "^3.1.8", - "@smithy/types": "^3.5.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.7", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/token-providers": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/property-provider": "^3.1.7", - "@smithy/shared-ini-file-loader": "^3.1.8", - "@smithy/types": "^3.5.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.679.0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/types": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-endpoints": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", - "@smithy/util-endpoints": "^2.1.3", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.679.0", + "node_modules/@aws-sdk/client-cloudcontrol/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.679.0", - "@smithy/types": "^3.5.0", - "bowser": "^2.11.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-cloudformation": { "version": "3.682.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.682.0", + "@aws-sdk/client-sts": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", "@smithy/types": "^3.5.0", - "tslib": "^2.6.2" + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.6", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.9", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso": { + "version": "3.682.0", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", "@smithy/protocol-http": "^4.1.4", - "@smithy/querystring-builder": "^3.0.7", + "@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-cloudwatch-logs/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.682.0", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.682.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/client-sts": { + "version": "3.682.0", "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/client-sso-oidc": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/core": { + "version": "3.679.0", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@aws-sdk/types": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.679.0", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.758.0", - "@aws-sdk/middleware-host-header": "3.734.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.758.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.758.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.758.0", - "@aws-sdk/credential-provider-node": "3.758.0", - "@aws-sdk/middleware-host-header": "3.734.0", - "@aws-sdk/middleware-logger": "3.734.0", - "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.758.0", - "@aws-sdk/region-config-resolver": "3.734.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.758.0", - "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.5", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/hash-node": "^4.0.1", - "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-retry": "^4.0.7", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.7", - "@smithy/util-defaults-mode-node": "^4.0.7", - "@smithy/util-endpoints": "^3.0.1", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.682.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/core": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/core": "^3.1.5", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "fast-xml-parser": "4.4.1", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-ini": "3.682.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-logger": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", + "@aws-sdk/client-sso": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/token-providers": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.679.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@aws-sdk/util-endpoints": "3.743.0", - "@smithy/core": "^3.1.5", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-logger": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-endpoints": { - "version": "3.743.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "@smithy/util-endpoints": "^3.0.1", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", - "@smithy/types": "^4.1.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/token-providers": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" }, "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "@aws-sdk/client-sso-oidc": "^3.679.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/config-resolver": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/types": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/core": { - "version": "3.1.5", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-endpoints": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/middleware-serde": "^4.0.2", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.2", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/hash-node": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/invalid-dependency": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "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-cloudformation/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-content-length": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-endpoint": { - "version": "4.0.6", + "node_modules/@aws-sdk/client-cloudformation/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/core": "^3.1.5", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-middleware": "^4.0.1", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-retry": { - "version": "4.0.7", + "node_modules/@aws-sdk/client-cloudwatch-logs": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/service-error-classification": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-retry": "^4.0.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/client-sts": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/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", + "@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", + "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-serde": { - "version": "4.0.2", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-stack": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.682.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-config-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sts": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-node": "3.682.0", + "@aws-sdk/middleware-host-header": "3.679.0", + "@aws-sdk/middleware-logger": "3.679.0", + "@aws-sdk/middleware-recursion-detection": "3.679.0", + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/region-config-resolver": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@aws-sdk/util-user-agent-browser": "3.679.0", + "@aws-sdk/util-user-agent-node": "3.682.0", + "@smithy/config-resolver": "^3.0.9", + "@smithy/core": "^2.4.8", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/hash-node": "^3.0.7", + "@smithy/invalid-dependency": "^3.0.7", + "@smithy/middleware-content-length": "^3.0.9", + "@smithy/middleware-endpoint": "^3.1.4", + "@smithy/middleware-retry": "^3.0.23", + "@smithy/middleware-serde": "^3.0.7", + "@smithy/middleware-stack": "^3.0.7", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/url-parser": "^3.0.7", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.23", + "@smithy/util-defaults-mode-node": "^3.0.23", + "@smithy/util-endpoints": "^2.1.3", + "@smithy/util-middleware": "^3.0.7", + "@smithy/util-retry": "^3.0.7", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-http-handler": { - "version": "4.0.3", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/core": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/signature-v4": "^4.2.0", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-middleware": "^3.0.7", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/property-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/protocol-http": { - "version": "5.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/fetch-http-handler": "^3.2.9", + "@smithy/node-http-handler": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/protocol-http": "^4.1.4", + "@smithy/smithy-client": "^3.4.0", + "@smithy/types": "^3.5.0", + "@smithy/util-stream": "^3.1.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.682.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/signature-v4": { - "version": "5.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/credential-provider-env": "3.679.0", + "@aws-sdk/credential-provider-http": "3.679.0", + "@aws-sdk/credential-provider-ini": "3.682.0", + "@aws-sdk/credential-provider-process": "3.679.0", + "@aws-sdk/credential-provider-sso": "3.682.0", + "@aws-sdk/credential-provider-web-identity": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/credential-provider-imds": "^3.2.4", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/smithy-client": { - "version": "4.1.6", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/core": "^3.1.5", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-stack": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.1.2", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@aws-sdk/client-sso": "3.682.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/token-providers": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/url-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.1", - "@smithy/types": "^4.1.0", + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.679.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-base64": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-logger": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "license": "Apache-2.0", - "peer": true, + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.679.0", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.682.0", "license": "Apache-2.0", - "peer": true, "dependencies": { + "@aws-sdk/core": "3.679.0", + "@aws-sdk/types": "3.679.0", + "@aws-sdk/util-endpoints": "3.679.0", + "@smithy/core": "^2.4.8", + "@smithy/protocol-http": "^4.1.4", + "@smithy/types": "^3.5.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.7", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.679.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/token-providers": { + "version": "3.679.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/property-provider": "^3.1.7", + "@smithy/shared-ini-file-loader": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.679.0" + } + }, + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/types": { + "version": "3.679.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-endpoints": { + "version": "3.679.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", + "@smithy/util-endpoints": "^2.1.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.679.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.679.0", + "@smithy/types": "^3.5.0", "bowser": "^2.11.0", "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.682.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.682.0", + "@aws-sdk/types": "3.679.0", + "@smithy/node-config-provider": "^3.1.8", + "@smithy/types": "^3.5.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.7", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.9", + "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-cloudwatch-logs/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/config-resolver": "^4.0.1", - "@smithy/credential-provider-imds": "^4.0.1", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-endpoints": { - "version": "3.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.0.1", - "@smithy/types": "^4.1.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-middleware": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-retry": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/service-error-classification": "^4.0.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/credential-provider-node": "3.758.0", + "@aws-sdk/middleware-host-header": "3.734.0", + "@aws-sdk/middleware-logger": "3.734.0", + "@aws-sdk/middleware-recursion-detection": "3.734.0", + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/region-config-resolver": "3.734.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", + "@aws-sdk/util-user-agent-browser": "3.734.0", + "@aws-sdk/util-user-agent-node": "3.758.0", + "@smithy/config-resolver": "^4.0.1", + "@smithy/core": "^3.1.5", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/hash-node": "^4.0.1", + "@smithy/invalid-dependency": "^4.0.1", + "@smithy/middleware-content-length": "^4.0.1", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-retry": "^4.0.7", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.7", + "@smithy/util-defaults-mode-node": "^4.0.7", + "@smithy/util-endpoints": "^3.0.1", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-retry": "^4.0.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/core": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, @@ -4346,7 +4880,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-host-header": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, @@ -4360,7 +4894,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-logger": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, @@ -4373,7 +4907,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, @@ -4387,7 +4921,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, @@ -4404,7 +4938,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/region-config-resolver": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, @@ -4420,7 +4954,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, @@ -4432,7 +4966,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-endpoints": { "version": "3.743.0", "license": "Apache-2.0", "peer": true, @@ -4446,7 +4980,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, @@ -4457,7 +4991,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, @@ -4480,7 +5014,7 @@ } } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/config-resolver": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/config-resolver": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4495,7 +5029,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/core": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/core": { "version": "3.1.5", "license": "Apache-2.0", "peer": true, @@ -4513,7 +5047,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -4528,7 +5062,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/hash-node": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/hash-node": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4542,7 +5076,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/invalid-dependency": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/invalid-dependency": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4554,7 +5088,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-content-length": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-content-length": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4567,7 +5101,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-endpoint": { "version": "4.0.6", "license": "Apache-2.0", "peer": true, @@ -4585,7 +5119,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-retry": { "version": "4.0.7", "license": "Apache-2.0", "peer": true, @@ -4604,7 +5138,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-serde": { "version": "4.0.2", "license": "Apache-2.0", "peer": true, @@ -4616,7 +5150,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4628,7 +5162,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4642,7 +5176,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/node-http-handler": { "version": "4.0.3", "license": "Apache-2.0", "peer": true, @@ -4657,7 +5191,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/property-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4669,7 +5203,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/protocol-http": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -4681,7 +5215,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4693,7 +5227,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/signature-v4": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/signature-v4": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -4711,7 +5245,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/smithy-client": { "version": "4.1.6", "license": "Apache-2.0", "peer": true, @@ -4728,7 +5262,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", "peer": true, @@ -4739,7 +5273,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/url-parser": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4752,7 +5286,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-base64": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -4765,7 +5299,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -4776,7 +5310,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-node": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-body-length-node": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -4787,7 +5321,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-config-provider": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -4798,7 +5332,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-browser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-browser": { "version": "4.0.7", "license": "Apache-2.0", "peer": true, @@ -4813,7 +5347,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-defaults-mode-node": { "version": "4.0.7", "license": "Apache-2.0", "peer": true, @@ -4830,7 +5364,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-endpoints": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-endpoints": { "version": "3.0.1", "license": "Apache-2.0", "peer": true, @@ -4843,7 +5377,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-middleware": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4855,7 +5389,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-retry": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-retry": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -4868,7 +5402,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -4880,67 +5414,47 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/core": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.5", + "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/core": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { "@aws-sdk/types": "3.734.0", - "@smithy/core": "^3.1.5", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-logger": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -4948,56 +5462,55 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/core": { - "version": "3.1.5", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/middleware-serde": "^4.0.2", + "@aws-sdk/types": "3.734.0", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.2", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/middleware-endpoint": { - "version": "4.0.6", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@aws-sdk/util-endpoints": "3.743.0", "@smithy/core": "^3.1.5", - "@smithy/middleware-serde": "^4.0.2", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", - "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/middleware-serde": { - "version": "4.0.2", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/middleware-stack": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -5008,67 +5521,80 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/node-config-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-endpoints": { + "version": "3.743.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", + "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", + "@smithy/util-endpoints": "^3.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/property-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@aws-sdk/types": "3.734.0", "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/protocol-http": { - "version": "5.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@aws-sdk/middleware-user-agent": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/config-resolver": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/signature-v4": { - "version": "5.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/core": { + "version": "3.1.5", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/middleware-serde": "^4.0.2", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.1", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-stream": "^4.1.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -5076,40 +5602,40 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/smithy-client": { - "version": "4.1.6", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.1.5", - "@smithy/middleware-endpoint": "^4.0.6", - "@smithy/middleware-stack": "^4.0.1", "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.1.2", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/hash-node": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/invalid-dependency": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -5117,146 +5643,57 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-content-length": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.758.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@aws-sdk/core": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/node-http-handler": "^4.0.3", - "@smithy/property-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/core": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-endpoint": { + "version": "4.0.6", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/types": "3.734.0", "@smithy/core": "^3.1.5", - "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/signature-v4": "^5.0.1", - "@smithy/smithy-client": "^4.1.6", - "@smithy/types": "^4.1.0", - "@smithy/util-middleware": "^4.0.1", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { - "version": "3.734.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/types": "^4.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/core": { - "version": "3.1.5", - "license": "Apache-2.0", - "peer": true, - "dependencies": { "@smithy/middleware-serde": "^4.0.2", - "@smithy/protocol-http": "^5.0.1", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/url-parser": "^4.0.1", "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.2", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", - "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { - "version": "4.0.6", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-retry": { + "version": "4.0.7", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/core": "^3.1.5", - "@smithy/middleware-serde": "^4.0.2", "@smithy/node-config-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/service-error-classification": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", - "@smithy/url-parser": "^4.0.1", "@smithy/util-middleware": "^4.0.1", - "tslib": "^2.6.2" + "@smithy/util-retry": "^4.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-serde": { "version": "4.0.2", "license": "Apache-2.0", "peer": true, @@ -5268,7 +5705,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5280,7 +5717,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5294,7 +5731,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/node-http-handler": { "version": "4.0.3", "license": "Apache-2.0", "peer": true, @@ -5309,7 +5746,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/property-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5321,7 +5758,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/protocol-http": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -5333,7 +5770,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5345,7 +5782,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/signature-v4": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/signature-v4": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -5363,7 +5800,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/smithy-client": { "version": "4.1.6", "license": "Apache-2.0", "peer": true, @@ -5380,7 +5817,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", "peer": true, @@ -5391,7 +5828,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/url-parser": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5404,7 +5841,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-base64": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -5417,7 +5854,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -5428,45 +5865,53 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-config-provider": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.7", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.758.0", - "@aws-sdk/credential-provider-http": "3.758.0", - "@aws-sdk/credential-provider-ini": "3.758.0", - "@aws-sdk/credential-provider-process": "3.758.0", - "@aws-sdk/credential-provider-sso": "3.758.0", - "@aws-sdk/credential-provider-web-identity": "3.758.0", - "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.7", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/config-resolver": "^4.0.1", "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -5474,11 +5919,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-endpoints": { + "version": "3.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -5486,7 +5932,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-middleware": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5498,11 +5944,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-retry": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/service-error-classification": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -5510,18 +5957,39 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, @@ -5529,7 +5997,6 @@ "@aws-sdk/core": "3.758.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -5537,7 +6004,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/core": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, @@ -5558,7 +6025,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { "version": "3.734.0", "license": "Apache-2.0", "peer": true, @@ -5570,7 +6037,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/core": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/core": { "version": "3.1.5", "license": "Apache-2.0", "peer": true, @@ -5588,7 +6055,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/middleware-endpoint": { "version": "4.0.6", "license": "Apache-2.0", "peer": true, @@ -5606,7 +6073,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/middleware-serde": { "version": "4.0.2", "license": "Apache-2.0", "peer": true, @@ -5618,7 +6085,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5630,7 +6097,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5644,7 +6111,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/property-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5656,7 +6123,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/protocol-http": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -5668,7 +6135,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5680,7 +6147,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/signature-v4": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/signature-v4": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -5698,7 +6165,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/smithy-client": { "version": "4.1.6", "license": "Apache-2.0", "peer": true, @@ -5715,7 +6182,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", "peer": true, @@ -5726,7 +6193,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/url-parser": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5739,7 +6206,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -5750,7 +6217,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/util-middleware": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5762,7 +6229,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-env/node_modules/@smithy/util-utf8": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, @@ -5774,25 +6241,27 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/client-sso": "3.758.0", "@aws-sdk/core": "3.758.0", - "@aws-sdk/token-providers": "3.758.0", "@aws-sdk/types": "3.734.0", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.3", "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/core": { "version": "3.758.0", "license": "Apache-2.0", "peer": true, @@ -5813,15 +6282,11 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { - "version": "3.758.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@aws-sdk/nested-clients": "3.758.0", - "@aws-sdk/types": "3.734.0", - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -5829,37 +6294,40 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { - "version": "3.734.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/core": { + "version": "3.1.5", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/core": { - "version": "3.1.5", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/middleware-serde": "^4.0.2", "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.1.2", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/middleware-endpoint": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-endpoint": { "version": "4.0.6", "license": "Apache-2.0", "peer": true, @@ -5877,7 +6345,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-serde": { "version": "4.0.2", "license": "Apache-2.0", "peer": true, @@ -5889,7 +6357,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5901,7 +6369,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5915,7 +6383,22 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/node-http-handler": { + "version": "4.0.3", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/property-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5927,7 +6410,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/protocol-http": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -5939,7 +6422,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -5951,7 +6434,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/signature-v4": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/signature-v4": { "version": "5.0.1", "license": "Apache-2.0", "peer": true, @@ -5969,7 +6452,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/smithy-client": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/smithy-client": { "version": "4.1.6", "license": "Apache-2.0", "peer": true, @@ -5986,7 +6469,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/types": { "version": "4.1.0", "license": "Apache-2.0", "peer": true, @@ -5997,7 +6480,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/url-parser": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -6010,174 +6493,162 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-base64": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-middleware": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-utf8": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-middleware": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-http/node_modules/@smithy/util-utf8": { + "version": "4.0.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@aws-sdk/credential-provider-env": "3.758.0", + "@aws-sdk/credential-provider-http": "3.758.0", + "@aws-sdk/credential-provider-ini": "3.758.0", + "@aws-sdk/credential-provider-process": "3.758.0", + "@aws-sdk/credential-provider-sso": "3.758.0", + "@aws-sdk/credential-provider-web-identity": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/credential-provider-imds": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { + "version": "3.734.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/property-provider": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/types": { + "version": "4.1.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/core": { + "version": "3.758.0", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.5", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", + "@smithy/types": "^4.1.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/abort-controller": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { @@ -6188,39 +6659,47 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/abort-controller/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/core": { + "version": "3.1.5", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/middleware-endpoint": { + "version": "4.0.6", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/core": "^3.1.5", + "@smithy/middleware-serde": "^4.0.2", "@smithy/node-config-provider": "^4.0.1", - "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/node-config-provider": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/middleware-serde": { + "version": "4.0.2", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.1", - "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -6228,7 +6707,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/middleware-stack": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, @@ -6240,11 +6719,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/node-config-provider": { "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -6252,23 +6733,23 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/property-provider": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/url-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/protocol-http": { + "version": "5.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -6276,150 +6757,172 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-builder": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/signature-v4": { + "version": "5.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-builder/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/smithy-client": { + "version": "4.1.6", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/core": "^3.1.5", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-parser": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/types": { + "version": "4.1.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-parser/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/url-parser": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/service-error-classification": { - "version": "4.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/types": "^4.1.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/util-middleware": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-process/node_modules/@smithy/util-utf8": { "version": "4.0.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { + "@aws-sdk/client-sso": "3.758.0", + "@aws-sdk/core": "3.758.0", + "@aws-sdk/token-providers": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream": { - "version": "4.1.2", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/core": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/fetch-http-handler": "^5.0.1", - "@smithy/node-http-handler": "^4.0.3", + "@aws-sdk/types": "3.734.0", + "@smithy/core": "^3.1.5", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/signature-v4": "^5.0.1", + "@smithy/smithy-client": "^4.1.6", "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/token-providers": { + "version": "3.758.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", + "@aws-sdk/nested-clients": "3.758.0", + "@aws-sdk/types": "3.734.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/node-http-handler": { - "version": "4.0.3", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { + "version": "3.734.0", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/abort-controller": "^4.0.1", - "@smithy/protocol-http": "^5.0.1", - "@smithy/querystring-builder": "^4.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -6427,139 +6930,127 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/protocol-http": { - "version": "5.0.1", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/core": { + "version": "3.1.5", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/middleware-serde": "^4.0.2", + "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-stream": "^4.1.2", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/types": { - "version": "4.1.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/middleware-endpoint": { + "version": "4.0.6", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/core": "^3.1.5", + "@smithy/middleware-serde": "^4.0.2", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", + "@smithy/util-middleware": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/util-base64": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/middleware-serde": { + "version": "4.0.2", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/util-utf8": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/middleware-stack": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/node-config-provider": { + "version": "4.0.1", "license": "Apache-2.0", "peer": true, "dependencies": { + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/property-provider": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-utf8/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/protocol-http": { + "version": "5.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.730.0.tgz", - "integrity": "sha512-iJt2pL6RqWg7R3pja1WfcC2+oTjwaKFYndNE9oUQqyc6RN24XWUtGy9JnWqTUOy8jYzaP2eoF00fGeasSBX+Dw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/signature-v4": { + "version": "5.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/credential-provider-node": "3.730.0", - "@aws-sdk/middleware-host-header": "3.723.0", - "@aws-sdk/middleware-logger": "3.723.0", - "@aws-sdk/middleware-recursion-detection": "3.723.0", - "@aws-sdk/middleware-user-agent": "3.730.0", - "@aws-sdk/region-config-resolver": "3.723.0", - "@aws-sdk/types": "3.723.0", - "@aws-sdk/util-endpoints": "3.730.0", - "@aws-sdk/util-user-agent-browser": "3.723.0", - "@aws-sdk/util-user-agent-node": "3.730.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.1", + "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -6567,393 +7058,203 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.730.0.tgz", - "integrity": "sha512-mI8kqkSuVlZklewEmN7jcbBMyVODBld3MsTjCKSl5ztduuPX69JD7nXLnWWPkw1PX4aGTO24AEoRMGNxntoXUg==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/smithy-client": { + "version": "4.1.6", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/middleware-host-header": "3.723.0", - "@aws-sdk/middleware-logger": "3.723.0", - "@aws-sdk/middleware-recursion-detection": "3.723.0", - "@aws-sdk/middleware-user-agent": "3.730.0", - "@aws-sdk/region-config-resolver": "3.723.0", - "@aws-sdk/types": "3.723.0", - "@aws-sdk/util-endpoints": "3.730.0", - "@aws-sdk/util-user-agent-browser": "3.723.0", - "@aws-sdk/util-user-agent-node": "3.730.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/core": "^3.1.5", + "@smithy/middleware-endpoint": "^4.0.6", + "@smithy/middleware-stack": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-stream": "^4.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/core": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.730.0.tgz", - "integrity": "sha512-jonKyR+2GcqbZj2WDICZS0c633keLc9qwXnePu83DfAoFXMMIMyoR/7FOGf8F3OrIdGh8KzE9VvST+nZCK9EJA==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/core": "^3.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/signature-v4": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", - "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.730.0.tgz", - "integrity": "sha512-fFXgo3jBXLWqu8I07Hd96mS7RjrtpDgm3bZShm0F3lKtqDQF+hObFWq9A013SOE+RjMLVfbABhToXAYct3FcBw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/url-parser": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.730.0.tgz", - "integrity": "sha512-1aF3elbCzpVhWLAuV63iFElfLOqLGGTp4fkf2VAFIDO3hjshpXUQssTgIWiBwwtJYJdOSxaFrCU7u8frjr/5aQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-stream": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.730.0.tgz", - "integrity": "sha512-zwsxkBuQuPp06o45ATAnznHzj3+ibop/EaTytNzSv0O87Q59K/jnS/bdtv1n6bhe99XCieRNTihvtS7YklzK7A==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-middleware": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/credential-provider-env": "3.730.0", - "@aws-sdk/credential-provider-http": "3.730.0", - "@aws-sdk/credential-provider-process": "3.730.0", - "@aws-sdk/credential-provider-sso": "3.730.0", - "@aws-sdk/credential-provider-web-identity": "3.730.0", - "@aws-sdk/nested-clients": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/credential-provider-imds": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.730.0.tgz", - "integrity": "sha512-ztRjh1edY7ut2wwrj1XqHtqPY/NXEYIk5fYf04KKsp8zBi81ScVqP7C+Cst6PFKixjgLSG6RsqMx9GSAalVv0Q==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/credential-provider-sso/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@aws-sdk/credential-provider-env": "3.730.0", - "@aws-sdk/credential-provider-http": "3.730.0", - "@aws-sdk/credential-provider-ini": "3.730.0", - "@aws-sdk/credential-provider-process": "3.730.0", - "@aws-sdk/credential-provider-sso": "3.730.0", - "@aws-sdk/credential-provider-web-identity": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/credential-provider-imds": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.730.0.tgz", - "integrity": "sha512-cNKUQ81eptfZN8MlSqwUq3+5ln8u/PcY57UmLZ+npxUHanqO1akpgcpNsLpmsIkoXGbtSQrLuDUgH86lS/SWOw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.730.0.tgz", - "integrity": "sha512-SdI2xrTbquJLMxUh5LpSwB8zfiKq3/jso53xWRgrVfeDlrSzZuyV6QghaMs3KEEjcNzwEnTfSIjGQyRXG9VrEw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.730.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/token-providers": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.730.0.tgz", - "integrity": "sha512-l5vdPmvF/d890pbvv5g1GZrdjaSQkyPH/Bc8dO/ZqkWxkIP8JNgl48S2zgf4DkP3ik9K2axWO828L5RsMDQzdA==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/nested-clients": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.723.0.tgz", - "integrity": "sha512-LLVzLvk299pd7v4jN9yOSaWDZDfH0SnBPb6q+FDPaOCMGBY8kuwQso7e/ozIKSmZHRMGO3IZrflasHM+rI+2YQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-logger": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.723.0.tgz", - "integrity": "sha512-chASQfDG5NJ8s5smydOEnNK7N0gDMyuPbx7dYYcm1t/PKtnVfvWF+DHCTrRC2Ej76gLJVCVizlAJKM8v8Kg3cg==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.723.0.tgz", - "integrity": "sha512-7usZMtoynT9/jxL/rkuDOFQ0C2mhXl4yCm67Rg7GNTstl67u7w5WN1aIRImMeztaKlw8ExjoTyo6WTs1Kceh7A==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.730.0.tgz", - "integrity": "sha512-aPMZvNmf2a42B41au3bA3ODU4HfHka2nYT/SAIhhVXH1ENYfAmZo7FraFPxetKepFMCtL7j4QE6/LDucK6liIw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@aws-sdk/util-endpoints": "3.730.0", - "@smithy/core": "^3.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/nested-clients": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.730.0.tgz", - "integrity": "sha512-vilIgf1/7kre8DdE5zAQkDOwHFb/TahMn/6j2RZwFLlK7cDk91r19deSiVYnKQkupDMtOfNceNqnorM4I3PDzw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/middleware-host-header": "3.723.0", - "@aws-sdk/middleware-logger": "3.723.0", - "@aws-sdk/middleware-recursion-detection": "3.723.0", - "@aws-sdk/middleware-user-agent": "3.730.0", - "@aws-sdk/region-config-resolver": "3.723.0", - "@aws-sdk/types": "3.723.0", - "@aws-sdk/util-endpoints": "3.730.0", - "@aws-sdk/util-user-agent-browser": "3.723.0", - "@aws-sdk/util-user-agent-node": "3.730.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.723.0.tgz", - "integrity": "sha512-tGF/Cvch3uQjZIj34LY2mg8M2Dr4kYG8VU8Yd0dFnB1ybOEOveIK/9ypUo9ycZpB9oO6q01KRe5ijBaxNueUQg==", - "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/token-providers": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.730.0.tgz", - "integrity": "sha512-BSPssGj54B/AABWXARIPOT/1ybFahM1ldlfmXy9gRmZi/afe9geWJGlFYCCt3PmqR+1Ny5XIjSfue+kMd//drQ==", - "dependencies": { - "@aws-sdk/nested-clients": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", - "dependencies": { - "@smithy/types": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-endpoints": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.730.0.tgz", - "integrity": "sha512-1KTFuVnk+YtLgWr6TwDiggcDqtPpOY2Cszt3r2lkXfaEAX6kHyOZi1vdvxXjPU5LsOBJem8HZ7KlkmrEi+xowg==", - "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/types": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.723.0.tgz", - "integrity": "sha512-Wh9I6j2jLhNFq6fmXydIpqD1WyQLyTfSxjW9B+PXSnPyk3jtQW8AKQur7p97rO8LAUzVI0bv8kb3ZzDEVbquIg==", - "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.730.0.tgz", - "integrity": "sha512-yBvkOAjqsDEl1va4eHNOhnFBk0iCY/DBFNyhvtTMqPF4NO+MITWpFs3J9JtZKzJlQ6x0Yb9TLQ8NhDjEISz5Ug==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -6964,306 +7265,220 @@ } } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", - "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/core": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.5.3.tgz", - "integrity": "sha512-xa5byV9fEguZNofCclv6v9ra0FYh5FATQW/da7FQUVTic94DfrN/NvmKZjrMyzbpqfot9ZjBaO8U1UeTbmSLuA==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/abort-controller": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/abort-controller/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", + "@smithy/node-config-provider": "^4.0.1", + "@smithy/property-provider": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/url-parser": "^4.0.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/node-config-provider": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/property-provider": "^4.0.1", + "@smithy/shared-ini-file-loader": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/property-provider": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.11.tgz", - "integrity": "sha512-zDogwtRLzKl58lVS8wPcARevFZNBOOqnmzWWxVe9XiaXU2CADFjvJ9XfNibgkOWs08sxLuSr81NrpY4mgp9OwQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/credential-provider-imds/node_modules/@smithy/url-parser": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/core": "^3.5.3", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/querystring-parser": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.12.tgz", - "integrity": "sha512-wvIH70c4e91NtRxdaLZF+mbLZ/HcC6yg7ySKUiufL6ESp6zJUSnJucZ309AvG9nqCFHSRB5I6T3Ez1Q9wCh0Ww==", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.5", - "@smithy/smithy-client": "^4.4.3", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.5", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-builder": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.1.0", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-builder/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-parser": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/querystring-parser/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/service-error-classification": { + "version": "4.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@smithy/types": "^4.1.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/service-error-classification/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/service-error-classification": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.5.tgz", - "integrity": "sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA==", - "dependencies": { - "@smithy/types": "^4.3.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream": { + "version": "4.1.2", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/fetch-http-handler": "^5.0.1", + "@smithy/node-http-handler": "^4.0.3", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -7271,668 +7486,559 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.3.tgz", - "integrity": "sha512-xxzNYgA0HD6ETCe5QJubsxP0hQH3QK3kbpJz3QrosBCuIWyEXLR/CO5hFb2OeawEKUxMNhz3a1nuJNN2np2RMA==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/core": "^3.5.3", - "@smithy/middleware-endpoint": "^4.1.11", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/node-http-handler": { + "version": "4.0.3", + "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/abort-controller": "^4.0.1", + "@smithy/protocol-http": "^5.0.1", + "@smithy/querystring-builder": "^4.0.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/protocol-http": { + "version": "5.0.1", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/types": { + "version": "4.1.0", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/util-base64": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-node": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-stream/node_modules/@smithy/util-utf8": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "license": "Apache-2.0", + "peer": true, "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-uri-escape": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "node_modules/@aws-sdk/client-codecatalyst/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": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.19.tgz", - "integrity": "sha512-mvLMh87xSmQrV5XqnUYEPoiFFeEGYeAKIDDKdhE2ahqitm8OHM3aSvhqL6rrK6wm1brIk90JhxDf5lf2hbrLbQ==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-utf8/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.3", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.19.tgz", - "integrity": "sha512-8tYnx+LUfj6m+zkUUIrIQJxPM1xVxfRBvoGHua7R/i6qAxOMjqR6CpEpDwKoIs1o0+hOjGvkKE23CafKL0vJ9w==", + "node_modules/@aws-sdk/client-codecatalyst/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.3", - "@smithy/types": "^4.3.1", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.730.0.tgz", + "integrity": "sha512-iJt2pL6RqWg7R3pja1WfcC2+oTjwaKFYndNE9oUQqyc6RN24XWUtGy9JnWqTUOy8jYzaP2eoF00fGeasSBX+Dw==", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/credential-provider-node": "3.730.0", + "@aws-sdk/middleware-host-header": "3.723.0", + "@aws-sdk/middleware-logger": "3.723.0", + "@aws-sdk/middleware-recursion-detection": "3.723.0", + "@aws-sdk/middleware-user-agent": "3.730.0", + "@aws-sdk/region-config-resolver": "3.723.0", + "@aws-sdk/types": "3.723.0", + "@aws-sdk/util-endpoints": "3.730.0", + "@aws-sdk/util-user-agent-browser": "3.723.0", + "@aws-sdk/util-user-agent-node": "3.730.0", + "@smithy/config-resolver": "^4.0.0", + "@smithy/core": "^3.0.0", + "@smithy/fetch-http-handler": "^5.0.0", + "@smithy/hash-node": "^4.0.0", + "@smithy/invalid-dependency": "^4.0.0", + "@smithy/middleware-content-length": "^4.0.0", + "@smithy/middleware-endpoint": "^4.0.0", + "@smithy/middleware-retry": "^4.0.0", + "@smithy/middleware-serde": "^4.0.0", + "@smithy/middleware-stack": "^4.0.0", + "@smithy/node-config-provider": "^4.0.0", + "@smithy/node-http-handler": "^4.0.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/smithy-client": "^4.0.0", + "@smithy/types": "^4.0.0", + "@smithy/url-parser": "^4.0.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.0", + "@smithy/util-defaults-mode-node": "^4.0.0", + "@smithy/util-endpoints": "^3.0.0", + "@smithy/util-middleware": "^4.0.0", + "@smithy/util-retry": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/client-sso": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.730.0.tgz", + "integrity": "sha512-mI8kqkSuVlZklewEmN7jcbBMyVODBld3MsTjCKSl5ztduuPX69JD7nXLnWWPkw1PX4aGTO24AEoRMGNxntoXUg==", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/middleware-host-header": "3.723.0", + "@aws-sdk/middleware-logger": "3.723.0", + "@aws-sdk/middleware-recursion-detection": "3.723.0", + "@aws-sdk/middleware-user-agent": "3.730.0", + "@aws-sdk/region-config-resolver": "3.723.0", + "@aws-sdk/types": "3.723.0", + "@aws-sdk/util-endpoints": "3.730.0", + "@aws-sdk/util-user-agent-browser": "3.723.0", + "@aws-sdk/util-user-agent-node": "3.730.0", + "@smithy/config-resolver": "^4.0.0", + "@smithy/core": "^3.0.0", + "@smithy/fetch-http-handler": "^5.0.0", + "@smithy/hash-node": "^4.0.0", + "@smithy/invalid-dependency": "^4.0.0", + "@smithy/middleware-content-length": "^4.0.0", + "@smithy/middleware-endpoint": "^4.0.0", + "@smithy/middleware-retry": "^4.0.0", + "@smithy/middleware-serde": "^4.0.0", + "@smithy/middleware-stack": "^4.0.0", + "@smithy/node-config-provider": "^4.0.0", + "@smithy/node-http-handler": "^4.0.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/smithy-client": "^4.0.0", + "@smithy/types": "^4.0.0", + "@smithy/url-parser": "^4.0.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.0", + "@smithy/util-defaults-mode-node": "^4.0.0", + "@smithy/util-endpoints": "^3.0.0", + "@smithy/util-middleware": "^4.0.0", + "@smithy/util-retry": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/core": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.730.0.tgz", + "integrity": "sha512-jonKyR+2GcqbZj2WDICZS0c633keLc9qwXnePu83DfAoFXMMIMyoR/7FOGf8F3OrIdGh8KzE9VvST+nZCK9EJA==", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.723.0", + "@smithy/core": "^3.0.0", + "@smithy/node-config-provider": "^4.0.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/signature-v4": "^5.0.0", + "@smithy/smithy-client": "^4.0.0", + "@smithy/types": "^4.0.0", + "@smithy/util-middleware": "^4.0.0", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.5.tgz", - "integrity": "sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.730.0.tgz", + "integrity": "sha512-fFXgo3jBXLWqu8I07Hd96mS7RjrtpDgm3bZShm0F3lKtqDQF+hObFWq9A013SOE+RjMLVfbABhToXAYct3FcBw==", "dependencies": { - "@smithy/service-error-classification": "^4.0.5", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.730.0.tgz", + "integrity": "sha512-1aF3elbCzpVhWLAuV63iFElfLOqLGGTp4fkf2VAFIDO3hjshpXUQssTgIWiBwwtJYJdOSxaFrCU7u8frjr/5aQ==", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/fetch-http-handler": "^5.0.0", + "@smithy/node-http-handler": "^4.0.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/smithy-client": "^4.0.0", + "@smithy/types": "^4.0.0", + "@smithy/util-stream": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.730.0.tgz", + "integrity": "sha512-zwsxkBuQuPp06o45ATAnznHzj3+ibop/EaTytNzSv0O87Q59K/jnS/bdtv1n6bhe99XCieRNTihvtS7YklzK7A==", "dependencies": { + "@aws-sdk/core": "3.730.0", + "@aws-sdk/credential-provider-env": "3.730.0", + "@aws-sdk/credential-provider-http": "3.730.0", + "@aws-sdk/credential-provider-process": "3.730.0", + "@aws-sdk/credential-provider-sso": "3.730.0", + "@aws-sdk/credential-provider-web-identity": "3.730.0", + "@aws-sdk/nested-clients": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/credential-provider-imds": "^4.0.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/shared-ini-file-loader": "^4.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.730.0.tgz", + "integrity": "sha512-ztRjh1edY7ut2wwrj1XqHtqPY/NXEYIk5fYf04KKsp8zBi81ScVqP7C+Cst6PFKixjgLSG6RsqMx9GSAalVv0Q==", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@aws-sdk/credential-provider-env": "3.730.0", + "@aws-sdk/credential-provider-http": "3.730.0", + "@aws-sdk/credential-provider-ini": "3.730.0", + "@aws-sdk/credential-provider-process": "3.730.0", + "@aws-sdk/credential-provider-sso": "3.730.0", + "@aws-sdk/credential-provider-web-identity": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/credential-provider-imds": "^4.0.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/shared-ini-file-loader": "^4.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-datazone/-/client-datazone-3.848.0.tgz", - "integrity": "sha512-m9x9G6oQHUVJvt9JsTdU41/nimz11MMmQLptQVgIJcD6VHoHoVXppvPntK7GUkH0T6+0gw63RugGd7kB+xofBQ==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.730.0.tgz", + "integrity": "sha512-cNKUQ81eptfZN8MlSqwUq3+5ln8u/PcY57UmLZ+npxUHanqO1akpgcpNsLpmsIkoXGbtSQrLuDUgH86lS/SWOw==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/credential-provider-node": "3.848.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/core": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/shared-ini-file-loader": "^4.0.0", + "@smithy/types": "^4.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/client-sso": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", - "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.730.0.tgz", + "integrity": "sha512-SdI2xrTbquJLMxUh5LpSwB8zfiKq3/jso53xWRgrVfeDlrSzZuyV6QghaMs3KEEjcNzwEnTfSIjGQyRXG9VrEw==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/client-sso": "3.730.0", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/token-providers": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/shared-ini-file-loader": "^4.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/core": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz", - "integrity": "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.730.0.tgz", + "integrity": "sha512-l5vdPmvF/d890pbvv5g1GZrdjaSQkyPH/Bc8dO/ZqkWxkIP8JNgl48S2zgf4DkP3ik9K2axWO828L5RsMDQzdA==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/nested-clients": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz", - "integrity": "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.723.0.tgz", + "integrity": "sha512-LLVzLvk299pd7v4jN9yOSaWDZDfH0SnBPb6q+FDPaOCMGBY8kuwQso7e/ozIKSmZHRMGO3IZrflasHM+rI+2YQ==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.723.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz", - "integrity": "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-logger": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.723.0.tgz", + "integrity": "sha512-chASQfDG5NJ8s5smydOEnNK7N0gDMyuPbx7dYYcm1t/PKtnVfvWF+DHCTrRC2Ej76gLJVCVizlAJKM8v8Kg3cg==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@aws-sdk/types": "3.723.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz", - "integrity": "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.723.0.tgz", + "integrity": "sha512-7usZMtoynT9/jxL/rkuDOFQ0C2mhXl4yCm67Rg7GNTstl67u7w5WN1aIRImMeztaKlw8ExjoTyo6WTs1Kceh7A==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/credential-provider-env": "3.846.0", - "@aws-sdk/credential-provider-http": "3.846.0", - "@aws-sdk/credential-provider-process": "3.846.0", - "@aws-sdk/credential-provider-sso": "3.848.0", - "@aws-sdk/credential-provider-web-identity": "3.848.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.723.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz", - "integrity": "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.730.0.tgz", + "integrity": "sha512-aPMZvNmf2a42B41au3bA3ODU4HfHka2nYT/SAIhhVXH1ENYfAmZo7FraFPxetKepFMCtL7j4QE6/LDucK6liIw==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.846.0", - "@aws-sdk/credential-provider-http": "3.846.0", - "@aws-sdk/credential-provider-ini": "3.848.0", - "@aws-sdk/credential-provider-process": "3.846.0", - "@aws-sdk/credential-provider-sso": "3.848.0", - "@aws-sdk/credential-provider-web-identity": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@aws-sdk/util-endpoints": "3.730.0", + "@smithy/core": "^3.0.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz", - "integrity": "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/nested-clients": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.730.0.tgz", + "integrity": "sha512-vilIgf1/7kre8DdE5zAQkDOwHFb/TahMn/6j2RZwFLlK7cDk91r19deSiVYnKQkupDMtOfNceNqnorM4I3PDzw==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.730.0", + "@aws-sdk/middleware-host-header": "3.723.0", + "@aws-sdk/middleware-logger": "3.723.0", + "@aws-sdk/middleware-recursion-detection": "3.723.0", + "@aws-sdk/middleware-user-agent": "3.730.0", + "@aws-sdk/region-config-resolver": "3.723.0", + "@aws-sdk/types": "3.723.0", + "@aws-sdk/util-endpoints": "3.730.0", + "@aws-sdk/util-user-agent-browser": "3.723.0", + "@aws-sdk/util-user-agent-node": "3.730.0", + "@smithy/config-resolver": "^4.0.0", + "@smithy/core": "^3.0.0", + "@smithy/fetch-http-handler": "^5.0.0", + "@smithy/hash-node": "^4.0.0", + "@smithy/invalid-dependency": "^4.0.0", + "@smithy/middleware-content-length": "^4.0.0", + "@smithy/middleware-endpoint": "^4.0.0", + "@smithy/middleware-retry": "^4.0.0", + "@smithy/middleware-serde": "^4.0.0", + "@smithy/middleware-stack": "^4.0.0", + "@smithy/node-config-provider": "^4.0.0", + "@smithy/node-http-handler": "^4.0.0", + "@smithy/protocol-http": "^5.0.0", + "@smithy/smithy-client": "^4.0.0", + "@smithy/types": "^4.0.0", + "@smithy/url-parser": "^4.0.0", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.0", + "@smithy/util-defaults-mode-node": "^4.0.0", + "@smithy/util-endpoints": "^3.0.0", + "@smithy/util-middleware": "^4.0.0", + "@smithy/util-retry": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz", - "integrity": "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.723.0.tgz", + "integrity": "sha512-tGF/Cvch3uQjZIj34LY2mg8M2Dr4kYG8VU8Yd0dFnB1ybOEOveIK/9ypUo9ycZpB9oO6q01KRe5ijBaxNueUQg==", "dependencies": { - "@aws-sdk/client-sso": "3.848.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/token-providers": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.723.0", + "@smithy/node-config-provider": "^4.0.0", + "@smithy/types": "^4.0.0", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz", - "integrity": "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/token-providers": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.730.0.tgz", + "integrity": "sha512-BSPssGj54B/AABWXARIPOT/1ybFahM1ldlfmXy9gRmZi/afe9geWJGlFYCCt3PmqR+1Ny5XIjSfue+kMd//drQ==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/nested-clients": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/property-provider": "^4.0.0", + "@smithy/shared-ini-file-loader": "^4.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", + "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-endpoints": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.730.0.tgz", + "integrity": "sha512-1KTFuVnk+YtLgWr6TwDiggcDqtPpOY2Cszt3r2lkXfaEAX6kHyOZi1vdvxXjPU5LsOBJem8HZ7KlkmrEi+xowg==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.723.0", + "@smithy/types": "^4.0.0", + "@smithy/util-endpoints": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz", - "integrity": "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==", - "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@smithy/core": "^3.7.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/nested-clients": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz", - "integrity": "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/token-providers": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz", - "integrity": "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==", - "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", - "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/util-endpoints": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", - "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", - "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.723.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.723.0.tgz", + "integrity": "sha512-Wh9I6j2jLhNFq6fmXydIpqD1WyQLyTfSxjW9B+PXSnPyk3jtQW8AKQur7p97rO8LAUzVI0bv8kb3ZzDEVbquIg==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.723.0", + "@smithy/types": "^4.0.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz", - "integrity": "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.730.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.730.0.tgz", + "integrity": "sha512-yBvkOAjqsDEl1va4eHNOhnFBk0iCY/DBFNyhvtTMqPF4NO+MITWpFs3J9JtZKzJlQ6x0Yb9TLQ8NhDjEISz5Ug==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.730.0", + "@aws-sdk/types": "3.723.0", + "@smithy/node-config-provider": "^4.0.0", + "@smithy/types": "^4.0.0", "tslib": "^2.6.2" }, "engines": { @@ -7947,19 +8053,7 @@ } } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", - "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/abort-controller": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/abort-controller": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", @@ -7971,7 +8065,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/config-resolver": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/config-resolver": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", @@ -7986,10 +8080,10 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/core": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.1.tgz", - "integrity": "sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/core": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.5.3.tgz", + "integrity": "sha512-xa5byV9fEguZNofCclv6v9ra0FYh5FATQW/da7FQUVTic94DfrN/NvmKZjrMyzbpqfot9ZjBaO8U1UeTbmSLuA==", "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", @@ -7997,7 +8091,7 @@ "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", + "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -8005,7 +8099,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/credential-provider-imds": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/credential-provider-imds": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", @@ -8020,10 +8114,10 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/fetch-http-handler": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", + "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", @@ -8035,7 +8129,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/hash-node": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/hash-node": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", @@ -8049,7 +8143,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/invalid-dependency": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/invalid-dependency": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", @@ -8061,7 +8155,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/is-array-buffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", @@ -8072,7 +8166,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-content-length": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-content-length": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", @@ -8085,12 +8179,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.16.tgz", - "integrity": "sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.11.tgz", + "integrity": "sha512-zDogwtRLzKl58lVS8wPcARevFZNBOOqnmzWWxVe9XiaXU2CADFjvJ9XfNibgkOWs08sxLuSr81NrpY4mgp9OwQ==", "dependencies": { - "@smithy/core": "^3.7.1", + "@smithy/core": "^3.5.3", "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -8103,18 +8197,18 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-retry": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.17.tgz", - "integrity": "sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-retry": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.12.tgz", + "integrity": "sha512-wvIH70c4e91NtRxdaLZF+mbLZ/HcC6yg7ySKUiufL6ESp6zJUSnJucZ309AvG9nqCFHSRB5I6T3Ez1Q9wCh0Ww==", "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.8", + "@smithy/service-error-classification": "^4.0.5", + "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-retry": "^4.0.5", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -8122,7 +8216,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-serde": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", @@ -8135,7 +8229,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/middleware-stack": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", @@ -8147,7 +8241,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-config-provider": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", @@ -8161,10 +8255,10 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/node-http-handler": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", + "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", @@ -8176,7 +8270,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/property-provider": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", @@ -8188,7 +8282,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/protocol-http": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", @@ -8200,7 +8294,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-builder": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", @@ -8213,7 +8307,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/querystring-parser": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", @@ -8225,10 +8319,10 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/service-error-classification": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.5.tgz", + "integrity": "sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA==", "dependencies": { "@smithy/types": "^4.3.1" }, @@ -8236,7 +8330,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", @@ -8248,7 +8342,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/signature-v4": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/signature-v4": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", @@ -8266,24 +8360,24 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/smithy-client": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.8.tgz", - "integrity": "sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/smithy-client": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.3.tgz", + "integrity": "sha512-xxzNYgA0HD6ETCe5QJubsxP0hQH3QK3kbpJz3QrosBCuIWyEXLR/CO5hFb2OeawEKUxMNhz3a1nuJNN2np2RMA==", "dependencies": { - "@smithy/core": "^3.7.1", - "@smithy/middleware-endpoint": "^4.1.16", + "@smithy/core": "^3.5.3", + "@smithy/middleware-endpoint": "^4.1.11", "@smithy/middleware-stack": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@smithy/util-stream": "^4.2.2", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/types": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", @@ -8294,7 +8388,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/url-parser": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", @@ -8307,7 +8401,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-base64": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", @@ -8320,7 +8414,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", @@ -8331,7 +8425,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-body-length-node": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-body-length-node": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", @@ -8342,7 +8436,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-buffer-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", @@ -8354,7 +8448,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-config-provider": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-config-provider": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", @@ -8365,13 +8459,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.24", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.24.tgz", - "integrity": "sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.19.tgz", + "integrity": "sha512-mvLMh87xSmQrV5XqnUYEPoiFFeEGYeAKIDDKdhE2ahqitm8OHM3aSvhqL6rrK6wm1brIk90JhxDf5lf2hbrLbQ==", "dependencies": { "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.8", + "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -8380,16 +8474,16 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.24", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.24.tgz", - "integrity": "sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.19", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.19.tgz", + "integrity": "sha512-8tYnx+LUfj6m+zkUUIrIQJxPM1xVxfRBvoGHua7R/i6qAxOMjqR6CpEpDwKoIs1o0+hOjGvkKE23CafKL0vJ9w==", "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.8", + "@smithy/smithy-client": "^4.4.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -8397,7 +8491,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-endpoints": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-endpoints": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", @@ -8410,7 +8504,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-hex-encoding": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-hex-encoding": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", @@ -8421,7 +8515,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-middleware": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-middleware": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", @@ -8433,12 +8527,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-retry": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.5.tgz", + "integrity": "sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg==", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", + "@smithy/service-error-classification": "^4.0.5", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -8446,13 +8540,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-stream": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", + "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", "dependencies": { - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", + "@smithy/fetch-http-handler": "^5.0.4", + "@smithy/node-http-handler": "^4.0.6", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", @@ -8464,7 +8558,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-uri-escape": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-uri-escape": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", @@ -8475,7 +8569,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", @@ -8487,569 +8581,62 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/@aws-sdk/client-datazone/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ] - }, - "node_modules/@aws-sdk/client-ec2": { - "version": "3.695.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-datazone": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-datazone/-/client-datazone-3.848.0.tgz", + "integrity": "sha512-m9x9G6oQHUVJvt9JsTdU41/nimz11MMmQLptQVgIJcD6VHoHoVXppvPntK7GUkH0T6+0gw63RugGd7kB+xofBQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-sdk-ec2": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/credential-provider-node": "3.848.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-stream": "^4.2.3", + "@smithy/util-utf8": "^4.0.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sts": { - "version": "3.693.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.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.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-ec2/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-ec2/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-ec2/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-glue": { - "version": "3.852.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-glue/-/client-glue-3.852.0.tgz", - "integrity": "sha512-5IyZt/gKr0NoUHWGM112ikXrZs+VsA/09bwKDmp4/j250tfaZqgC1zhfBNFkyNisj1JQ0XYjwfzkLnYWlT3Pyw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/credential-provider-node": "3.848.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/client-sso": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", - "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/client-sso": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", + "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -9094,7 +8681,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/core": { "version": "3.846.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz", "integrity": "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==", @@ -9119,7 +8706,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-env": { "version": "3.846.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz", "integrity": "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==", @@ -9134,7 +8721,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-http": { "version": "3.846.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz", "integrity": "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==", @@ -9154,7 +8741,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz", "integrity": "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==", @@ -9177,7 +8764,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-node": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz", "integrity": "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==", @@ -9199,7 +8786,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-process": { "version": "3.846.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz", "integrity": "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==", @@ -9215,7 +8802,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz", "integrity": "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==", @@ -9233,7 +8820,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz", "integrity": "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==", @@ -9249,7 +8836,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-host-header": { "version": "3.840.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", @@ -9263,7 +8850,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-logger": { "version": "3.840.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", @@ -9276,7 +8863,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.840.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", @@ -9290,7 +8877,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz", "integrity": "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==", @@ -9307,7 +8894,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/nested-clients": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/nested-clients": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz", "integrity": "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==", @@ -9355,7 +8942,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/region-config-resolver": { "version": "3.840.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", @@ -9371,7 +8958,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/token-providers": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz", "integrity": "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==", @@ -9388,7 +8975,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/types": { "version": "3.840.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", @@ -9400,7 +8987,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/util-endpoints": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", @@ -9415,7 +9002,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.840.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", @@ -9426,7 +9013,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.848.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz", "integrity": "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==", @@ -9449,7 +9036,7 @@ } } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/xml-builder": { + "node_modules/@aws-sdk/client-datazone/node_modules/@aws-sdk/xml-builder": { "version": "3.821.0", "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", @@ -9461,7 +9048,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/abort-controller": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/abort-controller": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", @@ -9473,7 +9060,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/config-resolver": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/config-resolver": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", @@ -9488,10 +9075,10 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/core": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", - "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/core": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.1.tgz", + "integrity": "sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw==", "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", @@ -9507,7 +9094,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/credential-provider-imds": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/credential-provider-imds": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", @@ -9522,7 +9109,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/fetch-http-handler": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/fetch-http-handler": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", @@ -9537,7 +9124,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/hash-node": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/hash-node": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", @@ -9551,7 +9138,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/invalid-dependency": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/invalid-dependency": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", @@ -9563,7 +9150,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/is-array-buffer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", @@ -9574,7 +9161,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-content-length": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-content-length": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", @@ -9587,12 +9174,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", - "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.16.tgz", + "integrity": "sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w==", "dependencies": { - "@smithy/core": "^3.7.2", + "@smithy/core": "^3.7.1", "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", "@smithy/shared-ini-file-loader": "^4.0.4", @@ -9605,15 +9192,15 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-retry": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", - "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-retry": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.17.tgz", + "integrity": "sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA==", "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.9", + "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", @@ -9624,7 +9211,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-serde": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-serde": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", @@ -9637,7 +9224,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-stack": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/middleware-stack": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", @@ -9649,7 +9236,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-config-provider": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/node-config-provider": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", @@ -9663,7 +9250,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-http-handler": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/node-http-handler": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", @@ -9678,7 +9265,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/property-provider": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/property-provider": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", @@ -9690,7 +9277,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/protocol-http": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/protocol-http": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", @@ -9702,7 +9289,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-builder": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/querystring-builder": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", @@ -9715,7 +9302,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-parser": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/querystring-parser": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", @@ -9727,7 +9314,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/service-error-classification": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/service-error-classification": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", @@ -9738,7 +9325,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/shared-ini-file-loader": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/shared-ini-file-loader": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", @@ -9750,7 +9337,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/signature-v4": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/signature-v4": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", @@ -9768,13 +9355,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/smithy-client": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", - "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/smithy-client": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.8.tgz", + "integrity": "sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w==", "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/core": "^3.7.1", + "@smithy/middleware-endpoint": "^4.1.16", "@smithy/middleware-stack": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", @@ -9785,7 +9372,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/types": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/types": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", @@ -9796,7 +9383,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/url-parser": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/url-parser": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", @@ -9809,7 +9396,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-base64": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-base64": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", @@ -9822,7 +9409,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-browser": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-body-length-browser": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", @@ -9833,7 +9420,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-node": { + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-body-length-node": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", @@ -9841,235 +9428,4922 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.24.tgz", + "integrity": "sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA==", + "dependencies": { + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.8", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.24", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.24.tgz", + "integrity": "sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g==", + "dependencies": { + "@smithy/config-resolver": "^4.1.4", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.8", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-middleware": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", + "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", + "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "dependencies": { + "@smithy/service-error-classification": "^4.0.6", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-stream": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", + "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] + }, + "node_modules/@aws-sdk/client-ec2": { + "version": "3.695.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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-sdk-ec2": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sts": { + "version": "3.693.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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-ec2/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-ec2/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-ec2/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-ecr": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.693.0.tgz", + "integrity": "sha512-qBI06wo2VaQI/+Pb4GmZRVQMnXFr9B983nWWNhM6xzcYmfJKXbCW29syDVojiwp8/HPMOSqcKJzqIOqCWtN1Ug==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-ecr/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-glue": { + "version": "3.852.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-glue/-/client-glue-3.852.0.tgz", + "integrity": "sha512-5IyZt/gKr0NoUHWGM112ikXrZs+VsA/09bwKDmp4/j250tfaZqgC1zhfBNFkyNisj1JQ0XYjwfzkLnYWlT3Pyw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/credential-provider-node": "3.848.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/client-sso": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", + "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/core": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz", + "integrity": "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/core": "^3.7.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz", + "integrity": "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==", + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz", + "integrity": "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==", + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz", + "integrity": "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==", + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/credential-provider-env": "3.846.0", + "@aws-sdk/credential-provider-http": "3.846.0", + "@aws-sdk/credential-provider-process": "3.846.0", + "@aws-sdk/credential-provider-sso": "3.848.0", + "@aws-sdk/credential-provider-web-identity": "3.848.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz", + "integrity": "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.846.0", + "@aws-sdk/credential-provider-http": "3.846.0", + "@aws-sdk/credential-provider-ini": "3.848.0", + "@aws-sdk/credential-provider-process": "3.846.0", + "@aws-sdk/credential-provider-sso": "3.848.0", + "@aws-sdk/credential-provider-web-identity": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz", + "integrity": "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==", + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz", + "integrity": "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==", + "dependencies": { + "@aws-sdk/client-sso": "3.848.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/token-providers": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz", + "integrity": "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==", + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", + "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-logger": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", + "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", + "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz", + "integrity": "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==", + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@smithy/core": "^3.7.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/nested-clients": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz", + "integrity": "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", + "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/token-providers": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz", + "integrity": "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==", + "dependencies": { + "@aws-sdk/core": "3.846.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-endpoints": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", + "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-endpoints": "^3.0.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", + "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz", + "integrity": "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/xml-builder": { + "version": "3.821.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", + "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/abort-controller": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", + "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/config-resolver": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", + "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/core": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", + "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", + "dependencies": { + "@smithy/middleware-serde": "^4.0.8", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-stream": "^4.2.3", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", + "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", + "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/hash-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", + "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/invalid-dependency": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", + "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-content-length": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", + "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", + "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", + "dependencies": { + "@smithy/core": "^3.7.2", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-middleware": "^4.0.4", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-retry": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", + "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", + "@smithy/service-error-classification": "^4.0.6", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-serde": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", + "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "dependencies": { + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-stack": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", + "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-config-provider": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", + "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "dependencies": { + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-http-handler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", + "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "dependencies": { + "@smithy/abort-controller": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/property-provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", + "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/protocol-http": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", + "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-builder": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", + "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-uri-escape": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", + "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/service-error-classification": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", + "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "dependencies": { + "@smithy/types": "^4.3.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", + "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/signature-v4": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", + "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/smithy-client": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", + "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", + "dependencies": { + "@smithy/core": "^3.7.2", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", + "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/url-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", + "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "dependencies": { + "@smithy/querystring-parser": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "dependencies": { + "@smithy/is-array-buffer": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", + "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", + "dependencies": { + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", + "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", + "dependencies": { + "@smithy/config-resolver": "^4.1.4", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-middleware": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", + "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", + "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "dependencies": { + "@smithy/service-error-classification": "^4.0.6", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-stream": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", + "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "dependencies": { + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] + }, + "node_modules/@aws-sdk/client-iam": { + "version": "3.693.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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sts": { + "version": "3.693.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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-iam/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-iam/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-iam/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-iot": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot/-/client-iot-3.693.0.tgz", + "integrity": "sha512-0EOKH6CjDHMdE1NSDdtZ8/zov+Xf1MovWvAeQGs76ec4mL2VWP5HvePjjdkGoOo0KC9k/AqOVVc0UOZjK0iCQw==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-iot/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/@aws-sdk/client-iot/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/@aws-sdk/client-iot/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/@aws-sdk/client-iotsecuretunneling": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iotsecuretunneling/-/client-iotsecuretunneling-3.693.0.tgz", + "integrity": "sha512-f9p5/TgVQsko0FlYIj9UKAVSfgPF4GgoKGVOI3Gx6XpynYwideGxItq3v0ExoAzpaohq6zRKleqA68o/T1TqXQ==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-iotsecuretunneling/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/@aws-sdk/client-iotsecuretunneling/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/@aws-sdk/client-iotsecuretunneling/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/@aws-sdk/client-lambda": { + "version": "3.637.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/eventstream-serde-browser": "^3.0.6", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.5", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/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-lambda/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift/-/client-redshift-3.693.0.tgz", + "integrity": "sha512-k+4emXXK7iOOYjTAU+Erj5RVxu68Hi6iI48h5r8iNMhWRUMqUq346tK5qkD4C4x9SzJu5j0WgPWpVUiHu8ufDw==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-data/-/client-redshift-data-3.693.0.tgz", + "integrity": "sha512-uG5LdlXz80KcauRIucMdiRSQJ2WutewQRHpcTQW4vFUf/kEhUha5fD9FMn+/eJ1NFA2N8hv64vhpzGvu7EiP6Q==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-redshift-data/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/@aws-sdk/client-redshift-data/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/@aws-sdk/client-redshift-data/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/@aws-sdk/client-redshift-serverless": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-serverless/-/client-redshift-serverless-3.693.0.tgz", + "integrity": "sha512-m6Bhw0Xx/x0KGKP9N7c+Jqs5VT6nkZbfwO+QTxllggsuNfAzGwluCw1hoY++/MQ9oFtioEu+ud7xWOlTIK8w/A==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", - "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", - "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "node_modules/@aws-sdk/client-redshift-serverless/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": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "node_modules/@aws-sdk/client-redshift-serverless/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": "^4.0.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ] - }, - "node_modules/@aws-sdk/client-iam": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-redshift-serverless/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": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -10115,8 +14389,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -10166,8 +14442,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -10215,8 +14493,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/core": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10235,8 +14515,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -10254,8 +14536,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -10278,8 +14562,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.693.0", @@ -10299,8 +14585,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.693.0", @@ -10316,8 +14604,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -10333,8 +14623,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10346,8 +14638,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10358,8 +14652,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10371,8 +14667,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -10387,8 +14685,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10402,8 +14702,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10419,8 +14721,10 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10432,8 +14736,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -10442,8 +14748,10 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "3.693.0", @@ -10464,8 +14772,10 @@ } } }, - "node_modules/@aws-sdk/client-iam/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-redshift/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" @@ -10474,8 +14784,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-redshift/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", @@ -10485,106 +14797,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/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-lambda": { - "version": "3.637.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-redshift/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", @@ -10594,17 +14810,6 @@ "node": ">=16.0.0" } }, - "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": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/client-s3": { "version": "3.693.0", "license": "Apache-2.0", @@ -18390,6 +22595,15 @@ "@aws/language-server-runtimes-types": "^0.1.41" } }, + "node_modules/@aws/lambda-invoke-store": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz", + "integrity": "sha512-ORHRQ2tmvnBXc8t/X9Z8IcSbBA4xTLKuN873FopzklHMeqBst7YG0d+AX97inkvDX+NChYtSr+qGfcqGFaI8Zw==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws/language-server-runtimes": { "version": "0.2.128", "resolved": "https://registry.npmjs.org/@aws/language-server-runtimes/-/language-server-runtimes-0.2.128.tgz", @@ -19542,7 +23756,9 @@ } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.1", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true, "license": "(Unlicense OR Apache-2.0)" }, @@ -22386,6 +26602,130 @@ "node": ">= 10.0.0" } }, + "node_modules/aws-sdk-client-mock": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-4.1.0.tgz", + "integrity": "sha512-h/tOYTkXEsAcV3//6C1/7U4ifSpKyJvb6auveAepqqNJl6TdZaPFEtKjBQNf8UxQdDP850knB2i/whq4zlsxJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sinon": "^17.0.3", + "sinon": "^18.0.1", + "tslib": "^2.1.0" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/@sinonjs/samsam": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", + "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/@types/sinon": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.4.tgz", + "integrity": "sha512-RHnIrhfPO3+tJT0s7cFaXGZvsL4bbR3/k7z3P312qMS4JaS2Tk+KiwiLx1S0rQ56ERj00u1/BtdyVd0FY+Pdew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/aws-sdk-client-mock/node_modules/nise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-6.1.1.tgz", + "integrity": "sha512-aMSAzLVY7LyeM60gvBS423nBmIPP+Wy7St7hsb+8/fc1HmeoHJfLO8CKse4u3BtOZvQLJghYPI2i/1WZrEj5/g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "^13.0.1", + "@sinonjs/text-encoding": "^0.7.3", + "just-extend": "^6.2.0", + "path-to-regexp": "^8.1.0" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", + "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/aws-sdk-client-mock/node_modules/sinon": { + "version": "18.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-18.0.1.tgz", + "integrity": "sha512-a2N2TDY1uGviajJ6r4D1CyRAkzE9NNVlYOV1wX5xQDuAk0ONgzgRl0EjCQuRCPxOwp13ghsMwt9Gdldujs39qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "@sinonjs/fake-timers": "11.2.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.2.0", + "nise": "^6.0.0", + "supports-color": "^7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, "node_modules/aws-sdk/node_modules/uuid": { "version": "8.0.0", "license": "MIT", @@ -24093,7 +28433,9 @@ "license": "MIT" }, "node_modules/diff": { - "version": "5.1.0", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" @@ -33262,7 +37604,7 @@ }, "packages/amazonq": { "name": "amazon-q-vscode", - "version": "1.101.0-SNAPSHOT", + "version": "1.103.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" @@ -33281,6 +37623,7 @@ "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", + "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", "@aws-sdk/client-apprunner": "<3.731.0", "@aws-sdk/client-cloudcontrol": "<3.731.0", @@ -33292,12 +37635,21 @@ "@aws-sdk/client-docdb": "<3.731.0", "@aws-sdk/client-docdb-elastic": "<3.731.0", "@aws-sdk/client-ec2": "<3.731.0", + "@aws-sdk/client-ecr": "~3.693.0", + "@aws-sdk/client-ecs": "~3.693.0", "@aws-sdk/client-glue": "^3.852.0", "@aws-sdk/client-iam": "<3.731.0", + "@aws-sdk/client-iot": "~3.693.0", + "@aws-sdk/client-iotsecuretunneling": "~3.693.0", "@aws-sdk/client-lambda": "<3.731.0", + "@aws-sdk/client-redshift": "~3.693.0", + "@aws-sdk/client-redshift-data": "~3.693.0", + "@aws-sdk/client-redshift-serverless": "~3.693.0", "@aws-sdk/client-s3": "<3.731.0", "@aws-sdk/client-s3-control": "^3.830.0", "@aws-sdk/client-sagemaker": "<3.696.0", + "@aws-sdk/client-schemas": "~3.693.0", + "@aws-sdk/client-secrets-manager": "~3.693.0", "@aws-sdk/client-sfn": "<3.731.0", "@aws-sdk/client-ssm": "<3.731.0", "@aws-sdk/client-sso": "<3.731.0", @@ -33407,6 +37759,7 @@ "@types/whatwg-url": "^11.0.4", "@types/xml2js": "^0.4.11", "@vue/compiler-sfc": "^3.3.2", + "aws-sdk-client-mock": "^4.1.0", "c8": "^9.0.0", "circular-dependency-plugin": "^5.2.2", "css-loader": "^6.10.0", @@ -33691,6 +38044,435 @@ "node": ">=16.0.0" } }, + "packages/core/node_modules/@aws-sdk/client-ecs": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.693.0.tgz", + "integrity": "sha512-HbMtxh+gBtdHS4v0lZk7mb/E9PtjK9m2mDxiqyTXcZkdYPnq3MGACgUNUt8Siv+BgzQJTP8jikflCeMQ4ECHmw==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-ecs/node_modules/@smithy/fetch-http-handler": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.3.tgz", + "integrity": "sha512-6SxNltSncI8s689nvnzZQc/dPXcpHQ34KUj6gR/HBroytKOd/isMG3gJF/zBE1TBmTT18TXyzhg3O3SOOqGEhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/core/node_modules/@aws-sdk/client-ecs/node_modules/@smithy/middleware-retry": { + "version": "3.0.34", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.34.tgz", + "integrity": "sha512-yVRr/AAtPZlUvwEkrq7S3x7Z8/xCd97m2hLDaqdz6ucP2RKHsBjEqaUA2ebNv2SsZoPEi+ZD0dZbOB1u37tGCA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/protocol-http": "^4.1.8", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/smithy-client": "^3.7.0", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-ecs/node_modules/@smithy/node-http-handler": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz", + "integrity": "sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.9", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-ecs/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-ecs/node_modules/@smithy/service-error-classification": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", + "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-ecs/node_modules/@smithy/util-retry": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", + "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-schemas": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-schemas/-/client-schemas-3.693.0.tgz", + "integrity": "sha512-a6B9z2hBlO67c8k6WMJNhFP26VCYEaL7aAo3oe/IbT1sncD6cSoROF5L0o9ebsosA+81Xkkvjj2zeF/+ohdAng==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-stream": "^3.3.0", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-schemas/node_modules/@smithy/fetch-http-handler": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.3.tgz", + "integrity": "sha512-6SxNltSncI8s689nvnzZQc/dPXcpHQ34KUj6gR/HBroytKOd/isMG3gJF/zBE1TBmTT18TXyzhg3O3SOOqGEhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/core/node_modules/@aws-sdk/client-schemas/node_modules/@smithy/middleware-retry": { + "version": "3.0.34", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.34.tgz", + "integrity": "sha512-yVRr/AAtPZlUvwEkrq7S3x7Z8/xCd97m2hLDaqdz6ucP2RKHsBjEqaUA2ebNv2SsZoPEi+ZD0dZbOB1u37tGCA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/protocol-http": "^4.1.8", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/smithy-client": "^3.7.0", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-schemas/node_modules/@smithy/node-http-handler": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz", + "integrity": "sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.9", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-schemas/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-schemas/node_modules/@smithy/service-error-classification": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", + "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-schemas/node_modules/@smithy/util-retry": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", + "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-secrets-manager": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.693.0.tgz", + "integrity": "sha512-PiXkl64LYhwZQ2zPQhxwpnLwGS7Lw8asFCj29SxEaYRnYra3ajE5d+Yvv68qC+diUNkeZh6k6zn7nEOZ4rWEwA==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/fetch-http-handler": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.3.tgz", + "integrity": "sha512-6SxNltSncI8s689nvnzZQc/dPXcpHQ34KUj6gR/HBroytKOd/isMG3gJF/zBE1TBmTT18TXyzhg3O3SOOqGEhA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "packages/core/node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/middleware-retry": { + "version": "3.0.34", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.34.tgz", + "integrity": "sha512-yVRr/AAtPZlUvwEkrq7S3x7Z8/xCd97m2hLDaqdz6ucP2RKHsBjEqaUA2ebNv2SsZoPEi+ZD0dZbOB1u37tGCA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^3.1.12", + "@smithy/protocol-http": "^4.1.8", + "@smithy/service-error-classification": "^3.0.11", + "@smithy/smithy-client": "^3.7.0", + "@smithy/types": "^3.7.2", + "@smithy/util-middleware": "^3.0.11", + "@smithy/util-retry": "^3.0.11", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/node-http-handler": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.3.tgz", + "integrity": "sha512-BrpZOaZ4RCbcJ2igiSNG16S+kgAc65l/2hmxWdmhyoGWHTLlzQzr06PXavJp9OBlPEG/sHlqdxjWmjzV66+BSQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^3.1.9", + "@smithy/protocol-http": "^4.1.8", + "@smithy/querystring-builder": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/protocol-http": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz", + "integrity": "sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/service-error-classification": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz", + "integrity": "sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.7.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "packages/core/node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/util-retry": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz", + "integrity": "sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^3.0.11", + "@smithy/types": "^3.7.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "packages/core/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "license": "Apache-2.0", @@ -34989,7 +39771,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.81.0-SNAPSHOT", + "version": "3.83.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/packages/amazonq/.changes/1.101.0.json b/packages/amazonq/.changes/1.101.0.json new file mode 100644 index 00000000000..7a72dabfc9e --- /dev/null +++ b/packages/amazonq/.changes/1.101.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-22", + "version": "1.101.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/1.102.0.json b/packages/amazonq/.changes/1.102.0.json new file mode 100644 index 00000000000..df8ee166397 --- /dev/null +++ b/packages/amazonq/.changes/1.102.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-30", + "version": "1.102.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/amazonq/.changes/next-release/Feature-ab31cbb6-3fe4-4ee3-a0a3-290430277856.json b/packages/amazonq/.changes/next-release/Feature-ab31cbb6-3fe4-4ee3-a0a3-290430277856.json new file mode 100644 index 00000000000..71c1583e77b --- /dev/null +++ b/packages/amazonq/.changes/next-release/Feature-ab31cbb6-3fe4-4ee3-a0a3-290430277856.json @@ -0,0 +1,4 @@ +{ + "type": "Feature", + "description": "Q CodeTransformation: add more job metadata to history table" +} diff --git a/packages/amazonq/CHANGELOG.md b/packages/amazonq/CHANGELOG.md index 5fac9084c01..361633276b5 100644 --- a/packages/amazonq/CHANGELOG.md +++ b/packages/amazonq/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.102.0 2025-10-30 + +- Miscellaneous non-user-facing changes + +## 1.101.0 2025-10-22 + +- Miscellaneous non-user-facing changes + ## 1.100.0 2025-10-16 - Miscellaneous non-user-facing changes diff --git a/packages/amazonq/package.json b/packages/amazonq/package.json index b9d491a258b..3e239d0cd0e 100644 --- a/packages/amazonq/package.json +++ b/packages/amazonq/package.json @@ -2,7 +2,7 @@ "name": "amazon-q-vscode", "displayName": "Amazon Q", "description": "The most capable generative AI–powered assistant for software development.", - "version": "1.101.0-SNAPSHOT", + "version": "1.103.0-SNAPSHOT", "extensionKind": [ "workspace" ], @@ -1387,26 +1387,61 @@ "fontCharacter": "\\f1e0" } }, - "aws-schemas-registry": { + "aws-sagemakerunifiedstudio-catalog": { "description": "AWS Contributed Icon", "default": { "fontPath": "./resources/fonts/aws-toolkit-icons.woff", "fontCharacter": "\\f1e1" } }, - "aws-schemas-schema": { + "aws-sagemakerunifiedstudio-spaces": { "description": "AWS Contributed Icon", "default": { "fontPath": "./resources/fonts/aws-toolkit-icons.woff", "fontCharacter": "\\f1e2" } }, - "aws-stepfunctions-preview": { + "aws-sagemakerunifiedstudio-spaces-dark": { "description": "AWS Contributed Icon", "default": { "fontPath": "./resources/fonts/aws-toolkit-icons.woff", "fontCharacter": "\\f1e3" } + }, + "aws-sagemakerunifiedstudio-symbol-int": { + "description": "AWS Contributed Icon", + "default": { + "fontPath": "./resources/fonts/aws-toolkit-icons.woff", + "fontCharacter": "\\f1e4" + } + }, + "aws-sagemakerunifiedstudio-table": { + "description": "AWS Contributed Icon", + "default": { + "fontPath": "./resources/fonts/aws-toolkit-icons.woff", + "fontCharacter": "\\f1e5" + } + }, + "aws-schemas-registry": { + "description": "AWS Contributed Icon", + "default": { + "fontPath": "./resources/fonts/aws-toolkit-icons.woff", + "fontCharacter": "\\f1e6" + } + }, + "aws-schemas-schema": { + "description": "AWS Contributed Icon", + "default": { + "fontPath": "./resources/fonts/aws-toolkit-icons.woff", + "fontCharacter": "\\f1e7" + } + }, + "aws-stepfunctions-preview": { + "description": "AWS Contributed Icon", + "default": { + "fontPath": "./resources/fonts/aws-toolkit-icons.woff", + "fontCharacter": "\\f1e8" + } } }, "walkthroughs": [ @@ -1435,17 +1470,6 @@ }, "completionEvents": [] }, - { - "id": "aws.amazonq.walkthrough.securityScan", - "title": "Check for security vulnerabilities", - "description": "Amazon Q scans your code to identify security vulnerabilities and suggests fixes.\n\nStart a scan from the status bar menu.\n\n[Scan your current project](command:_aws.amazonq.walkthrough.securityScanExample)\n\nIdentifies vulnerabilities in Python, Typescript, Ruby, AWS CDK, and [more](https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/q-language-ide-support.html#security-scans-language-support)", - "media": { - "markdown": "./resources/walkthrough/amazonq/scans.md" - }, - "completionEvents": [ - "onCommand:_aws.amazonq.walkthrough.securityScanExample" - ] - }, { "id": "aws.amazonq.walkthrough.settings", "title": "Access actions and options", diff --git a/packages/amazonq/test/unit/codewhisperer/service/codewhisperer.test.ts b/packages/amazonq/test/unit/codewhisperer/service/codewhisperer.test.ts index f30d92de496..9742c69d7df 100644 --- a/packages/amazonq/test/unit/codewhisperer/service/codewhisperer.test.ts +++ b/packages/amazonq/test/unit/codewhisperer/service/codewhisperer.test.ts @@ -12,7 +12,8 @@ import { codeWhispererClient, } from 'aws-core-vscode/codewhisperer' import { globals, getClientId, getOperatingSystem } from 'aws-core-vscode/shared' -import { AWSError, Request } from 'aws-sdk' +import { Request } from 'aws-sdk' +import { ServiceException } from '@smithy/smithy-client' import { createSpyClient } from 'aws-core-vscode/test' describe('codewhisperer', async function () { @@ -109,7 +110,7 @@ describe('codewhisperer', async function () { requestId: '', }, }), - } as Request) + } as Request) const expectedUserContext = { ideCategory: 'VSCODE', @@ -134,7 +135,7 @@ describe('codewhisperer', async function () { requestId: '', }, }), - } as Request) + } as Request) const authUtilStub = sinon.stub(AuthUtil.instance, 'isValidEnterpriseSsoInUse').returns(isSso) await globals.telemetry.setTelemetryEnabled(isTelemetryEnabled) diff --git a/packages/core/package.json b/packages/core/package.json index a4d7d0bb96b..7b2545ebf26 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -547,12 +547,13 @@ "@types/sinon": "^10.0.5", "@types/sinonjs__fake-timers": "^8.1.2", "@types/stream-buffers": "^3.0.7", + "@types/svgdom": "^0.1.2", "@types/tcp-port-used": "^1.0.1", "@types/uuid": "^9.0.1", "@types/whatwg-url": "^11.0.4", "@types/xml2js": "^0.4.11", - "@types/svgdom": "^0.1.2", "@vue/compiler-sfc": "^3.3.2", + "aws-sdk-client-mock": "^4.1.0", "c8": "^9.0.0", "circular-dependency-plugin": "^5.2.2", "css-loader": "^6.10.0", @@ -580,7 +581,7 @@ "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", - "@aws-sdk/credential-providers": "<3.731.0", + "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", "@aws-sdk/client-apprunner": "<3.731.0", "@aws-sdk/client-cloudcontrol": "<3.731.0", @@ -592,19 +593,29 @@ "@aws-sdk/client-docdb": "<3.731.0", "@aws-sdk/client-docdb-elastic": "<3.731.0", "@aws-sdk/client-ec2": "<3.731.0", + "@aws-sdk/client-ecr": "~3.693.0", + "@aws-sdk/client-ecs": "~3.693.0", "@aws-sdk/client-glue": "^3.852.0", "@aws-sdk/client-iam": "<3.731.0", + "@aws-sdk/client-iot": "~3.693.0", + "@aws-sdk/client-iotsecuretunneling": "~3.693.0", "@aws-sdk/client-lambda": "<3.731.0", + "@aws-sdk/client-redshift": "~3.693.0", + "@aws-sdk/client-redshift-data": "~3.693.0", + "@aws-sdk/client-redshift-serverless": "~3.693.0", "@aws-sdk/client-s3": "<3.731.0", "@aws-sdk/client-s3-control": "^3.830.0", "@aws-sdk/client-sagemaker": "<3.696.0", + "@aws-sdk/client-schemas": "~3.693.0", + "@aws-sdk/client-secrets-manager": "~3.693.0", + "@aws-sdk/client-sfn": "<3.731.0", "@aws-sdk/client-ssm": "<3.731.0", "@aws-sdk/client-sso": "<3.731.0", "@aws-sdk/client-sso-oidc": "<3.731.0", - "@aws-sdk/client-sfn": "<3.731.0", "@aws-sdk/credential-provider-env": "<3.731.0", "@aws-sdk/credential-provider-process": "<3.731.0", "@aws-sdk/credential-provider-sso": "<3.731.0", + "@aws-sdk/credential-providers": "<3.731.0", "@aws-sdk/lib-storage": "<3.731.0", "@aws-sdk/property-provider": "<3.731.0", "@aws-sdk/protocol-http": "<3.731.0", @@ -621,6 +632,7 @@ "@smithy/service-error-classification": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.0", "@smithy/util-retry": "^4.0.1", + "@svgdotjs/svg.js": "^3.0.16", "@vscode/debugprotocol": "^1.57.0", "@zip.js/zip.js": "^2.7.41", "adm-zip": "^0.5.10", @@ -639,6 +651,7 @@ "http2": "^3.3.6", "i18n-ts": "^1.0.5", "immutable": "^4.3.0", + "jaro-winkler": "^0.2.8", "jose": "5.4.1", "js-yaml": "^4.1.0", "jsonc-parser": "^3.2.0", @@ -648,9 +661,11 @@ "mime-types": "^2.1.32", "node-fetch": "^2.7.0", "portfinder": "^1.0.32", + "protobufjs": "^7.2.6", "semver": "^7.5.4", "stream-buffers": "^3.0.2", "strip-ansi": "^5.2.0", + "svgdom": "^0.1.0", "tcp-port-used": "^1.0.1", "vscode-languageclient": "^6.1.4", "vscode-languageserver": "^6.1.1", @@ -663,11 +678,7 @@ "winston-transport": "^4.6.0", "ws": "^8.16.0", "xml2js": "^0.6.1", - "yaml-cfn": "^0.3.2", - "protobufjs": "^7.2.6", - "@svgdotjs/svg.js": "^3.0.16", - "svgdom": "^0.1.0", - "jaro-winkler": "^0.2.8" + "yaml-cfn": "^0.3.2" }, "overrides": { "webfont": { diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index be5d5fbb69f..bda0d97b022 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -477,7 +477,8 @@ "AWS.toolkit.lambda.walkthrough.title": "Get started building your application", "AWS.toolkit.lambda.walkthrough.description": "Your quick guide to build an application visually, iterate locally, and deploy to the cloud!", "AWS.toolkit.lambda.walkthrough.toolInstall.title": "Complete installation", - "AWS.toolkit.lambda.walkthrough.toolInstall.description": "Manage your AWS services and resources with the AWS Command Line Interface (AWS CLI). \n\n[Install AWS CLI](command:aws.toolkit.installAWSCLI)\n\nBuild locally, invoke, and deploy your functions with the Serverless Application Model (SAM) CLI. \n\n[Install SAM CLI](command:aws.toolkit.installSAMCLI)\n\nDocker is an optional, third party tool that assists with local AWS Lambda runtime emulation. Docker is required to invoke Lambda functions on your local machine. \n\n[Install Docker (optional)](command:aws.toolkit.installDocker)\n\nEmulate your AWS cloud services locally with LocalStack to streamline testing in VS Code and CI environments. [Learn more](https://docs.localstack.cloud/aws/). \n\n[Install LocalStack (optional)](command:aws.toolkit.installLocalStack)", + "AWS.toolkit.lambda.walkthrough.toolInstall.description.windows": "Manage your AWS services and resources with the AWS Command Line Interface (AWS CLI). \n\n[Install AWS CLI](command:aws.toolkit.installAWSCLI)\n\nBuild locally, invoke, and deploy your functions with the Serverless Application Model (SAM) CLI. \n\n[Install SAM CLI](command:aws.toolkit.installSAMCLI)\n\nDocker is an optional, third party tool that assists with local AWS Lambda runtime emulation. Docker is required to invoke Lambda functions on your local machine. \n\n[Install Docker (optional)](command:aws.toolkit.installDocker)\n\nEmulate your AWS cloud services locally with LocalStack to streamline testing in VS Code and CI environments. [Learn more](https://docs.localstack.cloud/aws/). \n\n[Install LocalStack (optional)](command:aws.toolkit.installLocalStack)", + "AWS.toolkit.lambda.walkthrough.toolInstall.description": "Manage your AWS services and resources with the AWS Command Line Interface (AWS CLI). \n\n[Install AWS CLI](command:aws.toolkit.installAWSCLI)\n\nBuild locally, invoke, and deploy your functions with the Serverless Application Model (SAM) CLI. \n\n[Install SAM CLI](command:aws.toolkit.installSAMCLI)\n\nDocker is an optional, third party tool that assists with local AWS Lambda runtime emulation. Docker is required to invoke Lambda functions on your local machine. \n\n[Install Docker (optional)](command:aws.toolkit.installDocker)\n\nEmulate your AWS cloud services locally with LocalStack to streamline testing in VS Code and CI environments. [Learn more]((https://docs.localstack.cloud/aws/). \n\n[Install LocalStack (optional)](command:aws.toolkit.installLocalStack)\n\nFinch is an open source tool for local container development. Finch aims to help promote innovative upstream container projects by making it easy to install and use them. [Learn more](https://runfinch.com/) \n\n[Install Finch (optional)](command:aws.toolkit.installFinch)", "AWS.toolkit.lambda.walkthrough.chooseTemplate.title": "Choose your application template", "AWS.toolkit.lambda.walkthrough.chooseTemplate.description": "Select a starter application, visually compose an application from scratch, open an existing application, or browse more application examples. \n\nInfrastructure Composer allows you to visually compose modern applications in the cloud. It will define the necessary permissions between resources when you drag a connection between them. \n\n[Initialize your project](command:aws.toolkit.lambda.initializeWalkthroughProject)", "AWS.toolkit.lambda.walkthrough.step1.title": "Iterate locally", diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index d171eae31bf..5d21c6b77f7 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -403,9 +403,11 @@ export class GumbyController { await vscode.commands.executeCommand('aws.amazonq.transformationHub.summary.reveal') break case ButtonActions.STOP_TRANSFORMATION_JOB: - await stopTransformByQ(transformByQState.getJobId()) - await postTransformationJob() - await cleanupTransformationJob() + if (transformByQState.isRunning() || transformByQState.isRefreshInProgress()) { + await stopTransformByQ(transformByQState.getJobId()) + await postTransformationJob() + await cleanupTransformationJob() + } break case ButtonActions.CONFIRM_START_TRANSFORMATION_FLOW: this.resetTransformationChatFlow() diff --git a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts index 409ee89ab04..fb8da4c7096 100644 --- a/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts +++ b/packages/core/src/amazonqGumby/chat/controller/messenger/messenger.ts @@ -400,11 +400,22 @@ export class Messenger { } public sendJobRefreshInProgressMessage(tabID: string, jobId: string) { - this.dispatcher.sendAsyncEventProgress( - new AsyncEventProgressMessage(tabID, { - inProgress: true, - message: CodeWhispererConstants.refreshingJobChatMessage(jobId), - }) + const buttons: ChatItemButton[] = [] + buttons.push({ + keepCardAfterClick: true, + text: CodeWhispererConstants.stopTransformationButtonText, + id: ButtonActions.STOP_TRANSFORMATION_JOB, + disabled: false, + }) + this.dispatcher.sendChatMessage( + new ChatMessage( + { + message: CodeWhispererConstants.refreshingJobChatMessage(jobId), + messageType: 'ai-prompt', + buttons: buttons, + }, + tabID + ) ) } diff --git a/packages/core/src/awsService/accessanalyzer/vue/constants.ts b/packages/core/src/awsService/accessanalyzer/vue/constants.ts index d43c8ba23c4..2c0ddb0585b 100644 --- a/packages/core/src/awsService/accessanalyzer/vue/constants.ts +++ b/packages/core/src/awsService/accessanalyzer/vue/constants.ts @@ -30,8 +30,6 @@ export type PolicyChecksCheckType = 'CheckNoNewAccess' | 'CheckAccessNotGranted' export type PolicyChecksPolicyType = 'Identity' | 'Resource' -export type ValidatePolicyFindingType = 'ERROR' | 'SECURITY_WARNING' | 'SUGGESTION' | 'WARNING' - export type PolicyChecksResult = 'Success' | 'Warning' | 'Error' export type PolicyChecksUiClick = diff --git a/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts b/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts index e7603400c0a..42521e73ec6 100644 --- a/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts +++ b/packages/core/src/awsService/accessanalyzer/vue/iamPolicyChecks.ts @@ -11,7 +11,8 @@ import { localize } from '../../../shared/utilities/vsCodeUtils' import { VueWebview, VueWebviewPanel } from '../../../webviews/main' import { ExtContext } from '../../../shared/extensions' import { telemetry } from '../../../shared/telemetry/telemetry' -import { AccessAnalyzer, SharedIniFileCredentials } from 'aws-sdk' +import { AccessAnalyzerClient, ValidatePolicyCommand } from '@aws-sdk/client-accessanalyzer' +import { fromIni } from '@aws-sdk/credential-providers' import { ToolkitError } from '../../../shared/errors' import { makeTemporaryToolkitFolder, tryRemoveFolder } from '../../../shared/filesystemUtilities' import globals from '../../../shared/extensionGlobals' @@ -23,7 +24,6 @@ import { PolicyChecksPolicyType, PolicyChecksResult, PolicyChecksUiClick, - ValidatePolicyFindingType, } from './constants' import { S3Client, parseS3Uri } from '../../../shared/clients/s3' import { ExpiredTokenException } from '@aws-sdk/client-sso-oidc' @@ -61,7 +61,7 @@ export class IamPolicyChecksWebview extends VueWebview { public constructor( private readonly data: IamPolicyChecksInitialData, - private client: AccessAnalyzer, + private client: AccessAnalyzerClient, private readonly region: string, public readonly onChangeInputPath = new vscode.EventEmitter(), public readonly onChangeCheckNoNewAccessFilePath = new vscode.EventEmitter(), @@ -179,85 +179,94 @@ export class IamPolicyChecksWebview extends VueWebview { documentType, inputPolicyType: policyType ? policyType : 'None', }) - this.client.config.credentials = new SharedIniFileCredentials({ + this.client.config.credentials = fromIni({ profile: `${getProfileName()}`, }) // We need to detect changes in the user's credentials - this.client.validatePolicy( - { - policyDocument: IamPolicyChecksWebview.editedDocument, - policyType: policyType === 'Identity' ? 'IDENTITY_POLICY' : 'RESOURCE_POLICY', - }, - (err, data) => { - if (err) { + this.client + .send( + new ValidatePolicyCommand({ + policyDocument: IamPolicyChecksWebview.editedDocument, + policyType: policyType === 'Identity' ? 'IDENTITY_POLICY' : 'RESOURCE_POLICY', + }) + ) + .then((data) => { + if (data.findings && data.findings.length > 0) { span.record({ - findingsCount: 0, + findingsCount: data.findings.length, }) - if (err instanceof ExpiredTokenException) { - this.onValidatePolicyResponse.fire([ - IamPolicyChecksConstants.InvalidAwsCredentials, - getResultCssColor('Error'), - ]) - } else { - this.onValidatePolicyResponse.fire([err.message, getResultCssColor('Error')]) - } - } else { - if (data.findings.length > 0) { - span.record({ - findingsCount: data.findings.length, - }) - // eslint-disable-next-line unicorn/no-array-for-each - data.findings.forEach((finding: AccessAnalyzer.ValidatePolicyFinding) => { - const message = `${finding.findingType}: ${finding.issueCode} - ${finding.findingDetails} Learn more: ${finding.learnMoreLink}` - if ((finding.findingType as ValidatePolicyFindingType) === 'ERROR') { - diagnostics.push( - new vscode.Diagnostic( - new vscode.Range( - finding.locations[0].span.start.line, - finding.locations[0].span.start.offset, - finding.locations[0].span.end.line, - finding.locations[0].span.end.offset - ), - message, - vscode.DiagnosticSeverity.Error - ) - ) - validatePolicyDiagnosticCollection.set( - IamPolicyChecksWebview.editedDocumentUri, - diagnostics + // eslint-disable-next-line unicorn/no-array-for-each + data.findings.forEach((finding) => { + const locationSpan = finding.locations?.[0].span + if ( + !locationSpan?.start?.line || + !locationSpan.start.offset || + !locationSpan.end?.line || + !locationSpan.end.offset + ) { + return + } + const message = `${finding.findingType}: ${finding.issueCode} - ${finding.findingDetails} Learn more: ${finding.learnMoreLink}` + if (finding.findingType === 'ERROR') { + diagnostics.push( + new vscode.Diagnostic( + new vscode.Range( + locationSpan.start.line, + locationSpan.start.offset, + locationSpan.end.line, + locationSpan.end.offset + ), + message, + vscode.DiagnosticSeverity.Error ) - } else { - diagnostics.push( - new vscode.Diagnostic( - new vscode.Range( - finding.locations[0].span.start.line, - finding.locations[0].span.start.offset, - finding.locations[0].span.end.line, - finding.locations[0].span.end.offset - ), - message, - vscode.DiagnosticSeverity.Warning - ) + ) + validatePolicyDiagnosticCollection.set( + IamPolicyChecksWebview.editedDocumentUri, + diagnostics + ) + } else { + diagnostics.push( + new vscode.Diagnostic( + new vscode.Range( + locationSpan.start.line, + locationSpan.start.offset, + locationSpan.end.line, + locationSpan.end.offset + ), + message, + vscode.DiagnosticSeverity.Warning ) - validatePolicyDiagnosticCollection.set( - IamPolicyChecksWebview.editedDocumentUri, - diagnostics - ) - } - }) - this.onValidatePolicyResponse.fire([ - IamPolicyChecksConstants.ValidatePolicySuccessWithFindings, - getResultCssColor('Warning'), - ]) - void vscode.commands.executeCommand('workbench.actions.view.problems') - } else { - this.onValidatePolicyResponse.fire([ - IamPolicyChecksConstants.ValidatePolicySuccessNoFindings, - getResultCssColor('Success'), - ]) - } + ) + validatePolicyDiagnosticCollection.set( + IamPolicyChecksWebview.editedDocumentUri, + diagnostics + ) + } + }) + this.onValidatePolicyResponse.fire([ + IamPolicyChecksConstants.ValidatePolicySuccessWithFindings, + getResultCssColor('Warning'), + ]) + void vscode.commands.executeCommand('workbench.actions.view.problems') + } else { + this.onValidatePolicyResponse.fire([ + IamPolicyChecksConstants.ValidatePolicySuccessNoFindings, + getResultCssColor('Success'), + ]) + } + }) + .catch((err) => { + span.record({ + findingsCount: 0, + }) + if (err instanceof ExpiredTokenException) { + this.onValidatePolicyResponse.fire([ + IamPolicyChecksConstants.InvalidAwsCredentials, + getResultCssColor('Error'), + ]) + } else { + this.onValidatePolicyResponse.fire([err.message, getResultCssColor('Error')]) } - } - ) + }) }) return } else { @@ -781,7 +790,7 @@ const Panel = VueWebview.compilePanel(IamPolicyChecksWebview) export async function renderIamPolicyChecks(context: ExtContext): Promise { const logger: Logger = getLogger() try { - const client = new AccessAnalyzer({ region: context.regionProvider.defaultRegionId }) + const client = new AccessAnalyzerClient({ region: context.regionProvider.defaultRegionId }) // Read from settings to auto-fill some inputs const checkNoNewAccessFilePath: string = vscode.workspace .getConfiguration() diff --git a/packages/core/src/awsService/apigateway/commands/copyUrl.ts b/packages/core/src/awsService/apigateway/commands/copyUrl.ts index 583c0ead91d..7c19ffa9254 100644 --- a/packages/core/src/awsService/apigateway/commands/copyUrl.ts +++ b/packages/core/src/awsService/apigateway/commands/copyUrl.ts @@ -11,7 +11,7 @@ import * as picker from '../../../shared/ui/picker' import * as vscode from 'vscode' import { ProgressLocation } from 'vscode' -import { Stage } from 'aws-sdk/clients/apigateway' +import { Stage } from '@aws-sdk/client-api-gateway' import { ApiGatewayClient } from '../../../shared/clients/apiGateway' import { defaultDnsSuffix, RegionProvider } from '../../../shared/regions/regionProvider' import { getLogger } from '../../../shared/logger/logger' diff --git a/packages/core/src/awsService/apigateway/explorer/apiGatewayNodes.ts b/packages/core/src/awsService/apigateway/explorer/apiGatewayNodes.ts index 30a359d80ad..c23b6cb972f 100644 --- a/packages/core/src/awsService/apigateway/explorer/apiGatewayNodes.ts +++ b/packages/core/src/awsService/apigateway/explorer/apiGatewayNodes.ts @@ -12,7 +12,7 @@ import { AWSTreeNodeBase } from '../../../shared/treeview/nodes/awsTreeNodeBase' import { PlaceholderNode } from '../../../shared/treeview/nodes/placeholderNode' import { compareTreeItems, makeChildrenNodes } from '../../../shared/treeview/utils' import { ApiGatewayClient } from '../../../shared/clients/apiGateway' -import { RestApi } from 'aws-sdk/clients/apigateway' +import { RestApi } from '@aws-sdk/client-api-gateway' import { toArrayAsync, toMap, updateInPlace } from '../../../shared/utilities/collectionUtils' import { RestApiNode } from './apiNodes' diff --git a/packages/core/src/awsService/apigateway/explorer/apiNodes.ts b/packages/core/src/awsService/apigateway/explorer/apiNodes.ts index 5e20de603f0..02280a74368 100644 --- a/packages/core/src/awsService/apigateway/explorer/apiNodes.ts +++ b/packages/core/src/awsService/apigateway/explorer/apiNodes.ts @@ -5,7 +5,7 @@ import { AWSResourceNode } from '../../../shared/treeview/nodes/awsResourceNode' import { AWSTreeNodeBase } from '../../../shared/treeview/nodes/awsTreeNodeBase' -import { RestApi } from 'aws-sdk/clients/apigateway' +import { RestApi } from '@aws-sdk/client-api-gateway' export class RestApiNode extends AWSTreeNodeBase implements AWSResourceNode { public override id!: string diff --git a/packages/core/src/awsService/apigateway/vue/invokeRemoteRestApi.ts b/packages/core/src/awsService/apigateway/vue/invokeRemoteRestApi.ts index df4f441d5c0..4e8389c89bc 100644 --- a/packages/core/src/awsService/apigateway/vue/invokeRemoteRestApi.ts +++ b/packages/core/src/awsService/apigateway/vue/invokeRemoteRestApi.ts @@ -8,7 +8,7 @@ import { RestApiNode } from '../explorer/apiNodes' import { getLogger, Logger } from '../../../shared/logger/logger' import { toArrayAsync } from '../../../shared/utilities/collectionUtils' -import { Resource } from 'aws-sdk/clients/apigateway' +import { Resource } from '@aws-sdk/client-api-gateway' import { localize } from '../../../shared/utilities/vsCodeUtils' import { Result } from '../../../shared/telemetry/telemetry' import { VueWebview } from '../../../webviews/main' diff --git a/packages/core/src/awsService/appBuilder/activation.ts b/packages/core/src/awsService/appBuilder/activation.ts index 01f01a1b4c8..93cf1119448 100644 --- a/packages/core/src/awsService/appBuilder/activation.ts +++ b/packages/core/src/awsService/appBuilder/activation.ts @@ -150,6 +150,9 @@ async function registerAppBuilderCommands(context: ExtContext): Promise { Commands.register('aws.toolkit.installLocalStack', async () => { await installLocalStackExtension(source) }), + Commands.register('aws.toolkit.installFinch', async () => { + await getOrInstallCliWrapper('finch', source) + }), Commands.register('aws.toolkit.lambda.setWalkthroughToAPI', async () => { await setWalkthrough('API') }), diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts index 323f0dbd6c5..59b9662c70b 100644 --- a/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts @@ -13,7 +13,8 @@ import { getLogger } from '../../../../shared/logger/logger' import { DefaultLambdaClient } from '../../../../shared/clients/lambdaClient' import globals from '../../../../shared/extensionGlobals' import { defaultPartition } from '../../../../shared/regions/regionProvider' -import { Lambda, APIGateway } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' +import { RestApi } from '@aws-sdk/client-api-gateway' import { LambdaNode } from '../../../../lambda/explorer/lambdaNodes' import { LambdaFunctionNode } from '../../../../lambda/explorer/lambdaFunctionNode' import { S3Client, toBucket } from '../../../../shared/clients/s3' @@ -88,10 +89,10 @@ export async function generateDeployedNode( case SERVERLESS_FUNCTION_TYPE: { const defaultClient = new DefaultLambdaClient(regionCode) const lambdaNode = new LambdaNode(regionCode, defaultClient) - let configuration: Lambda.FunctionConfiguration + let configuration: FunctionConfiguration try { configuration = (await defaultClient.getFunction(deployedResource.PhysicalResourceId)) - .Configuration as Lambda.FunctionConfiguration + .Configuration as FunctionConfiguration newDeployedResource = new LambdaFunctionNode( lambdaNode, regionCode, @@ -120,12 +121,7 @@ export async function generateDeployedNode( const apiParentNode = new ApiGatewayNode(partitionId, regionCode) const apiNodes = await apiParentNode.getChildren() const apiNode = apiNodes.find((node) => node.id === deployedResource.PhysicalResourceId) - newDeployedResource = new RestApiNode( - apiParentNode, - partitionId, - regionCode, - apiNode as APIGateway.RestApi - ) + newDeployedResource = new RestApiNode(apiParentNode, partitionId, regionCode, apiNode as RestApi) break } default: diff --git a/packages/core/src/awsService/appBuilder/explorer/samProject.ts b/packages/core/src/awsService/appBuilder/explorer/samProject.ts index 722ec323192..faba9bcad76 100644 --- a/packages/core/src/awsService/appBuilder/explorer/samProject.ts +++ b/packages/core/src/awsService/appBuilder/explorer/samProject.ts @@ -9,6 +9,7 @@ import { SamConfig, SamConfigErrorCode } from '../../../shared/sam/config' import { getLogger } from '../../../shared/logger/logger' import { ToolkitError } from '../../../shared/errors' import { showViewLogsMessage } from '../../../shared/utilities/messages' +import { Runtime } from '@aws-sdk/client-lambda' export interface SamApp { location: SamAppLocation @@ -24,7 +25,7 @@ export interface SamAppLocation { export interface ResourceTreeEntity { Id: string Type: string - Runtime?: string + Runtime?: Runtime CodeUri?: string Handler?: string Events?: ResourceTreeEntity[] diff --git a/packages/core/src/awsService/appBuilder/lambda2sam/lambda2sam.ts b/packages/core/src/awsService/appBuilder/lambda2sam/lambda2sam.ts index 20f7c372583..75722842bc5 100644 --- a/packages/core/src/awsService/appBuilder/lambda2sam/lambda2sam.ts +++ b/packages/core/src/awsService/appBuilder/lambda2sam/lambda2sam.ts @@ -26,7 +26,7 @@ import { import { downloadUnzip, getLambdaClient, getCFNClient, isPermissionError } from '../utils' import { openProjectInWorkspace } from '../walkthrough' import { ToolkitError } from '../../../shared/errors' -import { ResourcesToImport, StackResource } from 'aws-sdk/clients/cloudformation' +import { ResourceToImport, StackResource } from '@aws-sdk/client-cloudformation' import { SignatureV4 } from '@smithy/signature-v4' import { Sha256 } from '@aws-crypto/sha256-js' import { getIAMConnection } from '../../../auth/utils' @@ -79,7 +79,7 @@ export async function lambdaToSam(lambdaNode: LambdaFunctionNode): Promise progress.report({ increment: 30, message: 'Generating template...' }) // 2.1 call api to get CFN let cfnTemplate: Template - let resourcesToImport: ResourcesToImport + let resourcesToImport: ResourceToImport[] try { ;[cfnTemplate, resourcesToImport] = await callExternalApiForCfnTemplate(lambdaNode) } catch (error) { @@ -282,7 +282,7 @@ export function ifSamTemplate(template: Template): boolean { */ export async function callExternalApiForCfnTemplate( lambdaNode: LambdaFunctionNode -): Promise<[Template, ResourcesToImport]> { +): Promise<[Template, ResourceToImport[]]> { const conn = await getIAMConnection() if (!conn || conn.type !== 'iam') { return [{}, []] @@ -333,7 +333,7 @@ export async function callExternalApiForCfnTemplate( let status: string | undefined = 'CREATE_IN_PROGRESS' let getGeneratedTemplateResponse - let resourcesToImport: ResourcesToImport = [] + let resourcesToImport: ResourceToImport[] = [] const cfn = await getCFNClient(lambdaNode.regionCode) // Wait for template generation to complete @@ -438,7 +438,7 @@ async function promptForProjectLocation(): Promise { */ export async function deployCfnTemplate( template: Template, - resourcesToImport: ResourcesToImport, + resourcesToImport: ResourceToImport[], stackName: string, region: string ): Promise { @@ -901,13 +901,13 @@ export async function getPhysicalIdfromCFNResourceName( // Find resources that start with the given name (SAM transform often adds suffixes) const matchingResources = resources.StackResources.filter((resource: StackResource) => - resource.LogicalResourceId.startsWith(name) + resource.LogicalResourceId?.startsWith(name) ) if (matchingResources.length === 0) { // Try a more flexible approach - check if the resource name is a substring const substringMatches = resources.StackResources.filter((resource: StackResource) => - resource.LogicalResourceId.includes(name) + resource.LogicalResourceId?.includes(name) ) if (substringMatches.length === 0) { @@ -926,7 +926,8 @@ export async function getPhysicalIdfromCFNResourceName( // If we have multiple matches, prefer exact prefix match // Sort by length to get the closest match (shortest additional suffix) matchingResources.sort( - (a: StackResource, b: StackResource) => a.LogicalResourceId.length - b.LogicalResourceId.length + (a: StackResource, b: StackResource) => + (a.LogicalResourceId?.length ?? 0) - (b.LogicalResourceId?.length ?? 0) ) const bestMatch = matchingResources[0] diff --git a/packages/core/src/awsService/appBuilder/utils.ts b/packages/core/src/awsService/appBuilder/utils.ts index bdaa6293b30..d88aa170f57 100644 --- a/packages/core/src/awsService/appBuilder/utils.ts +++ b/packages/core/src/awsService/appBuilder/utils.ts @@ -21,8 +21,51 @@ import { RuntimeFamily, getFamily } from '../../lambda/models/samLambdaRuntime' import { showMessage } from '../../shared/utilities/messages' import { DefaultLambdaClient } from '../../shared/clients/lambdaClient' import AdmZip from 'adm-zip' -import { CloudFormation, Lambda } from 'aws-sdk' +import { + CloudFormationClient, + CreateChangeSetCommand, + CreateChangeSetInput, + CreateChangeSetOutput, + DescribeChangeSetCommand, + DescribeChangeSetInput, + DescribeChangeSetOutput, + DescribeGeneratedTemplateCommand, + DescribeGeneratedTemplateInput, + DescribeGeneratedTemplateOutput, + DescribeStackResourceCommand, + DescribeStackResourceInput, + DescribeStackResourceOutput, + DescribeStackResourcesCommand, + DescribeStackResourcesInput, + DescribeStackResourcesOutput, + DescribeStacksCommand, + DescribeStacksInput, + DescribeStacksOutput, + ExecuteChangeSetCommand, + ExecuteChangeSetInput, + ExecuteChangeSetOutput, + GetGeneratedTemplateCommand, + GetGeneratedTemplateInput, + GetGeneratedTemplateOutput, + GetTemplateCommand, + GetTemplateInput, + GetTemplateOutput, + waitUntilChangeSetCreateComplete, + waitUntilStackImportComplete, + waitUntilStackUpdateComplete, +} from '@aws-sdk/client-cloudformation' +import { + FunctionConfiguration, + FunctionUrlConfig, + GetFunctionResponse, + GetLayerVersionResponse, + InvocationRequest, + InvocationResponse, + LayerVersionsListItem, + Runtime, +} from '@aws-sdk/client-lambda' import { isAwsError, UnknownError } from '../../shared/errors' +import { WaiterConfiguration } from '@aws-sdk/types' const localize = nls.loadMessageBundle() /** @@ -230,7 +273,7 @@ export class EnhancedLambdaClient { } } - async invoke(name: string, payload?: Lambda.InvocationRequest['Payload']): Promise { + async invoke(name: string, payload?: InvocationRequest['Payload']): Promise { try { return await this.client.invoke(name, payload) } catch (error) { @@ -246,7 +289,7 @@ export class EnhancedLambdaClient { } } - async *listFunctions(): AsyncIterableIterator { + async *listFunctions(): AsyncIterableIterator { try { yield* this.client.listFunctions() } catch (error) { @@ -257,7 +300,7 @@ export class EnhancedLambdaClient { } } - async getFunction(name: string): Promise { + async getFunction(name: string): Promise { try { return await this.client.getFunction(name) } catch (error) { @@ -273,7 +316,7 @@ export class EnhancedLambdaClient { } } - async getLayerVersion(name: string, version: number): Promise { + async getLayerVersion(name: string, version: number): Promise { try { return await this.client.getLayerVersion(name, version) } catch (error) { @@ -289,7 +332,7 @@ export class EnhancedLambdaClient { } } - async *listLayerVersions(name: string): AsyncIterableIterator { + async *listLayerVersions(name: string): AsyncIterableIterator { try { yield* this.client.listLayerVersions(name) } catch (error) { @@ -305,7 +348,7 @@ export class EnhancedLambdaClient { } } - async getFunctionUrlConfigs(name: string): Promise { + async getFunctionUrlConfigs(name: string): Promise { try { return await this.client.getFunctionUrlConfigs(name) } catch (error) { @@ -321,7 +364,7 @@ export class EnhancedLambdaClient { } } - async updateFunctionCode(name: string, zipFile: Uint8Array): Promise { + async updateFunctionCode(name: string, zipFile: Uint8Array): Promise { try { return await this.client.updateFunctionCode(name, zipFile) } catch (error) { @@ -343,13 +386,13 @@ export class EnhancedLambdaClient { */ export class EnhancedCloudFormationClient { constructor( - private readonly client: CloudFormation, + private readonly client: CloudFormationClient, private readonly regionCode: string ) {} - async describeStacks(params: CloudFormation.DescribeStacksInput): Promise { + async describeStacks(params: DescribeStacksInput): Promise { try { - return await this.client.describeStacks(params).promise() + return await this.client.send(new DescribeStacksCommand(params)) } catch (error) { if (isPermissionError(error)) { const stackArn = params.StackName @@ -361,9 +404,9 @@ export class EnhancedCloudFormationClient { } } - async getTemplate(params: CloudFormation.GetTemplateInput): Promise { + async getTemplate(params: GetTemplateInput): Promise { try { - return await this.client.getTemplate(params).promise() + return await this.client.send(new GetTemplateCommand(params)) } catch (error) { if (isPermissionError(error)) { const stackArn = params.StackName @@ -375,9 +418,9 @@ export class EnhancedCloudFormationClient { } } - async createChangeSet(params: CloudFormation.CreateChangeSetInput): Promise { + async createChangeSet(params: CreateChangeSetInput): Promise { try { - return await this.client.createChangeSet(params).promise() + return await this.client.send(new CreateChangeSetCommand(params)) } catch (error) { if (isPermissionError(error)) { const stackArn = params.StackName @@ -389,11 +432,9 @@ export class EnhancedCloudFormationClient { } } - async executeChangeSet( - params: CloudFormation.ExecuteChangeSetInput - ): Promise { + async executeChangeSet(params: ExecuteChangeSetInput): Promise { try { - return await this.client.executeChangeSet(params).promise() + return await this.client.send(new ExecuteChangeSetCommand(params)) } catch (error) { if (isPermissionError(error)) { const stackArn = params.StackName @@ -405,11 +446,9 @@ export class EnhancedCloudFormationClient { } } - async describeChangeSet( - params: CloudFormation.DescribeChangeSetInput - ): Promise { + async describeChangeSet(params: DescribeChangeSetInput): Promise { try { - return await this.client.describeChangeSet(params).promise() + return await this.client.send(new DescribeChangeSetCommand(params)) } catch (error) { if (isPermissionError(error)) { const stackArn = params.StackName @@ -421,11 +460,9 @@ export class EnhancedCloudFormationClient { } } - async describeStackResources( - params: CloudFormation.DescribeStackResourcesInput - ): Promise { + async describeStackResources(params: DescribeStackResourcesInput): Promise { try { - return await this.client.describeStackResources(params).promise() + return await this.client.send(new DescribeStackResourcesCommand(params)) } catch (error) { if (isPermissionError(error)) { const stackArn = params.StackName @@ -437,11 +474,9 @@ export class EnhancedCloudFormationClient { } } - async describeStackResource( - params: CloudFormation.DescribeStackResourceInput - ): Promise { + async describeStackResource(params: DescribeStackResourceInput): Promise { try { - return await this.client.describeStackResource(params).promise() + return await this.client.send(new DescribeStackResourceCommand(params)) } catch (error) { if (isPermissionError(error)) { const stackArn = params.StackName @@ -453,11 +488,9 @@ export class EnhancedCloudFormationClient { } } - async getGeneratedTemplate( - params: CloudFormation.GetGeneratedTemplateInput - ): Promise { + async getGeneratedTemplate(params: GetGeneratedTemplateInput): Promise { try { - return await this.client.getGeneratedTemplate(params).promise() + return await this.client.send(new GetGeneratedTemplateCommand(params)) } catch (error) { if (isPermissionError(error)) { throw createEnhancedPermissionError(error, 'cloudformation', 'getGeneratedTemplate') @@ -466,11 +499,9 @@ export class EnhancedCloudFormationClient { } } - async describeGeneratedTemplate( - params: CloudFormation.DescribeGeneratedTemplateInput - ): Promise { + async describeGeneratedTemplate(params: DescribeGeneratedTemplateInput): Promise { try { - return await this.client.describeGeneratedTemplate(params).promise() + return await this.client.send(new DescribeGeneratedTemplateCommand(params)) } catch (error) { if (isPermissionError(error)) { throw createEnhancedPermissionError(error, 'cloudformation', 'describeGeneratedTemplate') @@ -481,7 +512,20 @@ export class EnhancedCloudFormationClient { async waitFor(state: string, params: any): Promise { try { - return await this.client.waitFor(state as any, params).promise() + const waiterConfig = { + client: this.client, + maxWaitTime: 900, + } satisfies WaiterConfiguration + switch (state) { + case 'changeSetCreateComplete': + return await waitUntilChangeSetCreateComplete(waiterConfig, params) + case 'stackImportComplete': + return await waitUntilStackImportComplete(waiterConfig, params) + case 'stackUpdateComplete': + return await waitUntilStackUpdateComplete(waiterConfig, params) + default: + throw new Error(`Unsupported waiter state: ${state}`) + } } catch (error) { if (isPermissionError(error)) { // For waitFor operations, we'll provide a generic permission error since the specific action varies @@ -560,7 +604,7 @@ export async function getLambdaHandlerFile( folderUri: vscode.Uri, codeUri: string, handler: string, - runtime: string + runtime: Runtime ): Promise { const family = getFamily(runtime) if (!supportedRuntimeForHandler.has(family)) { @@ -704,6 +748,9 @@ export function getLambdaClient(region: string): EnhancedLambdaClient { } export async function getCFNClient(regionCode: string): Promise { - const originalClient = await globals.sdkClientBuilder.createAwsService(CloudFormation, {}, regionCode) + const originalClient = globals.sdkClientBuilderV3.createAwsService({ + serviceClient: CloudFormationClient, + region: regionCode, + }) return new EnhancedCloudFormationClient(originalClient, regionCode) } diff --git a/packages/core/src/awsService/ec2/utils.ts b/packages/core/src/awsService/ec2/utils.ts index 5ce24debaca..a86f358eab9 100644 --- a/packages/core/src/awsService/ec2/utils.ts +++ b/packages/core/src/awsService/ec2/utils.ts @@ -7,7 +7,7 @@ import { Ec2Instance } from '../../shared/clients/ec2' import { copyToClipboard } from '../../shared/utilities/messages' import { Ec2Selection } from './prompter' import { sshLogFileLocation } from '../../shared/sshConfig' -import { SSM } from 'aws-sdk' +import { StartSessionResponse } from '@aws-sdk/client-ssm' import { getLogger } from '../../shared/logger/logger' export function getIconCode(instance: Ec2Instance) { @@ -33,7 +33,7 @@ export async function copyInstanceId(instanceId: string): Promise { export function getEc2SsmEnv( selection: Ec2Selection, ssmPath: string, - session: SSM.StartSessionResponse + session: StartSessionResponse ): NodeJS.ProcessEnv { return Object.assign( { diff --git a/packages/core/src/awsService/ecs/model.ts b/packages/core/src/awsService/ecs/model.ts index eba6b51fcf4..57f49576e25 100644 --- a/packages/core/src/awsService/ecs/model.ts +++ b/packages/core/src/awsService/ecs/model.ts @@ -7,7 +7,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() import * as vscode from 'vscode' -import { ECS } from 'aws-sdk' +import { Cluster as SdkCluster, ContainerDefinition, Service as SdkService, Task } from '@aws-sdk/client-ecs' import { DefaultEcsClient } from '../../shared/clients/ecsClient' import { ResourceTreeNode } from '../../shared/treeview/resource' import { getIcon } from '../../shared/icons' @@ -15,7 +15,7 @@ import { AsyncCollection } from '../../shared/utilities/asyncCollection' import { prepareCommand } from './util' function createValidTaskFilter(containerName: string) { - return function (t: ECS.Task): t is ECS.Task & { taskArn: string } { + return function (t: Task): t is Task & { taskArn: string } { const managed = !!t.containers?.find( (c) => c?.name === containerName && c.managedAgents?.find((a) => a.name === 'ExecuteCommandAgent') ) @@ -24,7 +24,7 @@ function createValidTaskFilter(containerName: string) { } } -interface ContainerDescription extends ECS.ContainerDefinition { +interface ContainerDescription extends ContainerDefinition { readonly clusterArn: string readonly taskRoleArn: string readonly enableExecuteCommand?: boolean @@ -82,7 +82,7 @@ export class Service { public constructor( private readonly client: DefaultEcsClient, - public readonly description: ECS.Service + public readonly description: SdkService ) {} public async listContainers(): Promise { @@ -154,7 +154,7 @@ export class Cluster { public constructor( private readonly client: DefaultEcsClient, - private readonly cluster: ECS.Cluster + private readonly cluster: SdkCluster ) {} public listServices(): AsyncCollection { diff --git a/packages/core/src/awsService/ecs/util.ts b/packages/core/src/awsService/ecs/util.ts index d8567373bc6..c25c2291048 100644 --- a/packages/core/src/awsService/ecs/util.ts +++ b/packages/core/src/awsService/ecs/util.ts @@ -13,9 +13,9 @@ import { IamClient } from '../../shared/clients/iam' import { ToolkitError } from '../../shared/errors' import { isCloud9 } from '../../shared/extensionUtilities' import { getOrInstallCli } from '../../shared/utilities/cliUtils' -import { Session, TaskDefinition } from 'aws-sdk/clients/ecs' +import { Session, TaskDefinition } from '@aws-sdk/client-ecs' import { getLogger } from '../../shared/logger/logger' -import { SSM } from 'aws-sdk' +import { SSMClient, TerminateSessionCommand } from '@aws-sdk/client-ssm' import { fromExtensionManifest } from '../../shared/settings' import { ecsTaskPermissionsUrl } from '../../shared/constants' @@ -93,12 +93,13 @@ export async function prepareCommand( async function terminateSession() { const sessionId = session.sessionId! - const ssm = await globals.sdkClientBuilder.createAwsService(SSM, undefined, client.regionCode) - ssm.terminateSession({ SessionId: sessionId }) - .promise() - .catch((err) => { - getLogger().warn(`ecs: failed to terminate session "${sessionId}": %s`, err) - }) + const ssm = globals.sdkClientBuilderV3.createAwsService({ + serviceClient: SSMClient, + clientOptions: { region: client.regionCode }, + }) + ssm.send(new TerminateSessionCommand({ SessionId: sessionId })).catch((err) => { + getLogger().warn(`ecs: failed to terminate session "${sessionId}": %s`, err) + }) } return { path: ssmPlugin, args, dispose: () => void terminateSession() } diff --git a/packages/core/src/awsService/iot/commands/attachCertificate.ts b/packages/core/src/awsService/iot/commands/attachCertificate.ts index be9edd03d89..684160dafbf 100644 --- a/packages/core/src/awsService/iot/commands/attachCertificate.ts +++ b/packages/core/src/awsService/iot/commands/attachCertificate.ts @@ -12,7 +12,7 @@ import { createQuickPick, DataQuickPickItem } from '../../../shared/ui/pickerPro import { PromptResult } from '../../../shared/ui/prompter' import { IotClient } from '../../../shared/clients/iotClient' import { isValidResponse } from '../../../shared/wizards/wizard' -import { Iot } from 'aws-sdk' +import { Certificate, ListCertificatesResponse } from '@aws-sdk/client-iot' export type CertGen = typeof getCertList @@ -53,8 +53,8 @@ export async function attachCertificateCommand(node: IotThingNode, promptFun = p /** * Prompts the user to pick a certificate to attach. */ -async function promptForCert(iot: IotClient, certFetch: CertGen): Promise> { - const placeHolder: DataQuickPickItem = { +async function promptForCert(iot: IotClient, certFetch: CertGen): Promise> { + const placeHolder: DataQuickPickItem = { label: 'No certificates found', data: undefined, } @@ -71,10 +71,10 @@ async function promptForCert(iot: IotClient, certFetch: CertGen): Promise> { - const placeHolder: DataQuickPickItem = { +async function promptForPolicy(iot: IotClient, policyFetch: PolicyGen): Promise> { + const placeHolder: DataQuickPickItem = { label: 'No policies found', data: undefined, } @@ -87,10 +87,10 @@ async function promptForPolicy(iot: IotClient, policyFetch: PolicyGen): Promise< */ async function* getPolicyList(iot: IotClient) { let marker: string | undefined = undefined - let filteredPolicies: Iot.Policy[] + let filteredPolicies: Policy[] do { try { - const policyResponse: Iot.ListPoliciesResponse = await iot.listPolicies({ marker }) + const policyResponse: ListPoliciesResponse = await iot.listPolicies({ marker }) marker = policyResponse.nextMarker /* The policy name and arn should always be defined when using the diff --git a/packages/core/src/awsService/iot/commands/createCert.ts b/packages/core/src/awsService/iot/commands/createCert.ts index c954de28886..7cd9d4b62ed 100644 --- a/packages/core/src/awsService/iot/commands/createCert.ts +++ b/packages/core/src/awsService/iot/commands/createCert.ts @@ -10,7 +10,7 @@ import { localize } from '../../../shared/utilities/vsCodeUtils' import { showViewLogsMessage } from '../../../shared/utilities/messages' import { IotCertsFolderNode } from '../explorer/iotCertFolderNode' import { fileExists } from '../../../shared/filesystemUtilities' -import { Iot } from 'aws-sdk' +import { CreateKeysAndCertificateResponse } from '@aws-sdk/client-iot' import { fs } from '../../../shared/fs/fs' // eslint-disable-next-line @typescript-eslint/naming-convention @@ -34,7 +34,7 @@ export async function createCertificateCommand( return } - let certificate: Iot.CreateKeysAndCertificateResponse + let certificate: CreateKeysAndCertificateResponse try { certificate = await node.iot.createCertificateAndKeys({ diff --git a/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts b/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts index 3f9b7003d60..ce104a5e7fa 100644 --- a/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts +++ b/packages/core/src/awsService/iot/explorer/iotPolicyNode.ts @@ -4,7 +4,6 @@ */ import * as vscode from 'vscode' -import { Iot } from 'aws-sdk' import { IotClient, IotPolicy } from '../../../shared/clients/iotClient' import { AWSResourceNode } from '../../../shared/treeview/nodes/awsResourceNode' @@ -20,6 +19,7 @@ import { localize } from '../../../shared/utilities/vsCodeUtils' import { getIcon } from '../../../shared/icons' import { Settings } from '../../../shared/settings' import { ClassToInterfaceType } from '../../../shared/utilities/tsUtils' +import { PolicyVersion } from '@aws-sdk/client-iot' /** * Represents an IoT Policy that may have either a Certificate Node or the @@ -101,7 +101,7 @@ export class IotPolicyWithVersionsNode extends IotPolicyNode { } public async updateChildren(): Promise { - const versions: Map = toMap( + const versions: Map = toMap( await toArrayAsync(this.iot.listPolicyVersions({ policyName: this.policy.name })), (version) => version.versionId ) diff --git a/packages/core/src/awsService/iot/explorer/iotPolicyVersionNode.ts b/packages/core/src/awsService/iot/explorer/iotPolicyVersionNode.ts index ab2dd0f872d..bd85eb6e8c5 100644 --- a/packages/core/src/awsService/iot/explorer/iotPolicyVersionNode.ts +++ b/packages/core/src/awsService/iot/explorer/iotPolicyVersionNode.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Iot } from 'aws-sdk' +import { PolicyVersion } from '@aws-sdk/client-iot' import { IotClient, IotPolicy } from '../../../shared/clients/iotClient' import { AWSResourceNode } from '../../../shared/treeview/nodes/awsResourceNode' import { AWSTreeNodeBase } from '../../../shared/treeview/nodes/awsTreeNodeBase' @@ -19,7 +19,7 @@ import { formatLocalized } from '../../../shared/datetime' export class IotPolicyVersionNode extends AWSTreeNodeBase implements AWSResourceNode { public constructor( public policy: IotPolicy, - public version: Iot.PolicyVersion, + public version: PolicyVersion, public isDefault: boolean, public readonly parent: IotPolicyWithVersionsNode, public readonly iot: IotClient @@ -35,7 +35,7 @@ export class IotPolicyVersionNode extends AWSTreeNodeBase implements AWSResource this.update(version) } - public update(version: Iot.PolicyVersion): void { + public update(version: PolicyVersion): void { this.version = version this.isDefault = version.isDefaultVersion ?? false this.tooltip = localize( diff --git a/packages/core/src/awsService/redshift/explorer/redshiftWarehouseNode.ts b/packages/core/src/awsService/redshift/explorer/redshiftWarehouseNode.ts index 4301d45378b..26947893c82 100644 --- a/packages/core/src/awsService/redshift/explorer/redshiftWarehouseNode.ts +++ b/packages/core/src/awsService/redshift/explorer/redshiftWarehouseNode.ts @@ -15,7 +15,7 @@ import { ChildNodeLoader, ChildNodePage } from '../../../awsexplorer/childNodeLo import { DefaultRedshiftClient } from '../../../shared/clients/redshiftClient' import { deleteConnection, ConnectionParams, ConnectionType, RedshiftWarehouseType } from '../models/models' import { RedshiftNodeConnectionWizard } from '../wizards/connectionWizard' -import { ListDatabasesResponse } from 'aws-sdk/clients/redshiftdata' +import { ListDatabasesResponse } from '@aws-sdk/client-redshift-data' import { getIcon } from '../../../shared/icons' import { AWSCommandTreeNode } from '../../../shared/treeview/nodes/awsCommandTreeNode' import { telemetry } from '../../../shared/telemetry/telemetry' diff --git a/packages/core/src/awsService/redshift/notebook/redshiftNotebookController.ts b/packages/core/src/awsService/redshift/notebook/redshiftNotebookController.ts index 1db972314d3..f71b93362ee 100644 --- a/packages/core/src/awsService/redshift/notebook/redshiftNotebookController.ts +++ b/packages/core/src/awsService/redshift/notebook/redshiftNotebookController.ts @@ -7,7 +7,7 @@ import * as vscode from 'vscode' import { DefaultRedshiftClient } from '../../../shared/clients/redshiftClient' import { ConnectionParams } from '../models/models' -import { RedshiftData } from 'aws-sdk' +import { ColumnMetadata, Field } from '@aws-sdk/client-redshift-data' import { telemetry } from '../../../shared/telemetry/telemetry' export class RedshiftNotebookController { @@ -79,8 +79,8 @@ export class RedshiftNotebookController { } let executionId: string | undefined - let columnMetadata: RedshiftData.ColumnMetadataList | undefined - const records: RedshiftData.SqlRecords = [] + let columnMetadata: ColumnMetadata[] | undefined + const records: Field[][] = [] let nextToken: string | undefined // get all the pages of the result do { @@ -90,7 +90,7 @@ export class RedshiftNotebookController { nextToken, executionId ) - if (result) { + if (result && result.statementResultResponse.Records) { nextToken = result.statementResultResponse.NextToken executionId = result.executionId columnMetadata = result.statementResultResponse.ColumnMetadata @@ -116,7 +116,7 @@ export class RedshiftNotebookController { }) } - public getAsTable(connectionParams: ConnectionParams, columns: string[], records: RedshiftData.SqlRecords) { + public getAsTable(connectionParams: ConnectionParams, columns: string[], records: Field[][]) { if (!records || records.length === 0) { return '

No records to display

' } diff --git a/packages/core/src/awsService/redshift/wizards/connectionWizard.ts b/packages/core/src/awsService/redshift/wizards/connectionWizard.ts index abaf99003a0..251cfd22e20 100644 --- a/packages/core/src/awsService/redshift/wizards/connectionWizard.ts +++ b/packages/core/src/awsService/redshift/wizards/connectionWizard.ts @@ -14,9 +14,9 @@ import { DefaultRedshiftClient } from '../../../shared/clients/redshiftClient' import { Region } from '../../../shared/regions/endpoints' import { RegionProvider } from '../../../shared/regions/regionProvider' import { createRegionPrompter } from '../../../shared/ui/common/region' -import { ClustersMessage } from 'aws-sdk/clients/redshift' +import { ClustersMessage } from '@aws-sdk/client-redshift' import { Prompter } from '../../../shared/ui/prompter' -import { ListSecretsResponse } from 'aws-sdk/clients/secretsmanager' +import { ListSecretsResponse } from '@aws-sdk/client-secrets-manager' import { SecretsManagerClient } from '../../../shared/clients/secretsManagerClient' import { redshiftHelpUrl } from '../../../shared/constants' diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index ce0b7edd7db..717d1608ff1 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -191,13 +191,17 @@ export async function openRemoteConnect( void vscode.window.showErrorMessage(ConnectFromRemoteWorkspaceMessage) return } + + const spaceName = node.spaceApp.SpaceName! await tryRefreshNode(node) + + // for Stopped SM spaces - check instance type before showing progress if (node.getStatus() === 'Stopped') { // In case of SMUS, we pass in a SM Client and for SM AI, it creates a new SM Client. const client = sageMakerClient ? sageMakerClient : new SagemakerClient(node.regionCode) try { - await client.startSpace(node.spaceApp.SpaceName!, node.spaceApp.DomainId!) + await client.startSpace(spaceName, node.spaceApp.DomainId!) await tryRefreshNode(node) const appType = node.spaceApp.SpaceSettingsSummary?.AppType if (!appType) { @@ -205,18 +209,42 @@ export async function openRemoteConnect( code: 'undefinedAppType', }) } - await client.waitForAppInService(node.spaceApp.DomainId!, node.spaceApp.SpaceName!, appType) - await tryRemoteConnection(node, ctx) + + // Only start showing progress after instance type validation + return await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + cancellable: false, + title: `Connecting to ${spaceName}`, + }, + async (progress) => { + progress.report({ message: 'Starting the space.' }) + await client.waitForAppInService(node.spaceApp.DomainId!, spaceName, appType) + await tryRemoteConnection(node, ctx, progress) + } + ) } catch (err: any) { // Ignore InstanceTypeError since it means the user decided not to use an instanceType with more memory - if (err.code !== InstanceTypeError) { - throw new ToolkitError(`Remote connection failed: ${(err as Error).message}`, { - cause: err as Error, - code: err.code, - }) + // just return without showing progress + if (err.code === InstanceTypeError) { + return } + throw new ToolkitError(`Remote connection failed: ${(err as Error).message}`, { + cause: err as Error, + code: err.code, + }) } } else if (node.getStatus() === 'Running') { - await tryRemoteConnection(node, ctx) + // For running spaces, show progress + return await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + cancellable: false, + title: `Connecting to ${spaceName}`, + }, + async (progress) => { + await tryRemoteConnection(node, ctx, progress) + } + ) } } diff --git a/packages/core/src/awsService/sagemaker/detached-server/utils.ts b/packages/core/src/awsService/sagemaker/detached-server/utils.ts index cfac5984e9b..d4c963c40ff 100644 --- a/packages/core/src/awsService/sagemaker/detached-server/utils.ts +++ b/packages/core/src/awsService/sagemaker/detached-server/utils.ts @@ -13,6 +13,7 @@ import os from 'os' import { join } from 'path' import { SpaceMappings } from '../types' import open from 'open' +import { ConfiguredRetryStrategy } from '@smithy/util-retry' export { open } export const mappingFilePath = join(os.homedir(), '.aws', '.sagemaker-space-profiles') @@ -22,6 +23,13 @@ const tempFilePath = `${mappingFilePath}.tmp` let isWriting = false const writeQueue: Array<() => Promise> = [] +// Currently SSM registration happens asynchronously with App launch, which can lead to +// StartSession Internal Failure when connecting to a fresly-started Space. +// To mitigate, spread out retries over multiple seconds instead of sending all retries within a second. +// Backoff sequence: 1500ms, 2250ms, 3375ms +// Retry timing: 1500ms, 3750ms, 7125ms +const startSessionRetryStrategy = new ConfiguredRetryStrategy(3, (attempt: number) => 1000 * 1.5 ** attempt) + /** * Reads the local endpoint info file (default or via env) and returns pid & port. * @throws Error if the file is missing, invalid JSON, or missing fields @@ -83,7 +91,7 @@ export function parseArn(arn: string): { region: string; accountId: string; spac export async function startSagemakerSession({ region, connectionIdentifier, credentials }: any) { const endpoint = process.env.SAGEMAKER_ENDPOINT || `https://sagemaker.${region}.amazonaws.com` - const client = new SageMakerClient({ region, credentials, endpoint }) + const client = new SageMakerClient({ region, credentials, endpoint, retryStrategy: startSessionRetryStrategy }) const command = new StartSessionCommand({ ResourceIdentifier: connectionIdentifier }) return client.send(command) } diff --git a/packages/core/src/awsService/sagemaker/explorer/sagemakerParentNode.ts b/packages/core/src/awsService/sagemaker/explorer/sagemakerParentNode.ts index dd445f344fb..104eb7662a2 100644 --- a/packages/core/src/awsService/sagemaker/explorer/sagemakerParentNode.ts +++ b/packages/core/src/awsService/sagemaker/explorer/sagemakerParentNode.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import { GetCallerIdentityResponse } from 'aws-sdk/clients/sts' +import { GetCallerIdentityCommandOutput } from '@aws-sdk/client-sts' import { DescribeDomainResponse } from '@amzn/sagemaker-client' import { SagemakerClient, SagemakerSpaceApp } from '../../../shared/clients/sagemaker' import { DefaultStsClient } from '../../../shared/clients/stsClient' @@ -34,7 +34,7 @@ export class SagemakerParentNode extends AWSTreeNodeBase { public override readonly contextValue: string = parentContextValue domainUserProfiles: Map = new Map() spaceApps: Map = new Map() - callerIdentity: GetCallerIdentityResponse = {} + callerIdentity: Partial = {} public readonly pollingSet: PollingSet = new PollingSet(5000, this.updatePendingNodes.bind(this)) public constructor( diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index ac632740645..e25e8791d4f 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -27,12 +27,14 @@ const logger = getLogger('sagemaker') export async function tryRemoteConnection( node: SagemakerSpaceNode | SagemakerUnifiedStudioSpaceNode, - ctx: vscode.ExtensionContext + ctx: vscode.ExtensionContext, + progress: vscode.Progress<{ message?: string; increment?: number }> ) { const spaceArn = (await node.getSpaceArn()) as string const isSMUS = node instanceof SagemakerUnifiedStudioSpaceNode const remoteEnv = await prepareDevEnvConnection(spaceArn, ctx, 'sm_lc', isSMUS, node) try { + progress.report({ message: 'Opening remote session' }) await startVscodeRemote( remoteEnv.SessionProcess, remoteEnv.hostname, @@ -226,7 +228,13 @@ export async function removeKnownHost(hostname: string): Promise { throw ToolkitError.chain(err, 'Failed to read known_hosts file') } - const updatedLines = lines.filter((line) => !line.split(' ')[0].split(',').includes(hostname)) + const updatedLines = lines.filter((line) => { + const entryHostname = line.split(' ')[0].split(',') + // Hostnames in the known_hosts file seem to be always lowercase, but keeping the case-sensitive check just in + // case. Originally we were only doing the case-sensitive check which caused users to get a host + // identification error when reconnecting to a Space after it was restarted. + return !entryHostname.includes(hostname) && !entryHostname.includes(hostname.toLowerCase()) + }) if (updatedLines.length !== lines.length) { try { diff --git a/packages/core/src/codecatalyst/utils.ts b/packages/core/src/codecatalyst/utils.ts index b28aea75d4d..3f9cf6fe0bf 100644 --- a/packages/core/src/codecatalyst/utils.ts +++ b/packages/core/src/codecatalyst/utils.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Ides } from 'aws-sdk/clients/codecatalyst' +import { Ide } from '@aws-sdk/client-codecatalyst' import * as vscode from 'vscode' import { CodeCatalystResource, getCodeCatalystConfig } from '../shared/clients/codecatalystClient' import { pushIf } from '../shared/utilities/collectionUtils' @@ -55,6 +55,6 @@ export function openCodeCatalystUrl(o: CodeCatalystResource) { } /** Returns true if the dev env has a "vscode" IDE runtime. */ -export function isDevenvVscode(ides: Ides | undefined): boolean { +export function isDevenvVscode(ides: Ide[] | undefined): boolean { return ides !== undefined && ides.some((ide) => ide.name === 'VSCode') } diff --git a/packages/core/src/codecatalyst/vue/create/backend.ts b/packages/core/src/codecatalyst/vue/create/backend.ts index bdf49419243..102c6329653 100644 --- a/packages/core/src/codecatalyst/vue/create/backend.ts +++ b/packages/core/src/codecatalyst/vue/create/backend.ts @@ -32,7 +32,7 @@ import { CancellationError } from '../../../shared/utilities/timeoutUtils' import { telemetry } from '../../../shared/telemetry/telemetry' import { isNonNullable } from '../../../shared/utilities/tsUtils' import { createOrgPrompter, createProjectPrompter } from '../../wizards/selectResource' -import { GetSourceRepositoryCloneUrlsRequest } from 'aws-sdk/clients/codecatalyst' +import { GetSourceRepositoryCloneUrlsRequest } from '@aws-sdk/client-codecatalyst' import { QuickPickPrompter } from '../../../shared/ui/pickerPrompter' interface LinkedResponse { diff --git a/packages/core/src/codewhisperer/commands/startSecurityScan.ts b/packages/core/src/codewhisperer/commands/startSecurityScan.ts index bd081face38..ba9f4f9d926 100644 --- a/packages/core/src/codewhisperer/commands/startSecurityScan.ts +++ b/packages/core/src/codewhisperer/commands/startSecurityScan.ts @@ -482,7 +482,10 @@ export function errorPromptHelper( }) } if (error.code !== 'NoSourceFilesError') { - void vscode.window.showWarningMessage(getErrorMessage(error), ok) + // Skip showing warning messages during tests to avoid interfering with test dialogs + if (process.env.NODE_ENV !== 'test') { + void vscode.window.showWarningMessage(getErrorMessage(error), ok) + } } } diff --git a/packages/core/src/codewhisperer/commands/startTransformByQ.ts b/packages/core/src/codewhisperer/commands/startTransformByQ.ts index aa8bea11da2..410465a55c1 100644 --- a/packages/core/src/codewhisperer/commands/startTransformByQ.ts +++ b/packages/core/src/codewhisperer/commands/startTransformByQ.ts @@ -769,7 +769,12 @@ export async function postTransformationJob() { latest.status, latest.duration, transformByQState.getJobId(), - transformByQState.getJobHistoryPath() + transformByQState.getJobHistoryPath(), + latest.transformationType, + latest.sourceJDKVersion, + latest.targetJDKVersion, + latest.customDependencyVersionsFilePath, + latest.customBuildCommand ) } } diff --git a/packages/core/src/codewhisperer/models/model.ts b/packages/core/src/codewhisperer/models/model.ts index bcfa50c6a71..f074fe74bd6 100644 --- a/packages/core/src/codewhisperer/models/model.ts +++ b/packages/core/src/codewhisperer/models/model.ts @@ -688,7 +688,17 @@ export const jobPlanProgress: { } export let sessionJobHistory: { - [jobId: string]: { startTime: string; projectName: string; status: string; duration: string } + [jobId: string]: { + startTime: string + projectName: string + status: string + duration: string + transformationType: string + sourceJDKVersion: string + targetJDKVersion: string + customDependencyVersionsFilePath: string + customBuildCommand: string + } } = {} export class TransformByQState { diff --git a/packages/core/src/codewhisperer/region/regionProfileManager.ts b/packages/core/src/codewhisperer/region/regionProfileManager.ts index 24d58d7f588..aab2ed04dab 100644 --- a/packages/core/src/codewhisperer/region/regionProfileManager.ts +++ b/packages/core/src/codewhisperer/region/regionProfileManager.ts @@ -18,7 +18,8 @@ import { import globals from '../../shared/extensionGlobals' import { once } from '../../shared/utilities/functionUtils' import CodeWhispererUserClient from '../client/codewhispereruserclient' -import { Credentials, Service } from 'aws-sdk' +import { AwsCredentialIdentity } from '@aws-sdk/types' +import { Service } from 'aws-sdk' import { ServiceOptions } from '../../shared/awsClientBuilder' import userApiConfig = require('../client/user-service-2.json') import { createConstantMap } from '../../shared/utilities/tsUtils' @@ -394,7 +395,7 @@ export class RegionProfileManager { apiConfig: userApiConfig, region: region, endpoint: endpoint, - credentials: new Credentials({ accessKeyId: 'xxx', secretAccessKey: 'xxx' }), + credentials: { accessKeyId: 'xxx', secretAccessKey: 'xxx' } as AwsCredentialIdentity, onRequestSetup: [ (req) => { req.on('build', ({ httpRequest }) => { diff --git a/packages/core/src/codewhisperer/service/recommendationHandler.ts b/packages/core/src/codewhisperer/service/recommendationHandler.ts index b354fb60a05..42f5ceb9b21 100644 --- a/packages/core/src/codewhisperer/service/recommendationHandler.ts +++ b/packages/core/src/codewhisperer/service/recommendationHandler.ts @@ -10,8 +10,8 @@ import * as EditorContext from '../util/editorContext' import * as CodeWhispererConstants from '../models/constants' import { ConfigurationEntry, GetRecommendationsResponse, vsCodeState } from '../models/model' import { runtimeLanguageContext } from '../util/runtimeLanguageContext' -import { AWSError } from 'aws-sdk' -import { isAwsError } from '../../shared/errors' +import { ServiceException } from '@smithy/smithy-client' +import { isServiceException } from '../../shared/errors' import { TelemetryHelper } from '../util/telemetryHelper' import { getLogger } from '../../shared/logger/logger' import { hasVendedIamCredentials } from '../../auth/auth' @@ -290,14 +290,14 @@ export class RecommendationHandler { latency = startTime !== 0 ? Date.now() - startTime : 0 } getLogger().error('amazonq inline-suggest: Invocation Exception : %s', (error as Error).message) - if (isAwsError(error)) { + if (isServiceException(error)) { errorMessage = error.message - requestId = error.requestId || '' - errorCode = error.code - reason = `CodeWhisperer Invocation Exception: ${error?.code ?? error?.name ?? 'unknown'}` + requestId = error.$metadata.requestId || '' + errorCode = error.name + reason = `CodeWhisperer Invocation Exception: ${error?.name ?? 'unknown'}` await this.onThrottlingException(error, triggerType) - if (error?.code === 'AccessDeniedException' && errorMessage?.includes('no identity-based policy')) { + if (error?.name === 'AccessDeniedException' && errorMessage?.includes('no identity-based policy')) { getLogger().error('amazonq inline-suggest: AccessDeniedException : %s', (error as Error).message) void vscode.window .showErrorMessage(`CodeWhisperer: ${error?.message}`, CodeWhispererConstants.settingsLearnMore) @@ -574,9 +574,9 @@ export class RecommendationHandler { return true } - async onThrottlingException(awsError: AWSError, triggerType: CodewhispererTriggerType) { + async onThrottlingException(awsError: ServiceException, triggerType: CodewhispererTriggerType) { if ( - awsError.code === 'ThrottlingException' && + awsError.name === 'ThrottlingException' && awsError.message.includes(CodeWhispererConstants.throttlingMessage) ) { if (triggerType === 'OnDemand') { diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts index 45d95ec9a75..c2934dc24ba 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts @@ -68,12 +68,29 @@ export function throwIfCancelled() { } export function updateJobHistory() { - if (transformByQState.getJobId() !== '') { + if (transformByQState.getJobId() !== '' && transformByQState.getSourceJDKVersion() !== undefined) { sessionJobHistory[transformByQState.getJobId()] = { startTime: transformByQState.getStartTime(), projectName: transformByQState.getProjectName(), status: transformByQState.getPolledJobStatus(), duration: convertToTimeString(calculateTotalLatency(CodeTransformTelemetryState.instance.getStartTime())), + transformationType: transformByQState.getTransformationType() ?? 'N/A', + sourceJDKVersion: + transformByQState.getTransformationType() === TransformationType.LANGUAGE_UPGRADE + ? (transformByQState.getSourceJDKVersion() ?? 'N/A') + : 'N/A', + targetJDKVersion: + transformByQState.getTransformationType() === TransformationType.LANGUAGE_UPGRADE + ? (transformByQState.getTargetJDKVersion() ?? 'N/A') + : 'N/A', + customDependencyVersionsFilePath: + transformByQState.getTransformationType() === TransformationType.LANGUAGE_UPGRADE + ? transformByQState.getCustomDependencyVersionFilePath() || 'N/A' + : 'N/A', + customBuildCommand: + transformByQState.getTransformationType() === TransformationType.LANGUAGE_UPGRADE + ? transformByQState.getCustomBuildCommand() || 'N/A' + : 'N/A', } } return sessionJobHistory diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformationHistoryHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformationHistoryHandler.ts index 1876ac059e4..6aba818b4fc 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformationHistoryHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformationHistoryHandler.ts @@ -26,6 +26,11 @@ export interface HistoryObject { diffPath: string summaryPath: string jobId: string + transformationType: string + sourceJDKVersion: string + targetJDKVersion: string + customDependencyVersionFilePath: string + customBuildCommand: string } export interface JobMetadata { @@ -71,6 +76,11 @@ export async function readHistoryFile(): Promise { diffPath: jobInfo[4], summaryPath: jobInfo[5], jobId: jobInfo[6], + transformationType: jobInfo[7], + sourceJDKVersion: jobInfo[8], + targetJDKVersion: jobInfo[9], + customDependencyVersionFilePath: jobInfo[10], + customBuildCommand: jobInfo[11], }) } } @@ -125,14 +135,22 @@ export async function writeToHistoryFile( status: string, duration: string, jobId: string, - jobHistoryPath: string + jobHistoryPath: string, + transformationType: string, + sourceJDKVersion: string, + targetJDKVersion: string, + customDependencyVersionFilePath: string, + customBuildCommand: string ) { const historyLogFilePath = path.join(os.homedir(), '.aws', 'transform', 'transformation_history.tsv') // create transform folder if necessary if (!(await fs.existsFile(historyLogFilePath))) { await fs.mkdir(path.dirname(historyLogFilePath)) // create headers of new transformation history file - await fs.writeFile(historyLogFilePath, 'date\tproject_name\tstatus\tduration\tdiff_patch\tsummary\tjob_id\n') + await fs.writeFile( + historyLogFilePath, + 'date\tproject_name\tstatus\tduration\tdiff_patch\tsummary\tjob_id\ttransformation_type\tsource_jdk_version\ttarget_jdk_version\tcustom_dependency_version_file_path\tcustom_build_command\n' + ) } const artifactsExist = status === 'COMPLETED' || status === 'PARTIALLY_COMPLETED' const fields = [ @@ -143,6 +161,11 @@ export async function writeToHistoryFile( artifactsExist ? path.join(jobHistoryPath, 'diff.patch') : '', artifactsExist ? path.join(jobHistoryPath, 'summary', 'summary.md') : '', jobId, + transformationType, + sourceJDKVersion, + targetJDKVersion, + customDependencyVersionFilePath, + customBuildCommand, ] const jobDetails = fields.join('\t') + '\n' @@ -318,7 +341,8 @@ async function updateHistoryFile(status: string, duration: string, jobHistoryPat for (const job of jobs) { if (job) { const jobInfo = job.split('\t') - // startTime: jobInfo[0], projectName: jobInfo[1], status: jobInfo[2], duration: jobInfo[3], diffPath: jobInfo[4], summaryPath: jobInfo[5], jobId: jobInfo[6] + // 0: startTime, 1: projectName, 2: status, 3: duration, 4: diffPath, 5: summaryPath, 6: jobId + // 7: transformationType, 8: sourceJDKVersion, 9: targetJDKVersion, 10: customDependencyVersionFilePath, 11: customBuildCommand if (jobInfo[6] === jobId) { // update any values if applicable jobInfo[2] = status @@ -341,7 +365,10 @@ async function updateHistoryFile(status: string, duration: string, jobHistoryPat } // rewrite file - await fs.writeFile(historyLogFilePath, 'date\tproject_name\tstatus\tduration\tdiff_patch\tsummary\tjob_id\n') + await fs.writeFile( + historyLogFilePath, + 'date\tproject_name\tstatus\tduration\tdiff_patch\tsummary\tjob_id\ttransformation_type\tsource_jdk_version\ttarget_jdk_version\tcustom_dependency_version_file_path\tcustom_build_command\n' + ) const tsvContent = history.map((row) => row.join('\t')).join('\n') + '\n' await fs.appendFile(historyLogFilePath, tsvContent) diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformationHubViewProvider.ts b/packages/core/src/codewhisperer/service/transformByQ/transformationHubViewProvider.ts index 35e8319ab46..97e69570c76 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformationHubViewProvider.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformationHubViewProvider.ts @@ -120,6 +120,11 @@ export class TransformationHubViewProvider implements vscode.WebviewViewProvider diffPath: '', summaryPath: '', jobId: transformByQState.getJobId(), + transformationType: current.transformationType, + sourceJDKVersion: current.sourceJDKVersion, + targetJDKVersion: current.targetJDKVersion, + customDependencyVersionFilePath: current.customDependencyVersionsFilePath, + customBuildCommand: current.customBuildCommand, }) } return ` @@ -208,6 +213,11 @@ export class TransformationHubViewProvider implements vscode.WebviewViewProvider Summary File Job Id Refresh Job + Transformation Type + Source JDK Version + Target JDK Version + Custom Dependency Version File Path + Custom Build Command @@ -242,6 +252,11 @@ export class TransformationHubViewProvider implements vscode.WebviewViewProvider ↻ + ${job.transformationType ?? ''} + ${job.sourceJDKVersion ?? ''} + ${job.targetJDKVersion ?? ''} + ${job.customDependencyVersionFilePath ?? ''} + ${job.customBuildCommand ? `mvn ${job.customBuildCommand}` : ''} ` ) diff --git a/packages/core/src/codewhispererChat/view/connector/connector.ts b/packages/core/src/codewhispererChat/view/connector/connector.ts index b9c1e067b1e..6632819688a 100644 --- a/packages/core/src/codewhispererChat/view/connector/connector.ts +++ b/packages/core/src/codewhispererChat/view/connector/connector.ts @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Timestamp } from 'aws-sdk/clients/apigateway' import { MessagePublisher } from '../../../amazonq/messages/messagePublisher' import { EditorContextCommandType } from '../../commands/registerCommands' import { AuthFollowUpType } from '../../../amazonq/auth/model' @@ -97,7 +96,7 @@ interface StackOverflowMetadata { readonly answerCount: number readonly isAccepted: boolean readonly score: number - readonly lastActivityDate: Timestamp + readonly lastActivityDate: Date } export class SearchView extends UiMessage { diff --git a/packages/core/src/dynamicResources/commands/saveResource.ts b/packages/core/src/dynamicResources/commands/saveResource.ts index 1f696513c65..be395bc7f48 100644 --- a/packages/core/src/dynamicResources/commands/saveResource.ts +++ b/packages/core/src/dynamicResources/commands/saveResource.ts @@ -13,7 +13,7 @@ import { ResourceNode } from '../explorer/nodes/resourceNode' import { ResourceTypeNode } from '../explorer/nodes/resourceTypeNode' import { AwsResourceManager } from '../awsResourceManager' import { CloudControlClient } from '../../shared/clients/cloudControl' -import { CloudControl } from 'aws-sdk' +import { ResourceDescription } from '@aws-sdk/client-cloudcontrol' import globals from '../../shared/extensionGlobals' import { telemetry } from '../../shared/telemetry/telemetry' @@ -224,7 +224,7 @@ export async function updateResource( ) } -function computeDiff(currentDefinition: CloudControl.ResourceDescription, updatedDefinition: string): Operation[] { +function computeDiff(currentDefinition: ResourceDescription, updatedDefinition: string): Operation[] { const current = JSON.parse(currentDefinition.Properties!) const updated = JSON.parse(updatedDefinition) return compare(current, updated) diff --git a/packages/core/src/dynamicResources/explorer/nodes/resourceTypeNode.ts b/packages/core/src/dynamicResources/explorer/nodes/resourceTypeNode.ts index cba2274b162..afc21ff5d16 100644 --- a/packages/core/src/dynamicResources/explorer/nodes/resourceTypeNode.ts +++ b/packages/core/src/dynamicResources/explorer/nodes/resourceTypeNode.ts @@ -15,7 +15,7 @@ import { localize } from '../../../shared/utilities/vsCodeUtils' import { ResourcesNode } from './resourcesNode' import { ResourceNode } from './resourceNode' import { Result } from '../../../shared/telemetry/telemetry' -import { CloudControl } from 'aws-sdk' +import { ResourceDescription } from '@aws-sdk/client-cloudcontrol' import { ResourceTypeMetadata } from '../../model/resources' import { S3Client } from '../../../shared/clients/s3' import { telemetry } from '../../../shared/telemetry/telemetry' @@ -123,15 +123,12 @@ export class ResourceTypeNode extends AWSTreeNodeBase implements LoadMoreNode { }) newResources = response.ResourceDescriptions - ? response.ResourceDescriptions.reduce( - (accumulator: ResourceNode[], current: CloudControl.ResourceDescription) => { - if (current.Identifier) { - accumulator.push(new ResourceNode(this, current.Identifier, this.childContextValue)) - } - return accumulator - }, - [] - ) + ? response.ResourceDescriptions.reduce((accumulator: ResourceNode[], current: ResourceDescription) => { + if (current.Identifier) { + accumulator.push(new ResourceNode(this, current.Identifier, this.childContextValue)) + } + return accumulator + }, []) : [] nextToken = response.NextToken } diff --git a/packages/core/src/eventSchemas/commands/downloadSchemaItemCode.ts b/packages/core/src/eventSchemas/commands/downloadSchemaItemCode.ts index b89a128ba96..0abc1e340e2 100644 --- a/packages/core/src/eventSchemas/commands/downloadSchemaItemCode.ts +++ b/packages/core/src/eventSchemas/commands/downloadSchemaItemCode.ts @@ -5,7 +5,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { Schemas } from 'aws-sdk' +import { PutCodeBindingResponse } from '@aws-sdk/client-schemas' import fs = require('fs') import path = require('path') import * as vscode from 'vscode' @@ -180,10 +180,8 @@ export class SchemaCodeDownloader { export class CodeGenerator { public constructor(public client: SchemaClient) {} - public async generate( - codeDownloadRequest: SchemaCodeDownloadRequestDetails - ): Promise { - let response: Schemas.PutCodeBindingResponse + public async generate(codeDownloadRequest: SchemaCodeDownloadRequestDetails): Promise { + let response: PutCodeBindingResponse try { response = await this.client.putCodeBinding( codeDownloadRequest.language, diff --git a/packages/core/src/eventSchemas/explorer/registryItemNode.ts b/packages/core/src/eventSchemas/explorer/registryItemNode.ts index fcc42e6ea62..8141259b955 100644 --- a/packages/core/src/eventSchemas/explorer/registryItemNode.ts +++ b/packages/core/src/eventSchemas/explorer/registryItemNode.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { Schemas } from 'aws-sdk' +import { RegistrySummary } from '@aws-sdk/client-schemas' import * as os from 'os' import * as vscode from 'vscode' @@ -25,7 +25,7 @@ export class RegistryItemNode extends AWSTreeNodeBase { public override readonly regionCode: string = this.client.regionCode public constructor( - private registryItemOutput: Schemas.RegistrySummary, + private registryItemOutput: RegistrySummary, private readonly client: SchemaClient ) { super('', vscode.TreeItemCollapsibleState.Collapsed) @@ -56,7 +56,7 @@ export class RegistryItemNode extends AWSTreeNodeBase { }) } - public update(registryItemOutput: Schemas.RegistrySummary): void { + public update(registryItemOutput: RegistrySummary): void { this.registryItemOutput = registryItemOutput this.label = `${this.registryName}` let registryArn = '' diff --git a/packages/core/src/eventSchemas/explorer/schemaItemNode.ts b/packages/core/src/eventSchemas/explorer/schemaItemNode.ts index fcfadf63252..790834e165c 100644 --- a/packages/core/src/eventSchemas/explorer/schemaItemNode.ts +++ b/packages/core/src/eventSchemas/explorer/schemaItemNode.ts @@ -3,8 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Schemas } from 'aws-sdk' - +import { SchemaSummary, SchemaVersionSummary } from '@aws-sdk/client-schemas' import * as os from 'os' import { SchemaClient } from '../../shared/clients/schemaClient' @@ -15,7 +14,7 @@ import { localize } from '../../shared/utilities/vsCodeUtils' export class SchemaItemNode extends AWSTreeNodeBase { public constructor( - private schemaItem: Schemas.SchemaSummary, + private schemaItem: SchemaSummary, public readonly client: SchemaClient, public readonly registryName: string ) { @@ -30,7 +29,7 @@ export class SchemaItemNode extends AWSTreeNodeBase { } } - public update(schemaItem: Schemas.SchemaSummary): void { + public update(schemaItem: SchemaSummary): void { this.schemaItem = schemaItem this.label = this.schemaItem.SchemaName || '' let schemaArn = '' @@ -50,7 +49,7 @@ export class SchemaItemNode extends AWSTreeNodeBase { return response.Content! } - public async listSchemaVersions(): Promise { + public async listSchemaVersions(): Promise { const versions = await toArrayAsync(this.client.listSchemaVersions(this.registryName, this.schemaName)) return versions diff --git a/packages/core/src/eventSchemas/models/schemaCodeLangs.ts b/packages/core/src/eventSchemas/models/schemaCodeLangs.ts index c2bec2e29f6..fe83459251a 100644 --- a/packages/core/src/eventSchemas/models/schemaCodeLangs.ts +++ b/packages/core/src/eventSchemas/models/schemaCodeLangs.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import { Set as ImmutableSet } from 'immutable' import { goRuntimes } from '../../lambda/models/samLambdaRuntime' diff --git a/packages/core/src/eventSchemas/providers/schemasDataProvider.ts b/packages/core/src/eventSchemas/providers/schemasDataProvider.ts index 2df9469d8cb..e0717b6b6d3 100644 --- a/packages/core/src/eventSchemas/providers/schemasDataProvider.ts +++ b/packages/core/src/eventSchemas/providers/schemasDataProvider.ts @@ -4,10 +4,10 @@ */ import * as AWS from '@aws-sdk/types' -import { Schemas } from 'aws-sdk' import { SchemaClient } from '../../shared/clients/schemaClient' import { getLogger, Logger } from '../../shared/logger/logger' import { toArrayAsync } from '../../shared/utilities/collectionUtils' +import { SchemaSummary } from '@aws-sdk/client-schemas' export class Cache { public constructor(public readonly credentialsRegionDataList: credentialsRegionDataListMap[]) {} @@ -26,7 +26,7 @@ export interface regionRegistryMap { export interface registrySchemasMap { registryName: string - schemaList: Schemas.SchemaSummary[] + schemaList: SchemaSummary[] } /** diff --git a/packages/core/src/eventSchemas/utils.ts b/packages/core/src/eventSchemas/utils.ts index a2692d47539..a42d4a26829 100644 --- a/packages/core/src/eventSchemas/utils.ts +++ b/packages/core/src/eventSchemas/utils.ts @@ -6,11 +6,11 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { Schemas } from 'aws-sdk' +import { RegistrySummary, SchemaSummary, SearchSchemaSummary } from '@aws-sdk/client-schemas' import * as vscode from 'vscode' import { SchemaClient } from '../shared/clients/schemaClient' -export async function* listRegistryItems(client: SchemaClient): AsyncIterableIterator { +export async function* listRegistryItems(client: SchemaClient): AsyncIterableIterator { const status = vscode.window.setStatusBarMessage( localize('AWS.message.statusBar.loading.registries', 'Loading Registry Items...') ) @@ -25,7 +25,7 @@ export async function* listRegistryItems(client: SchemaClient): AsyncIterableIte export async function* listSchemaItems( client: SchemaClient, registryName: string -): AsyncIterableIterator { +): AsyncIterableIterator { const status = vscode.window.setStatusBarMessage( localize('AWS.message.statusBar.loading.schemaItems', 'Loading Schema Items...') ) @@ -41,7 +41,7 @@ export async function* searchSchemas( client: SchemaClient, keyword: string, registryName: string -): AsyncIterableIterator { +): AsyncIterableIterator { const status = vscode.window.setStatusBarMessage( localize('AWS.message.statusBar.searching.schemas', 'Searching Schemas...') ) diff --git a/packages/core/src/eventSchemas/vue/searchSchemas.ts b/packages/core/src/eventSchemas/vue/searchSchemas.ts index 37efc145753..7d5c71fa3b0 100644 --- a/packages/core/src/eventSchemas/vue/searchSchemas.ts +++ b/packages/core/src/eventSchemas/vue/searchSchemas.ts @@ -5,7 +5,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { Schemas } from 'aws-sdk' +import { SchemaSummary, SearchSchemaSummary } from '@aws-sdk/client-schemas' import * as vscode from 'vscode' import { downloadSchemaItemCode } from '../commands/downloadSchemaItemCode' import { RegistryItemNode } from '../explorer/registryItemNode' @@ -93,7 +93,7 @@ export class SearchSchemasWebview extends VueWebview { } public async downloadCodeBindings(summary: SchemaVersionedSummary) { - const schemaItem: Schemas.SchemaSummary = { + const schemaItem: SchemaSummary = { SchemaName: getSchemaNameFromTitle(summary.Title), } const schemaItemNode = new SchemaItemNode(schemaItem, this.client, summary.RegistryName) @@ -230,7 +230,7 @@ export async function getSearchResults( return results } -export function getSchemaVersionedSummary(searchSummary: Schemas.SearchSchemaSummary[], prefix: string) { +export function getSchemaVersionedSummary(searchSummary: SearchSchemaSummary[], prefix: string) { const results = searchSummary.map((searchSchemaSummary) => ({ RegistryName: searchSchemaSummary.RegistryName!, Title: prefix.concat(searchSchemaSummary.SchemaName!), diff --git a/packages/core/src/lambda/activation.ts b/packages/core/src/lambda/activation.ts index e2f9e4c32f4..9b010eceff8 100644 --- a/packages/core/src/lambda/activation.ts +++ b/packages/core/src/lambda/activation.ts @@ -7,7 +7,7 @@ import * as path from 'path' import * as vscode from 'vscode' import * as nls from 'vscode-nls' -import { Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import { deleteLambda } from './commands/deleteLambda' import { uploadLambdaCommand } from './commands/uploadLambda' import { LambdaFunctionNode } from './explorer/lambdaFunctionNode' @@ -235,7 +235,7 @@ export async function activate(context: ExtContext): Promise { ), Commands.register('aws.appBuilder.tailLogs', async (node: LambdaFunctionNode | TreeNode) => { - let functionConfiguration: Lambda.FunctionConfiguration + let functionConfiguration: FunctionConfiguration try { let tmpNode: LambdaFunctionNode | undefined = getSourceNode(node) if (!tmpNode && isTreeNode(node)) { diff --git a/packages/core/src/lambda/commands/copyLambdaUrl.ts b/packages/core/src/lambda/commands/copyLambdaUrl.ts index d15a96a7d62..835525d0610 100644 --- a/packages/core/src/lambda/commands/copyLambdaUrl.ts +++ b/packages/core/src/lambda/commands/copyLambdaUrl.ts @@ -10,7 +10,7 @@ import { copyToClipboard } from '../../shared/utilities/messages' import { addCodiconToString } from '../../shared/utilities/textUtilities' import { createQuickPick, QuickPickPrompter } from '../../shared/ui/pickerPrompter' import { isValidResponse } from '../../shared/wizards/wizard' -import { FunctionUrlConfigList } from 'aws-sdk/clients/lambda' +import { FunctionUrlConfig } from '@aws-sdk/client-lambda' import { CancellationError } from '../../shared/utilities/timeoutUtils' import { lambdaFunctionUrlConfigUrl } from '../../shared/constants' @@ -40,7 +40,7 @@ export async function copyLambdaUrl( } } -async function _quickPickUrl(configList: FunctionUrlConfigList): Promise { +async function _quickPickUrl(configList: FunctionUrlConfig[]): Promise { const res = await createLambdaFuncUrlPrompter(configList).prompt() if (!isValidResponse(res)) { throw new CancellationError('user') @@ -48,10 +48,12 @@ async function _quickPickUrl(configList: FunctionUrlConfigList): Promise { - const items = configList.map((c) => ({ - label: c.FunctionArn, - data: c.FunctionUrl, - })) +export function createLambdaFuncUrlPrompter(configList: FunctionUrlConfig[]): QuickPickPrompter { + const items = configList + .filter((c) => c.FunctionArn && c.FunctionUrl) + .map((c) => ({ + label: c.FunctionArn!, + data: c.FunctionUrl!, + })) return createQuickPick(items, { title: 'Select function to copy url from.' }) } diff --git a/packages/core/src/lambda/commands/createNewSamApp.ts b/packages/core/src/lambda/commands/createNewSamApp.ts index c53edf2518b..7801976c435 100644 --- a/packages/core/src/lambda/commands/createNewSamApp.ts +++ b/packages/core/src/lambda/commands/createNewSamApp.ts @@ -43,7 +43,8 @@ import { getIdeProperties, getDebugNewSamAppDocUrl, getLaunchConfigDocUrl } from import { checklogs } from '../../shared/localizedText' import globals from '../../shared/extensionGlobals' import { telemetry } from '../../shared/telemetry/telemetry' -import { LambdaArchitecture, Result, Runtime } from '../../shared/telemetry/telemetry' +import { LambdaArchitecture, Result, Runtime as TelemetryRuntime } from '../../shared/telemetry/telemetry' +import { Runtime } from '@aws-sdk/client-lambda' import { getTelemetryReason, getTelemetryResult } from '../../shared/errors' import { openUrl, replaceVscodeVars } from '../../shared/utilities/vsCodeUtils' import { fs } from '../../shared/fs/fs' @@ -88,7 +89,7 @@ export async function resumeCreateNewSamApp( extContext, folder, templateUri, - samInitState?.isImage ? (samInitState?.runtime as Runtime | undefined) : undefined + samInitState?.isImage ? samInitState?.runtime : undefined ) const tryOpenReadme = await writeToolkitReadme(readmeUri.fsPath, configs) if (tryOpenReadme) { @@ -112,7 +113,7 @@ export async function resumeCreateNewSamApp( lambdaArchitecture: arch, result: createResult, reason: reason, - runtime: samInitState?.runtime as Runtime, + runtime: samInitState?.runtime as TelemetryRuntime, version: samVersion, }) } @@ -194,7 +195,7 @@ export async function createNewSamApplication( initArguments.baseImage = `amazon/${createRuntime}-base` } else { lambdaPackageType = 'Zip' - initArguments.runtime = createRuntime + initArguments.runtime! = createRuntime // in theory, templates could be provided with image-based lambdas, but that is currently not supported by SAM initArguments.template = config.template } @@ -348,7 +349,7 @@ export async function createNewSamApplication( lambdaArchitecture: initArguments?.architecture, result: createResult, reason: reason, - runtime: createRuntime, + runtime: createRuntime as TelemetryRuntime, version: samVersion, }) } diff --git a/packages/core/src/lambda/commands/deleteLambda.ts b/packages/core/src/lambda/commands/deleteLambda.ts index 29dea130f66..c6290eab3c6 100644 --- a/packages/core/src/lambda/commands/deleteLambda.ts +++ b/packages/core/src/lambda/commands/deleteLambda.ts @@ -10,7 +10,7 @@ import * as localizedText from '../../shared/localizedText' import { DefaultLambdaClient } from '../../shared/clients/lambdaClient' import { Result } from '../../shared/telemetry/telemetry' import { showConfirmationMessage, showViewLogsMessage } from '../../shared/utilities/messages' -import { FunctionConfiguration } from 'aws-sdk/clients/lambda' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import { getLogger } from '../../shared/logger/logger' import { telemetry } from '../../shared/telemetry/telemetry' diff --git a/packages/core/src/lambda/commands/uploadLambda.ts b/packages/core/src/lambda/commands/uploadLambda.ts index 6bfd3777463..98149674587 100644 --- a/packages/core/src/lambda/commands/uploadLambda.ts +++ b/packages/core/src/lambda/commands/uploadLambda.ts @@ -27,7 +27,7 @@ import { StepEstimator, Wizard, WIZARD_BACK } from '../../shared/wizards/wizard' import { createSingleFileDialog } from '../../shared/ui/common/openDialog' import { Prompter, PromptResult } from '../../shared/ui/prompter' import { ToolkitError } from '../../shared/errors' -import { FunctionConfiguration } from 'aws-sdk/clients/lambda' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import globals from '../../shared/extensionGlobals' import { toArrayAsync } from '../../shared/utilities/collectionUtils' import { fromExtensionManifest } from '../../shared/settings' diff --git a/packages/core/src/lambda/explorer/cloudFormationNodes.ts b/packages/core/src/lambda/explorer/cloudFormationNodes.ts index e2d9e9aae27..4ef298a391e 100644 --- a/packages/core/src/lambda/explorer/cloudFormationNodes.ts +++ b/packages/core/src/lambda/explorer/cloudFormationNodes.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { CloudFormation, Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import * as os from 'os' import * as vscode from 'vscode' import { CloudFormationClient, StackSummary } from '../../shared/clients/cloudFormation' @@ -78,7 +78,7 @@ export class CloudFormationStackNode extends AWSTreeNodeBase implements AWSResou this.iconPath = getIcon('aws-cloudformation-stack') } - public get stackId(): CloudFormation.StackId | undefined { + public get stackId(): string | undefined { return this.stackSummary.StackId } @@ -94,7 +94,7 @@ export class CloudFormationStackNode extends AWSTreeNodeBase implements AWSResou return this.stackName } - public get stackName(): CloudFormation.StackName { + public get stackName(): string { return this.stackSummary.StackName } @@ -122,7 +122,7 @@ export class CloudFormationStackNode extends AWSTreeNodeBase implements AWSResou private async updateChildren(): Promise { const resources: string[] = await this.resolveLambdaResources() - const functions: Map = toMap( + const functions: Map = toMap( await toArrayAsync(listLambdaFunctions(this.lambdaClient)), (functionInfo) => functionInfo.FunctionName ) @@ -151,7 +151,7 @@ export class CloudFormationStackNode extends AWSTreeNodeBase implements AWSResou function makeCloudFormationLambdaFunctionNode( parent: AWSTreeNodeBase, regionCode: string, - configuration: Lambda.FunctionConfiguration + configuration: FunctionConfiguration ): LambdaFunctionNode { const node = new LambdaFunctionNode(parent, regionCode, configuration, contextValueCloudformationLambdaFunction) diff --git a/packages/core/src/lambda/explorer/lambdaFunctionNode.ts b/packages/core/src/lambda/explorer/lambdaFunctionNode.ts index 1feb40f437a..3d2f05a99fa 100644 --- a/packages/core/src/lambda/explorer/lambdaFunctionNode.ts +++ b/packages/core/src/lambda/explorer/lambdaFunctionNode.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import * as os from 'os' import * as vscode from 'vscode' import { getIcon } from '../../shared/icons' @@ -34,7 +34,7 @@ export class LambdaFunctionNode extends AWSTreeNodeBase implements AWSResourceNo public constructor( public readonly parent: AWSTreeNodeBase, public override readonly regionCode: string, - public configuration: Lambda.FunctionConfiguration, + public configuration: FunctionConfiguration, public override readonly contextValue?: string, public localDir?: string, public projectRoot?: vscode.Uri, @@ -52,7 +52,7 @@ export class LambdaFunctionNode extends AWSTreeNodeBase implements AWSResourceNo this.contextValue = contextValue } - public update(configuration: Lambda.FunctionConfiguration): void { + public update(configuration: FunctionConfiguration): void { this.configuration = configuration this.label = this.configuration.FunctionName || '' this.tooltip = `${this.configuration.FunctionName}${os.EOL}${this.configuration.FunctionArn}` diff --git a/packages/core/src/lambda/explorer/lambdaNodes.ts b/packages/core/src/lambda/explorer/lambdaNodes.ts index 62a01c6445a..dd753ce5594 100644 --- a/packages/core/src/lambda/explorer/lambdaNodes.ts +++ b/packages/core/src/lambda/explorer/lambdaNodes.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import * as vscode from 'vscode' import { DefaultLambdaClient } from '../../shared/clients/lambdaClient' @@ -54,7 +54,7 @@ export class LambdaNode extends AWSTreeNodeBase { } public async updateChildren(): Promise { - const functions: Map = toMap( + const functions: Map = toMap( await toArrayAsync(listLambdaFunctions(this.client)), (configuration) => configuration.FunctionName ) @@ -71,10 +71,10 @@ export class LambdaNode extends AWSTreeNodeBase { function makeLambdaFunctionNode( parent: AWSTreeNodeBase, regionCode: string, - configuration: Lambda.FunctionConfiguration + configuration: FunctionConfiguration ): LambdaFunctionNode { let contextValue = contextValueLambdaFunction - const isImportableRuntime = samLambdaImportableRuntimes.contains(configuration.Runtime ?? '') + const isImportableRuntime = configuration.Runtime && samLambdaImportableRuntimes.contains(configuration.Runtime) if (isLocalStackConnection()) { if (isImportableRuntime && !isHotReloadingFunction(configuration?.CodeSha256)) { contextValue = contextValueLambdaFunctionDownloadOnly diff --git a/packages/core/src/lambda/models/samLambdaRuntime.ts b/packages/core/src/lambda/models/samLambdaRuntime.ts index 06e35dbcd2b..985e947afc9 100644 --- a/packages/core/src/lambda/models/samLambdaRuntime.ts +++ b/packages/core/src/lambda/models/samLambdaRuntime.ts @@ -7,7 +7,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() import * as vscode from 'vscode' -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable' import { isCloud9 } from '../../shared/extensionUtilities' import { PrompterButtons } from '../../shared/ui/buttons' @@ -30,7 +30,7 @@ export type RuntimePackageType = 'Image' | 'Zip' // TODO: Consolidate all of the runtime constructs into a single > map // We should be able to eliminate a fair amount of redundancy with that. export const nodeJsRuntimes: ImmutableSet = ImmutableSet([ - 'nodejs22.x', + 'nodejs22.x' as Runtime, 'nodejs20.x', 'nodejs18.x', 'nodejs16.x', @@ -51,7 +51,7 @@ export function getNodeMajorVersion(version?: string): number | undefined { } export const pythonRuntimes: ImmutableSet = ImmutableSet([ - 'python3.13', + 'python3.13' as Runtime, 'python3.12', 'python3.11', 'python3.10', @@ -68,7 +68,10 @@ export const javaRuntimes: ImmutableSet = ImmutableSet([ 'java21', ]) export const dotNetRuntimes: ImmutableSet = ImmutableSet(['dotnet6', 'dotnet8']) -export const rubyRuntimes: ImmutableSet = ImmutableSet(['ruby3.2', 'ruby3.3', 'ruby3.4']) +export const rubyRuntimes: ImmutableSet = ImmutableSet(['ruby3.2', 'ruby3.3', 'ruby3.4' as Runtime]) + +// Image runtimes are not a direct subset of valid ZIP lambda types +const dotnet50 = 'dotnet5.0' as Runtime /** * Deprecated runtimes can be found at https://docs.aws.amazon.com/lambda/latest/dg/runtime-support-policy.html @@ -91,8 +94,8 @@ export const deprecatedRuntimes: ImmutableSet = ImmutableSet([ 'ruby2.7', ]) const defaultRuntimes = ImmutableMap([ - [RuntimeFamily.NodeJS, 'nodejs22.x'], - [RuntimeFamily.Python, 'python3.13'], + [RuntimeFamily.NodeJS, 'nodejs22.x' as Runtime], + [RuntimeFamily.Python, 'python3.13' as Runtime], [RuntimeFamily.DotNet, 'dotnet8'], [RuntimeFamily.Go, 'go1.x'], [RuntimeFamily.Java, 'java21'], @@ -120,7 +123,7 @@ export const samZipLambdaRuntimes: ImmutableSet = ImmutableSet.union([ export const samArmLambdaRuntimes: ImmutableSet = ImmutableSet([ 'python3.9', 'python3.8', - 'nodejs22.x', + 'nodejs22.x' as Runtime, 'nodejs20.x', 'nodejs18.x', 'nodejs16.x', @@ -145,8 +148,6 @@ export function samLambdaCreatableRuntimes(cloud9: boolean = isCloud9()): Immuta return cloud9 ? cloud9SupportedRuntimes : samZipLambdaRuntimes } -// Image runtimes are not a direct subset of valid ZIP lambda types -const dotnet50 = 'dotnet5.0' export function samImageLambdaRuntimes(cloud9: boolean = isCloud9()): ImmutableSet { // Note: SAM also supports ruby, but Toolkit does not. return ImmutableSet([...samLambdaCreatableRuntimes(cloud9), ...(cloud9 ? [] : [dotnet50])]) @@ -172,7 +173,7 @@ export function getDependencyManager(runtime: Runtime): DependencyManager[] { throw new Error(`Runtime ${runtime} does not have an associated DependencyManager`) } -export function getFamily(runtime: string): RuntimeFamily { +export function getFamily(runtime: Runtime): RuntimeFamily { if (deprecatedRuntimes.has(runtime)) { handleDeprecatedRuntime(runtime) } else if (nodeJsRuntimes.has(runtime)) { @@ -248,7 +249,7 @@ export function getRuntimeFamily(langId: string): RuntimeFamily { /** * Provides the default runtime for a given `RuntimeFamily` or undefined if the runtime is invalid. */ -export function getDefaultRuntime(runtime: RuntimeFamily): string | undefined { +export function getDefaultRuntime(runtime: RuntimeFamily): Runtime | undefined { return defaultRuntimes.get(runtime) } diff --git a/packages/core/src/lambda/models/samTemplates.ts b/packages/core/src/lambda/models/samTemplates.ts index 5ec112a7dc4..ace9c93faf6 100644 --- a/packages/core/src/lambda/models/samTemplates.ts +++ b/packages/core/src/lambda/models/samTemplates.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() import * as semver from 'semver' -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import { Set as ImmutableSet } from 'immutable' import { supportsEventBridgeTemplates } from '../../../src/eventSchemas/models/schemaCodeLangs' import { RuntimePackageType } from './samLambdaRuntime' diff --git a/packages/core/src/lambda/remoteDebugging/lambdaDebugger.ts b/packages/core/src/lambda/remoteDebugging/lambdaDebugger.ts index bdb8ba4ff64..152d5913737 100644 --- a/packages/core/src/lambda/remoteDebugging/lambdaDebugger.ts +++ b/packages/core/src/lambda/remoteDebugging/lambdaDebugger.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode' import globals from '../../shared/extensionGlobals' -import type { Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import { getLogger } from '../../shared/logger/logger' const logger = getLogger() @@ -48,20 +48,20 @@ export interface LambdaDebugger { checkHealth(): Promise setup( progress: vscode.Progress<{ message?: string; increment?: number }>, - functionConfig: Lambda.FunctionConfiguration, + functionConfig: FunctionConfiguration, region: string ): Promise waitForSetup( progress: vscode.Progress<{ message?: string; increment?: number }>, - functionConfig: Lambda.FunctionConfiguration, + functionConfig: FunctionConfiguration, region: string ): Promise waitForFunctionUpdates(progress: vscode.Progress<{ message?: string; increment?: number }>): Promise - cleanup(functionConfig: Lambda.FunctionConfiguration): Promise + cleanup(functionConfig: FunctionConfiguration): Promise } // this should be called when the debug session is started -export async function persistLambdaSnapshot(config: Lambda.FunctionConfiguration | undefined): Promise { +export async function persistLambdaSnapshot(config: FunctionConfiguration | undefined): Promise { try { await globals.globalState.update(remoteDebugSnapshotString, config) } catch (error) { @@ -70,6 +70,6 @@ export async function persistLambdaSnapshot(config: Lambda.FunctionConfiguration } } -export function getLambdaSnapshot(): Lambda.FunctionConfiguration | undefined { - return globals.globalState.get(remoteDebugSnapshotString) +export function getLambdaSnapshot(): FunctionConfiguration | undefined { + return globals.globalState.get(remoteDebugSnapshotString) } diff --git a/packages/core/src/lambda/remoteDebugging/ldkClient.ts b/packages/core/src/lambda/remoteDebugging/ldkClient.ts index b30c165d4a4..020d13d5ef2 100644 --- a/packages/core/src/lambda/remoteDebugging/ldkClient.ts +++ b/packages/core/src/lambda/remoteDebugging/ldkClient.ts @@ -4,13 +4,20 @@ */ import * as vscode from 'vscode' -import { IoTSecureTunneling, Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' +import { + CloseTunnelCommand, + IoTSecureTunnelingClient, + ListTunnelsCommand, + OpenTunnelCommand, + RotateTunnelAccessTokenCommand, +} from '@aws-sdk/client-iotsecuretunneling' import { getClientId } from '../../shared/telemetry/util' import { DefaultLambdaClient } from '../../shared/clients/lambdaClient' import { LocalProxy } from './localProxy' import globals from '../../shared/extensionGlobals' import { getLogger } from '../../shared/logger/logger' -import { getIoTSTClientWithAgent, getLambdaClientWithAgent } from './utils' +import { getIoTSTClientWithAgent, getLambdaClientWithAgent, getLambdaDebugUserAgent } from './utils' import { ToolkitError } from '../../shared/errors' import * as nls from 'vscode-nls' @@ -34,9 +41,9 @@ export interface TunnelInfo { async function callUpdateFunctionConfiguration( lambda: DefaultLambdaClient, - config: Lambda.FunctionConfiguration, + config: FunctionConfiguration, waitForUpdate: boolean -): Promise { +): Promise { // Update function configuration back to original values return await lambda.updateFunctionConfiguration( { @@ -61,7 +68,7 @@ export class LdkClient { private localProxy: LocalProxy | undefined private static instanceCreating = false private lambdaClientCache: Map = new Map() - private iotSTClientCache: Map = new Map() + private iotSTClientCache: Map = new Map() constructor() {} @@ -92,14 +99,14 @@ export class LdkClient { */ private getLambdaClient(region: string): DefaultLambdaClient { if (!this.lambdaClientCache.has(region)) { - this.lambdaClientCache.set(region, getLambdaClientWithAgent(region)) + this.lambdaClientCache.set(region, getLambdaClientWithAgent(region, getLambdaDebugUserAgent())) } return this.lambdaClientCache.get(region)! } - private async getIoTSTClient(region: string): Promise { + private getIoTSTClient(region: string): IoTSecureTunnelingClient { if (!this.iotSTClientCache.has(region)) { - this.iotSTClientCache.set(region, await getIoTSTClientWithAgent(region)) + this.iotSTClientCache.set(region, getIoTSTClientWithAgent(region)) } return this.iotSTClientCache.get(region)! } @@ -124,13 +131,13 @@ export class LdkClient { const vscodeUuid = getClientId(globals.globalState) // Create IoTSecureTunneling client - const iotSecureTunneling = await this.getIoTSTClient(region) + const iotSecureTunneling = this.getIoTSTClient(region) // Define tunnel identifier const tunnelIdentifier = `RemoteDebugging+${vscodeUuid}` const timeoutInMinutes = 720 // List existing tunnels - const listTunnelsResponse = await iotSecureTunneling.listTunnels({}).promise() + const listTunnelsResponse = await iotSecureTunneling.send(new ListTunnelsCommand({})) // Find tunnel with our identifier const existingTunnel = listTunnelsResponse.tunnelSummaries?.find( @@ -150,20 +157,20 @@ export class LdkClient { return rotateResponse } else { // Close tunnel if less than 15 minutes remaining - await iotSecureTunneling - .closeTunnel({ + await iotSecureTunneling.send( + new CloseTunnelCommand({ tunnelId: existingTunnel.tunnelId, delete: false, }) - .promise() + ) getLogger().info(`Closed tunnel ${existingTunnel.tunnelId} with less than 15 minutes remaining`) } } // Create new tunnel - const openTunnelResponse = await iotSecureTunneling - .openTunnel({ + const openTunnelResponse = await iotSecureTunneling.send( + new OpenTunnelCommand({ description: tunnelIdentifier, timeoutConfig: { maxLifetimeTimeoutMinutes: timeoutInMinutes, // 12 hours @@ -172,7 +179,7 @@ export class LdkClient { services: ['WSS'], }, }) - .promise() + ) getLogger().info(`Created new tunnel with ID: ${openTunnelResponse.tunnelId}`) @@ -189,13 +196,13 @@ export class LdkClient { // Refresh tunnel tokens async refreshTunnelTokens(tunnelId: string, region: string): Promise { try { - const iotSecureTunneling = await this.getIoTSTClient(region) - const rotateResponse = await iotSecureTunneling - .rotateTunnelAccessToken({ + const iotSecureTunneling = this.getIoTSTClient(region) + const rotateResponse = await iotSecureTunneling.send( + new RotateTunnelAccessTokenCommand({ tunnelId: tunnelId, clientMode: 'ALL', }) - .promise() + ) return { tunnelID: tunnelId, @@ -207,7 +214,7 @@ export class LdkClient { } } - async getFunctionDetail(functionArn: string): Promise { + async getFunctionDetail(functionArn: string): Promise { try { const region = getRegionFromArn(functionArn) if (!region) { @@ -220,7 +227,7 @@ export class LdkClient { return undefined } const client = this.getLambdaClient(region) - const configuration = (await client.getFunction(functionArn)).Configuration as Lambda.FunctionConfiguration + const configuration = (await client.getFunction(functionArn)).Configuration as FunctionConfiguration // get function detail // return function detail return configuration @@ -237,7 +244,7 @@ export class LdkClient { // 3: adding two param to lambda environment variable // {AWS_LAMBDA_EXEC_WRAPPER:/opt/bin/ldk_wrapper, AWS_LDK_DESTINATION_TOKEN: destinationToken } async createDebugDeployment( - config: Lambda.FunctionConfiguration, + config: FunctionConfiguration, destinationToken: string, lambdaTimeout: number, shouldPublishVersion: boolean, @@ -315,7 +322,7 @@ export class LdkClient { } // Create a temporary config for the update - const updateConfig: Lambda.FunctionConfiguration = { + const updateConfig: FunctionConfiguration = { FunctionName: config.FunctionName, Timeout: lambdaTimeout ?? 900, // 15 minutes Layers: updatedLayers.map((arn) => ({ Arn: arn })), @@ -359,7 +366,7 @@ export class LdkClient { // we are 1: reverting timeout to it's original snapshot // 2: reverting layer status according to it's original snapshot // 3: reverting environment back to it's original snapshot - async removeDebugDeployment(config: Lambda.FunctionConfiguration, check: boolean = true): Promise { + async removeDebugDeployment(config: FunctionConfiguration, check: boolean = true): Promise { try { if (!config.FunctionArn || !config.FunctionName) { throw new Error('Function ARN is missing') diff --git a/packages/core/src/lambda/remoteDebugging/ldkController.ts b/packages/core/src/lambda/remoteDebugging/ldkController.ts index a12f0254b33..5dfbd653dc1 100644 --- a/packages/core/src/lambda/remoteDebugging/ldkController.ts +++ b/packages/core/src/lambda/remoteDebugging/ldkController.ts @@ -6,7 +6,7 @@ import * as vscode from 'vscode' import { getLogger } from '../../shared/logger/logger' import globals from '../../shared/extensionGlobals' -import type { Lambda } from 'aws-sdk' +import { FunctionConfiguration, Runtime } from '@aws-sdk/client-lambda' import { getRegionFromArn, LdkClient } from './ldkClient' import { getFamily, mapFamilyToDebugType } from '../models/samLambdaRuntime' import { findJavaPath } from '../../shared/utilities/pathFind' @@ -37,8 +37,8 @@ const mapExtensionToBackup = new Map([['ms-vscode.js-debug', 'ms // Helper function to create a human-readable diff message function createDiffMessage( - config: Lambda.FunctionConfiguration, - currentConfig: Lambda.FunctionConfiguration, + config: FunctionConfiguration, + currentConfig: FunctionConfiguration, isRevert: boolean = true ): string { let message = isRevert ? 'The following changes will be reverted:\n\n' : 'The following changes will be made:\n\n' @@ -175,7 +175,7 @@ export async function activateRemoteDebugging(): Promise { */ export async function tryAutoDetectOutFile( debugConfig: DebugConfig, - functionConfig: Lambda.FunctionConfiguration + functionConfig: FunctionConfiguration ): Promise { // Only works for TypeScript files if ( @@ -355,7 +355,7 @@ function processOutFiles(outFiles: string[], localRoot: string): string[] { } async function getVscodeDebugConfig( - functionConfig: Lambda.FunctionConfiguration, + functionConfig: FunctionConfiguration, debugConfig: DebugConfig ): Promise { // Parse and validate otherDebugParams if provided @@ -390,7 +390,7 @@ async function getVscodeDebugConfig( const debugSessionName = `Debug ${functionConfig.FunctionArn!.split(':').pop()}` // Define debugConfig before the try block - const debugType = mapFamilyToDebugType.get(getFamily(functionConfig.Runtime ?? ''), 'unknown') + const debugType = mapFamilyToDebugType.get(getFamily(functionConfig.Runtime!), 'unknown') let vsCodeDebugConfig: vscode.DebugConfiguration switch (debugType) { case 'node': @@ -526,7 +526,7 @@ export class RemoteDebugController { } } - public supportCodeDownload(runtime: string | undefined, codeSha256: string | undefined = ''): boolean { + public supportCodeDownload(runtime: Runtime | undefined, codeSha256: string | undefined = ''): boolean { if (!runtime) { return false } @@ -542,7 +542,7 @@ export class RemoteDebugController { } } - public supportRuntimeRemoteDebug(runtime: string | undefined): boolean { + public supportRuntimeRemoteDebug(runtime: Runtime | undefined): boolean { if (!runtime) { return false } @@ -553,7 +553,7 @@ export class RemoteDebugController { } } - public async installDebugExtension(runtime: string | undefined): Promise { + public async installDebugExtension(runtime: Runtime | undefined): Promise { if (!runtime) { throw new ToolkitError('Runtime is undefined') } @@ -667,7 +667,7 @@ export class RemoteDebugController { } // Check if runtime / region is supported for remote debugging - if (!this.supportRuntimeRemoteDebug(runtime)) { + if (!this.supportRuntimeRemoteDebug(runtime as Runtime)) { throw new ToolkitError( `Runtime ${runtime} is not supported for remote debugging. ` + `Only Python, Node.js, and Java runtimes are supported.` diff --git a/packages/core/src/lambda/remoteDebugging/localStackLambdaDebugger.ts b/packages/core/src/lambda/remoteDebugging/localStackLambdaDebugger.ts index a7d98f06668..d74b6ac3471 100644 --- a/packages/core/src/lambda/remoteDebugging/localStackLambdaDebugger.ts +++ b/packages/core/src/lambda/remoteDebugging/localStackLambdaDebugger.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import type { Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import globals from '../../shared/extensionGlobals' import { persistLambdaSnapshot, type LambdaDebugger, type DebugConfig } from './lambdaDebugger' import { getLambdaClientWithAgent, getLambdaDebugUserAgent } from './utils' @@ -35,7 +35,7 @@ export class LocalStackLambdaDebugger implements LambdaDebugger { public async setup( progress: vscode.Progress<{ message?: string; increment?: number }>, - functionConfig: Lambda.FunctionConfiguration, + functionConfig: FunctionConfiguration, region: string ): Promise { // No function update and version publishing needed for LocalStack @@ -95,7 +95,7 @@ export class LocalStackLambdaDebugger implements LambdaDebugger { public async waitForSetup( progress: vscode.Progress<{ message?: string; increment?: number }>, - functionConfig: Lambda.FunctionConfiguration, + functionConfig: FunctionConfiguration, region: string ): Promise { if (!functionConfig?.FunctionArn) { @@ -142,7 +142,7 @@ export class LocalStackLambdaDebugger implements LambdaDebugger { // b) Invokes for debug-enabled await being served until the debugger is connected } - public async cleanup(functionConfig: Lambda.FunctionConfiguration): Promise { + public async cleanup(functionConfig: FunctionConfiguration): Promise { await vscode.commands.executeCommand('workbench.action.debug.stop') const endpointUrl = globals.awsContext.getCredentialEndpointUrl() diff --git a/packages/core/src/lambda/remoteDebugging/remoteLambdaDebugger.ts b/packages/core/src/lambda/remoteDebugging/remoteLambdaDebugger.ts index 716f91d7e01..afc9f83abcd 100644 --- a/packages/core/src/lambda/remoteDebugging/remoteLambdaDebugger.ts +++ b/packages/core/src/lambda/remoteDebugging/remoteLambdaDebugger.ts @@ -4,7 +4,7 @@ */ import * as vscode from 'vscode' -import type { Lambda } from 'aws-sdk' +import { Architecture, FunctionConfiguration } from '@aws-sdk/client-lambda' import { persistLambdaSnapshot, type LambdaDebugger, type DebugConfig } from './lambdaDebugger' import { getLogger } from '../../shared/logger/logger' import { isTunnelInfo, LdkClient } from './ldkClient' @@ -14,7 +14,7 @@ import { getRemoteDebugLayerForArch } from './ldkLayers' export function getRemoteDebugLayer( region: string | undefined, - architectures: Lambda.ArchitecturesList | undefined + architectures: Architecture[] | undefined ): string | undefined { if (!region || !architectures) { return undefined @@ -50,7 +50,7 @@ export class RemoteLambdaDebugger implements LambdaDebugger { public async setup( progress: vscode.Progress<{ message?: string; increment?: number }>, - functionConfig: Lambda.FunctionConfiguration, + functionConfig: FunctionConfiguration, region: string ): Promise { const ldkClient = LdkClient.instance @@ -87,7 +87,7 @@ export class RemoteLambdaDebugger implements LambdaDebugger { public async waitForSetup( progress: vscode.Progress<{ message?: string; increment?: number }>, - functionConfig: Lambda.FunctionConfiguration, + functionConfig: FunctionConfiguration, region: string ): Promise { if (!this.tunnelInfo) { @@ -131,7 +131,7 @@ export class RemoteLambdaDebugger implements LambdaDebugger { } } - public async cleanup(functionConfig: Lambda.FunctionConfiguration): Promise { + public async cleanup(functionConfig: FunctionConfiguration): Promise { const ldkClient = LdkClient.instance if (!functionConfig?.FunctionArn) { throw new ToolkitError('No saved configuration found during cleanup') diff --git a/packages/core/src/lambda/remoteDebugging/utils.ts b/packages/core/src/lambda/remoteDebugging/utils.ts index 7d09fb46f49..8f2ea862556 100644 --- a/packages/core/src/lambda/remoteDebugging/utils.ts +++ b/packages/core/src/lambda/remoteDebugging/utils.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import IoTSecureTunneling from 'aws-sdk/clients/iotsecuretunneling' +import { IoTSecureTunnelingClient } from '@aws-sdk/client-iotsecuretunneling' import { DefaultLambdaClient } from '../../shared/clients/lambdaClient' import { getUserAgent } from '../../shared/telemetry/util' import globals from '../../shared/extensionGlobals' @@ -29,13 +29,14 @@ export function getLambdaUserAgent(): string { return `${getUserAgent({ includePlatform: true, includeClientId: true })}` } -export function getIoTSTClientWithAgent(region: string): Promise { +export function getIoTSTClientWithAgent(region: string): IoTSecureTunnelingClient { const customUserAgent = `${customUserAgentBase} ${getUserAgent({ includePlatform: true, includeClientId: true })}` - return globals.sdkClientBuilder.createAwsService( - IoTSecureTunneling, - { - customUserAgent, + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: IoTSecureTunnelingClient, + clientOptions: { + userAgent: [[customUserAgent]], + region, }, - region - ) + userAgent: false, + }) } diff --git a/packages/core/src/lambda/utils.ts b/packages/core/src/lambda/utils.ts index a17783d37b8..9b8ffcb884a 100644 --- a/packages/core/src/lambda/utils.ts +++ b/packages/core/src/lambda/utils.ts @@ -8,7 +8,7 @@ const localize = nls.loadMessageBundle() import path from 'path' import xml2js = require('xml2js') -import { Lambda } from 'aws-sdk' +import { FunctionConfiguration, LayerVersionsListItem } from '@aws-sdk/client-lambda' import * as vscode from 'vscode' import { CloudFormationClient, StackSummary } from '../shared/clients/cloudFormation' import { DefaultLambdaClient, LambdaClient } from '../shared/clients/lambdaClient' @@ -36,7 +36,7 @@ export async function* listCloudFormationStacks(client: CloudFormationClient): A } } -export async function* listLambdaFunctions(client: LambdaClient): AsyncIterableIterator { +export async function* listLambdaFunctions(client: LambdaClient): AsyncIterableIterator { const status = vscode.window.setStatusBarMessage( localize('AWS.message.statusBar.loading.lambda', 'Loading Lambdas...') ) @@ -53,7 +53,7 @@ export async function* listLambdaFunctions(client: LambdaClient): AsyncIterableI export async function* listLayerVersions( client: LambdaClient, name: string -): AsyncIterableIterator { +): AsyncIterableIterator { const status = vscode.window.setStatusBarMessage( localize('AWS.message.statusBar.loading.lambda', 'Loading Lambda Layer Versions...') ) @@ -72,7 +72,7 @@ export async function* listLayerVersions( * Only works for supported languages (Python/JS) * @param configuration Lambda configuration object from getFunction */ -export function getLambdaDetails(configuration: Lambda.FunctionConfiguration): { +export function getLambdaDetails(configuration: FunctionConfiguration): { fileName: string functionName: string } { diff --git a/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts b/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts index 7f80bd8370f..c56f43ae199 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts +++ b/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts @@ -3,7 +3,6 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { _Blob } from 'aws-sdk/clients/lambda' import { readFileSync } from 'fs' // eslint-disable-line no-restricted-imports import * as _ from 'lodash' import * as vscode from 'vscode' @@ -19,7 +18,8 @@ import { getSampleLambdaPayloads, SampleRequest, isHotReloadingFunction } from ' import * as nls from 'vscode-nls' import { VueWebview } from '../../../webviews/main' -import { telemetry, Runtime } from '../../../shared/telemetry/telemetry' +import { telemetry, Runtime as TelemetryRuntime } from '../../../shared/telemetry/telemetry' +import { Runtime } from '@aws-sdk/client-lambda' import { runSamCliRemoteTestEvents, SamCliRemoteTestEventsParameters, @@ -58,7 +58,7 @@ export interface InitialData { Source?: string StackName?: string LogicalId?: string - Runtime?: string + Runtime?: Runtime LocalRootPath?: string LambdaFunctionNode?: LambdaFunctionNode supportCodeDownload?: boolean @@ -287,7 +287,8 @@ export class RemoteInvokeWebview extends VueWebview { ? await this.clientDebug.invoke(this.data.FunctionArn, input, qualifier) : await this.client.invoke(this.data.FunctionArn, input, qualifier) const logs = funcResponse.LogResult ? decodeBase64(funcResponse.LogResult) : '' - const payload = funcResponse.Payload ? funcResponse.Payload : JSON.stringify({}) + const decodedPayload = funcResponse.Payload ? new TextDecoder().decode(funcResponse.Payload) : '' + const payload = decodedPayload || JSON.stringify({}) this.channel.appendLine(`Invocation result for ${this.data.FunctionArn}`) this.channel.appendLine('Logs:') @@ -390,12 +391,14 @@ export class RemoteInvokeWebview extends VueWebview { return false } - const handlerFile = await getLambdaHandlerFile( - vscode.Uri.file(this.data.LocalRootPath), - '', - this.data.LambdaFunctionNode?.configuration.Handler ?? '', - this.data.Runtime ?? 'unknown' - ) + const handlerFile = this.data.Runtime + ? await getLambdaHandlerFile( + vscode.Uri.file(this.data.LocalRootPath), + '', + this.data.LambdaFunctionNode?.configuration.Handler ?? '', + this.data.Runtime + ) + : undefined if (!handlerFile || !(await fs.exists(handlerFile))) { this.handlerFileAvailable = false return false @@ -658,7 +661,7 @@ export class RemoteInvokeWebview extends VueWebview { // Download lambda code and update the local root path public async downloadRemoteCode(): Promise { return await telemetry.lambda_import.run(async (span) => { - span.record({ runtime: this.data.Runtime as Runtime | undefined, source: 'RemoteDebug' }) + span.record({ runtime: this.data.Runtime as TelemetryRuntime | undefined, source: 'RemoteDebug' }) try { if (this.data.LambdaFunctionNode) { const output = await runDownloadLambda(this.data.LambdaFunctionNode, true) @@ -908,7 +911,7 @@ export async function invokeRemoteLambda( const Panel = VueWebview.compilePanel(RemoteInvokeWebview) // Initialize support and debugging capabilities - const runtime = resource.configuration.Runtime ?? 'unknown' + const runtime = resource.configuration.Runtime const region = resource.regionCode const supportCodeDownload = RemoteDebugController.instance.supportCodeDownload( runtime, diff --git a/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue index 7280f86c4bf..62a3de7ce09 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue +++ b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue @@ -97,12 +97,12 @@ file for debugging. - Browse to specify the absolute path to your local directory that contains the handler file for - debugging. Or Download the handler file from your deployed function. + Browse to specify the absolute path to your local directory that contains the handler + file for debugging. Or Download the handler file from your deployed function. - Browse to specify the absolute path to your local directory that contains the handler file for - debugging. + Browse to specify the absolute path to your local directory that contains the handler + file for debugging.

diff --git a/packages/core/src/lambda/wizards/samInitWizard.ts b/packages/core/src/lambda/wizards/samInitWizard.ts index 10906ec513d..9bd3a1b72fb 100644 --- a/packages/core/src/lambda/wizards/samInitWizard.ts +++ b/packages/core/src/lambda/wizards/samInitWizard.ts @@ -5,7 +5,7 @@ import * as nls from 'vscode-nls' import * as AWS from '@aws-sdk/types' -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import * as path from 'path' import * as vscode from 'vscode' import { SchemasDataProvider } from '../../eventSchemas/providers/schemasDataProvider' @@ -231,7 +231,7 @@ export class CreateNewSamAppWizard extends Wizard { return false } - return samArmLambdaRuntimes.has(state.runtimeAndPackage?.runtime ?? 'unknown') + return state.runtimeAndPackage ? samArmLambdaRuntimes.has(state.runtimeAndPackage.runtime) : false } this.form.architecture.bindPrompter(createArchitecturePrompter, { diff --git a/packages/core/src/shared/activationReloadState.ts b/packages/core/src/shared/activationReloadState.ts index 70d236d2dd0..bcdefa925f3 100644 --- a/packages/core/src/shared/activationReloadState.ts +++ b/packages/core/src/shared/activationReloadState.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import globals from './extensionGlobals' export interface SamInitState { @@ -22,7 +22,7 @@ export class ActivationReloadState { return { template: globals.globalState.get('ACTIVATION_TEMPLATE_PATH_KEY'), readme: globals.globalState.get('ACTIVATION_LAUNCH_PATH_KEY'), - runtime: globals.globalState.get('SAM_INIT_RUNTIME_KEY'), + runtime: globals.globalState.get('SAM_INIT_RUNTIME_KEY'), architecture: globals.globalState.get('SAM_INIT_ARCH_KEY'), isImage: globals.globalState.get('SAM_INIT_IMAGE_BOOLEAN_KEY'), } diff --git a/packages/core/src/shared/clients/codecatalystClient.ts b/packages/core/src/shared/clients/codecatalystClient.ts index 2fa9f7b31a2..b7618fe01b0 100644 --- a/packages/core/src/shared/clients/codecatalystClient.ts +++ b/packages/core/src/shared/clients/codecatalystClient.ts @@ -9,7 +9,6 @@ import * as vscode from 'vscode' import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import * as AWS from 'aws-sdk' import * as logger from '../logger/logger' import { CancellationError, Timeout, waitTimeout, waitUntil } from '../utilities/timeoutUtils' import { isUserCancelledError } from '../../shared/errors' @@ -24,10 +23,8 @@ import { } from '../utilities/tsUtils' import { AsyncCollection, toCollection } from '../utilities/asyncCollection' import { joinAll, pageableToCollection } from '../utilities/collectionUtils' -import { CodeCatalyst } from 'aws-sdk' import { ToolkitError } from '../errors' import { Uri } from 'vscode' -import { GetSourceRepositoryCloneUrlsRequest } from 'aws-sdk/clients/codecatalyst' import { CodeCatalystClient as CodeCatalystSDKClient, CreateAccessTokenCommand, @@ -53,15 +50,18 @@ import { GetProjectCommandOutput, GetProjectRequest, GetSourceRepositoryCloneUrlsCommand, + GetSourceRepositoryCloneUrlsRequest, GetSourceRepositoryCloneUrlsResponse, GetSpaceCommand, GetSpaceCommandOutput, GetSpaceRequest, GetSubscriptionCommand, GetSubscriptionRequest, + GetSubscriptionResponse, GetUserDetailsCommand, GetUserDetailsCommandOutput, GetUserDetailsRequest, + GetUserDetailsResponse, ListDevEnvironmentsCommand, ListDevEnvironmentsRequest, ListDevEnvironmentsResponse, @@ -73,6 +73,7 @@ import { ListSourceRepositoriesRequest, ListSourceRepositoriesResponse, ListSourceRepositoryBranchesCommand, + ListSourceRepositoryBranchesItem, ListSourceRepositoryBranchesRequest, ListSpacesCommand, ListSpacesRequest, @@ -152,14 +153,14 @@ export interface DevEnvironment extends CodeCatalystDevEnvironmentSummary { /** CodeCatalyst developer environment session. */ // eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface CodeCatalystDevEnvSession extends CodeCatalyst.StartDevEnvironmentResponse {} +export interface CodeCatalystDevEnvSession extends StartDevEnvironmentResponse {} export interface CodeCatalystOrg extends SpaceSummary { readonly type: 'org' readonly name: string } -export interface CodeCatalystProject extends CodeCatalyst.ProjectSummary { +export interface CodeCatalystProject extends ProjectSummary { readonly type: 'project' readonly name: string readonly org: Pick @@ -172,7 +173,7 @@ export interface CodeCatalystRepo extends ListSourceRepositoriesItem { readonly project: Pick } -export interface CodeCatalystBranch extends CodeCatalyst.ListSourceRepositoryBranchesItem { +export interface CodeCatalystBranch extends ListSourceRepositoryBranchesItem { readonly type: 'branch' readonly name: string readonly repo: Pick @@ -200,7 +201,7 @@ function toBranch( org: string, project: string, repo: string, - branch: CodeCatalyst.ListSourceRepositoryBranchesItem + branch: ListSourceRepositoryBranchesItem ): CodeCatalystBranch { assertHasProps(branch, 'name') @@ -229,10 +230,7 @@ function createCodeCatalystClient( }) } -export type UserDetails = RequiredProps< - CodeCatalyst.GetUserDetailsResponse, - 'userId' | 'userName' | 'displayName' | 'primaryEmail' -> +export type UserDetails = RequiredProps // CodeCatalyst client has two variants: 'logged-in' and 'not logged-in' // The 'not logged-in' variant is a subtype and has restricted functionality @@ -421,7 +419,7 @@ class CodeCatalystClientInternal extends ClientWrapper { } } - public async getSubscription(request: GetSubscriptionRequest): Promise { + public async getSubscription(request: GetSubscriptionRequest): Promise { return this.call(GetSubscriptionCommand, request, false) } @@ -842,18 +840,18 @@ class CodeCatalystClientInternal extends ClientWrapper { startAttempts++ await this.startDevEnvironment(args) } catch (e) { - const err = e as AWS.AWSError + const err = e as ServiceException // - ServiceQuotaExceededException: account billing limit reached // - ValidationException: "… creation has failed, cannot start" // - ConflictException: "Cannot start … because update process is still going on" // (can happen after "Update Dev Environment") - if (err.code === 'ServiceQuotaExceededException') { + if (err.name === 'ServiceQuotaExceededException') { throw new ToolkitError('Dev Environment failed: quota exceeded', { code: 'ServiceQuotaExceeded', cause: err, }) } - doLog('info', `devenv not started (${err.code}), waiting`) + doLog('info', `devenv not started (${err.name}), waiting`) // Continue retrying... } } else if (resp.status === 'STOPPING') { diff --git a/packages/core/src/shared/clients/ec2MetadataClient.ts b/packages/core/src/shared/clients/ec2MetadataClient.ts index 899adb6761c..72249efa6c9 100644 --- a/packages/core/src/shared/clients/ec2MetadataClient.ts +++ b/packages/core/src/shared/clients/ec2MetadataClient.ts @@ -5,7 +5,8 @@ import { getLogger } from '../logger/logger' import { ClassToInterfaceType } from '../utilities/tsUtils' -import { AWSError, MetadataService } from 'aws-sdk' +import { httpRequest } from '@smithy/credential-provider-imds' +import { RequestOptions } from 'http' export interface IamInfo { Code: string @@ -21,8 +22,12 @@ export interface InstanceIdentity { export type Ec2MetadataClient = ClassToInterfaceType export class DefaultEc2MetadataClient { private static readonly metadataServiceTimeout: number = 500 + // AWS EC2 Instance Metadata Service (IMDS) constants + // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html + private static readonly metadataServiceHost: string = '169.254.169.254' + private static readonly tokenPath: string = '/latest/api/token' - public constructor(private metadata: MetadataService = DefaultEc2MetadataClient.getMetadataService()) {} + public constructor() {} public getInstanceIdentity(): Promise { return this.invoke('/latest/dynamic/instance-identity/document') @@ -32,52 +37,61 @@ export class DefaultEc2MetadataClient { return this.invoke('/latest/meta-data/iam/info') } - public invoke(path: string): Promise { - return new Promise((resolve, reject) => { - // fetchMetadataToken is private for some reason, but has the exact token functionality - // that we want out of the metadata service. - // https://github.com/aws/aws-sdk-js/blob/3333f8b49283f5bbff823ab8a8469acedb7fe3d5/lib/metadata_service.js#L116-L136 - ;(this.metadata as any).fetchMetadataToken((tokenErr: AWSError, token: string) => { - let options - if (tokenErr) { - getLogger().warn( - 'Ec2MetadataClient failed to fetch token. If this is an EC2 environment, then Toolkit will fall back to IMDSv1: %s', - tokenErr - ) + public async invoke(path: string): Promise { + try { + // Try to get IMDSv2 token first + const token = await this.fetchMetadataToken() + const headers: Record = {} + if (token) { + headers['x-aws-ec2-metadata-token'] = token + } - // Fall back to IMDSv1 for legacy instances. - options = {} - } else { - options = { - // By attaching the token we force the use of IMDSv2. - // https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-metadata-v2-how-it-works.html - headers: { 'x-aws-ec2-metadata-token': token }, - } - } + const response = await this.makeRequest(path, headers) + return JSON.parse(response.toString()) + } catch (tokenErr) { + getLogger().warn( + 'Ec2MetadataClient failed to fetch token. If this is an EC2 environment, then Toolkit will fall back to IMDSv1: %s', + tokenErr + ) - this.metadata.request(path, options, (err, response) => { - if (err) { - reject(err) - return - } - try { - const jsonResponse: T = JSON.parse(response) - resolve(jsonResponse) - } catch (e) { - reject(`Ec2MetadataClient: invalid response from "${path}": ${response}\nerror: ${e}`) - } - }) - }) - }) + // Fall back to IMDSv1 for legacy instances + try { + const response = await this.makeRequest(path, {}) + return JSON.parse(response.toString()) + } catch (err) { + throw new Error(`Ec2MetadataClient: failed to fetch "${path}": ${err}`) + } + } } - private static getMetadataService() { - return new MetadataService({ - httpOptions: { + private async fetchMetadataToken(): Promise { + try { + const options: RequestOptions = { + host: DefaultEc2MetadataClient.metadataServiceHost, + path: DefaultEc2MetadataClient.tokenPath, + method: 'PUT', + headers: { + 'x-aws-ec2-metadata-token-ttl-seconds': '21600', + }, timeout: DefaultEc2MetadataClient.metadataServiceTimeout, - connectTimeout: DefaultEc2MetadataClient.metadataServiceTimeout, - } as any, - // workaround for known bug: https://github.com/aws/aws-sdk-js/issues/3029 - }) + } + + const response = await httpRequest(options) + return response.toString() + } catch (err) { + return undefined + } + } + + private async makeRequest(path: string, headers: Record): Promise { + const options: RequestOptions = { + host: DefaultEc2MetadataClient.metadataServiceHost, + path, + method: 'GET', + headers, + timeout: DefaultEc2MetadataClient.metadataServiceTimeout, + } + + return httpRequest(options) } } diff --git a/packages/core/src/shared/clients/ecrClient.ts b/packages/core/src/shared/clients/ecrClient.ts index 1478d76751d..f5e03d4db7a 100644 --- a/packages/core/src/shared/clients/ecrClient.ts +++ b/packages/core/src/shared/clients/ecrClient.ts @@ -3,23 +3,31 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { ECR } from 'aws-sdk' +import { + ECRClient, + DescribeImagesCommand, + DescribeRepositoriesCommand, + CreateRepositoryCommand, + DeleteRepositoryCommand, + BatchDeleteImageCommand, +} from '@aws-sdk/client-ecr' +import type { DescribeImagesRequest, DescribeRepositoriesRequest, Repository } from '@aws-sdk/client-ecr' import globals from '../extensionGlobals' import { AsyncCollection } from '../utilities/asyncCollection' import { pageableToCollection } from '../utilities/collectionUtils' import { assertHasProps, ClassToInterfaceType, isNonNullable, RequiredProps } from '../utilities/tsUtils' -export type EcrRepository = RequiredProps +export type EcrRepository = RequiredProps export type EcrClient = ClassToInterfaceType export class DefaultEcrClient { public constructor(public readonly regionCode: string) {} public async *describeTags(repositoryName: string): AsyncIterableIterator { - const sdkClient = await this.createSdkClient() - const request: ECR.DescribeImagesRequest = { repositoryName: repositoryName } + const sdkClient = this.createSdkClient() + const request: DescribeImagesRequest = { repositoryName: repositoryName } do { - const response = await sdkClient.describeImages(request).promise() + const response = await sdkClient.send(new DescribeImagesCommand(request)) if (response.imageDetails) { for (const item of response.imageDetails) { if (item.imageTags !== undefined) { @@ -34,13 +42,13 @@ export class DefaultEcrClient { } public async *describeRepositories(): AsyncIterableIterator { - const sdkClient = await this.createSdkClient() - const request: ECR.DescribeRepositoriesRequest = {} + const sdkClient = this.createSdkClient() + const request: DescribeRepositoriesRequest = {} do { - const response = await sdkClient.describeRepositories(request).promise() + const response = await sdkClient.send(new DescribeRepositoriesCommand(request)) if (response.repositories) { yield* response.repositories - .map((repo) => { + .map((repo: Repository) => { // If any of these are not present, the repo returned is not valid. repositoryUri/Arn // are both based on name, and it's not possible to not have a name if (!repo.repositoryArn || !repo.repositoryName || !repo.repositoryUri) { @@ -53,36 +61,43 @@ export class DefaultEcrClient { } } }) - .filter((item) => item !== undefined) as EcrRepository[] + .filter((item: EcrRepository | undefined) => item !== undefined) as EcrRepository[] } request.nextToken = response.nextToken } while (request.nextToken) } public listAllRepositories(): AsyncCollection { - const requester = async (req: ECR.DescribeRepositoriesRequest) => - (await this.createSdkClient()).describeRepositories(req).promise() + const requester = async (req: DescribeRepositoriesRequest) => + this.createSdkClient().send(new DescribeRepositoriesCommand(req)) const collection = pageableToCollection(requester, {}, 'nextToken', 'repositories') - return collection.filter(isNonNullable).map((list) => list.map((repo) => (assertHasProps(repo), repo))) + return collection + .filter(isNonNullable) + .map((list: Repository[]) => list.map((repo: Repository) => (assertHasProps(repo), repo))) } public async createRepository(repositoryName: string) { - const sdkClient = await this.createSdkClient() - return sdkClient.createRepository({ repositoryName: repositoryName }).promise() + const sdkClient = this.createSdkClient() + return sdkClient.send(new CreateRepositoryCommand({ repositoryName: repositoryName })) } public async deleteRepository(repositoryName: string): Promise { - const sdkClient = await this.createSdkClient() - await sdkClient.deleteRepository({ repositoryName: repositoryName }).promise() + const sdkClient = this.createSdkClient() + await sdkClient.send(new DeleteRepositoryCommand({ repositoryName: repositoryName })) } public async deleteTag(repositoryName: string, tag: string): Promise { - const sdkClient = await this.createSdkClient() - await sdkClient.batchDeleteImage({ repositoryName: repositoryName, imageIds: [{ imageTag: tag }] }).promise() + const sdkClient = this.createSdkClient() + await sdkClient.send( + new BatchDeleteImageCommand({ repositoryName: repositoryName, imageIds: [{ imageTag: tag }] }) + ) } - protected async createSdkClient(): Promise { - return await globals.sdkClientBuilder.createAwsService(ECR, undefined, this.regionCode) + protected createSdkClient(): ECRClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: ECRClient, + clientOptions: { region: this.regionCode }, + }) } } diff --git a/packages/core/src/shared/clients/ecsClient.ts b/packages/core/src/shared/clients/ecsClient.ts index 51bda018502..818cdc0dec5 100644 --- a/packages/core/src/shared/clients/ecsClient.ts +++ b/packages/core/src/shared/clients/ecsClient.ts @@ -3,7 +3,31 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { ECS } from 'aws-sdk' +import { + Cluster, + DescribeClustersCommand, + DescribeServicesCommand, + DescribeTaskDefinitionCommand, + DescribeTaskDefinitionResponse, + DescribeTasksCommand, + DescribeTasksRequest, + ECSClient, + ExecuteCommandCommand, + ExecuteCommandRequest, + ExecuteCommandResponse, + ListClustersCommand, + ListClustersRequest, + ListServicesCommand, + ListServicesRequest, + ListTasksCommand, + ListTasksRequest, + RegisterTaskDefinitionCommand, + RegisterTaskDefinitionRequest, + Service, + Task, + UpdateServiceCommand, + UpdateServiceRequest, +} from '@aws-sdk/client-ecs' import globals from '../extensionGlobals' import { AsyncCollection } from '../utilities/asyncCollection' import { pageableToCollection } from '../utilities/collectionUtils' @@ -12,7 +36,7 @@ import { ClassToInterfaceType, isNonNullable } from '../utilities/tsUtils' export type EcsClient = ClassToInterfaceType export type EcsResourceAndToken = { - resource: ECS.Cluster[] | ECS.Service[] + resource: Cluster[] | Service[] nextToken?: string } @@ -21,12 +45,16 @@ export class DefaultEcsClient { public constructor(public readonly regionCode: string) {} public async getClusters(nextToken?: string): Promise { - const sdkClient = await this.createSdkClient() - const clusterArnList = await sdkClient.listClusters({ maxResults: maxResultsPerResponse, nextToken }).promise() + const sdkClient = this.createSdkClient() + const clusterArnList = await sdkClient.send( + new ListClustersCommand({ maxResults: maxResultsPerResponse, nextToken }) + ) if (clusterArnList.clusterArns?.length === 0) { return { resource: [] } } - const clusterResponse = await sdkClient.describeClusters({ clusters: clusterArnList.clusterArns }).promise() + const clusterResponse = await sdkClient.send( + new DescribeClustersCommand({ clusters: clusterArnList.clusterArns }) + ) const response: EcsResourceAndToken = { resource: clusterResponse.clusters!, nextToken: clusterArnList.nextToken, @@ -34,9 +62,9 @@ export class DefaultEcsClient { return response } - public listClusters(request: ECS.ListClustersRequest = {}): AsyncCollection { + public listClusters(request: ListClustersRequest = {}): AsyncCollection { const client = this.createSdkClient() - const requester = async (req: ECS.ListClustersRequest) => (await client).listClusters(req).promise() + const requester = async (req: ListClustersRequest) => client.send(new ListClustersCommand(req)) const collection = pageableToCollection(requester, request, 'nextToken', 'clusterArns') return collection.filter(isNonNullable).map(async (clusters) => { @@ -44,16 +72,16 @@ export class DefaultEcsClient { return [] } - const resp = await (await client).describeClusters({ clusters }).promise() + const resp = await client.send(new DescribeClustersCommand({ clusters })) return resp.clusters! }) } public async getServices(cluster: string, nextToken?: string): Promise { - const sdkClient = await this.createSdkClient() - const serviceArnList = await sdkClient - .listServices({ cluster: cluster, maxResults: maxResultsPerResponse, nextToken }) - .promise() + const sdkClient = this.createSdkClient() + const serviceArnList = await sdkClient.send( + new ListServicesCommand({ cluster: cluster, maxResults: maxResultsPerResponse, nextToken }) + ) if (serviceArnList.serviceArns?.length === 0) { return { resource: [] } } @@ -65,9 +93,9 @@ export class DefaultEcsClient { return response } - public listServices(request: ECS.ListServicesRequest = {}): AsyncCollection { + public listServices(request: ListServicesRequest = {}): AsyncCollection { const client = this.createSdkClient() - const requester = async (req: ECS.ListServicesRequest) => (await client).listServices(req).promise() + const requester = async (req: ListServicesRequest) => client.send(new ListServicesCommand(req)) const collection = pageableToCollection(requester, request, 'nextToken', 'serviceArns') return collection.filter(isNonNullable).map(async (services) => { @@ -75,56 +103,57 @@ export class DefaultEcsClient { return [] } - const resp = await (await client).describeServices({ cluster: request.cluster, services }).promise() + const resp = await client.send(new DescribeServicesCommand({ cluster: request.cluster, services })) return resp.services! }) } - public async describeTaskDefinition(taskDefinition: string): Promise { - const sdkClient = await this.createSdkClient() - return await sdkClient.describeTaskDefinition({ taskDefinition }).promise() + public async describeTaskDefinition(taskDefinition: string): Promise { + const sdkClient = this.createSdkClient() + return await sdkClient.send(new DescribeTaskDefinitionCommand({ taskDefinition })) } - public async listTasks(args: ECS.ListTasksRequest): Promise { - const sdkClient = await this.createSdkClient() - const listTasksResponse = await sdkClient.listTasks(args).promise() + public async listTasks(args: ListTasksRequest): Promise { + const sdkClient = this.createSdkClient() + const listTasksResponse = await sdkClient.send(new ListTasksCommand(args)) return listTasksResponse.taskArns ?? [] } - public async updateService(request: ECS.UpdateServiceRequest): Promise { - const sdkClient = await this.createSdkClient() - await sdkClient.updateService(request).promise() + public async updateService(request: UpdateServiceRequest): Promise { + const sdkClient = this.createSdkClient() + await sdkClient.send(new UpdateServiceCommand(request)) } - public async describeTasks(cluster: string, tasks: string[]): Promise { - const sdkClient = await this.createSdkClient() + public async describeTasks(cluster: string, tasks: string[]): Promise { + const sdkClient = this.createSdkClient() - const params: ECS.DescribeTasksRequest = { cluster, tasks } - const describedTasks = await sdkClient.describeTasks(params).promise() + const params: DescribeTasksRequest = { cluster, tasks } + const describedTasks = await sdkClient.send(new DescribeTasksCommand(params)) return describedTasks.tasks ?? [] } - public async describeServices(cluster: string, services: string[]): Promise { - const sdkClient = await this.createSdkClient() - return (await sdkClient.describeServices({ cluster, services }).promise()).services ?? [] + public async describeServices(cluster: string, services: string[]): Promise { + const sdkClient = this.createSdkClient() + return (await sdkClient.send(new DescribeServicesCommand({ cluster, services }))).services ?? [] } - protected async createSdkClient(): Promise { - return await globals.sdkClientBuilder.createAwsService(ECS, undefined, this.regionCode) + protected createSdkClient(): ECSClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: ECSClient, + clientOptions: { region: this.regionCode }, + }) } - public async executeCommand( - request: Omit - ): Promise { - const sdkClient = await this.createSdkClient() + public async executeCommand(request: Omit): Promise { + const sdkClient = this.createSdkClient() // Currently the 'interactive' flag is required and needs to be true for ExecuteCommand: https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ExecuteCommand.html // This may change 'in the near future' as explained here: https://aws.amazon.com/blogs/containers/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/ - return await sdkClient.executeCommand({ ...request, interactive: true }).promise() + return await sdkClient.send(new ExecuteCommandCommand({ ...request, interactive: true })) } - public async registerTaskDefinition(request: ECS.RegisterTaskDefinitionRequest) { - const sdkClient = await this.createSdkClient() - return sdkClient.registerTaskDefinition(request).promise() + public async registerTaskDefinition(request: RegisterTaskDefinitionRequest) { + const sdkClient = this.createSdkClient() + return sdkClient.send(new RegisterTaskDefinitionCommand(request)) } } diff --git a/packages/core/src/shared/clients/iotClient.ts b/packages/core/src/shared/clients/iotClient.ts index 45b9cbd4e4f..fc5581fffa4 100644 --- a/packages/core/src/shared/clients/iotClient.ts +++ b/packages/core/src/shared/clients/iotClient.ts @@ -4,7 +4,70 @@ */ import * as _ from 'lodash' -import { Iot } from 'aws-sdk' +import { + AttachPolicyCommand, + AttachPolicyRequest, + AttachThingPrincipalCommand, + AttachThingPrincipalRequest, + CertificateDescription, + CreateKeysAndCertificateCommand, + CreateKeysAndCertificateRequest, + CreateKeysAndCertificateResponse, + CreatePolicyCommand, + CreatePolicyRequest, + CreatePolicyResponse, + CreatePolicyVersionCommand, + CreatePolicyVersionRequest, + CreateThingCommand, + CreateThingRequest, + CreateThingResponse, + DeleteCertificateCommand, + DeleteCertificateRequest, + DeletePolicyCommand, + DeletePolicyRequest, + DeletePolicyVersionCommand, + DeletePolicyVersionRequest, + DeleteThingCommand, + DeleteThingRequest, + DescribeCertificateCommand, + DescribeCertificateRequest, + DescribeCertificateResponse, + DescribeEndpointCommand, + DetachPolicyCommand, + DetachPolicyRequest, + DetachThingPrincipalCommand, + DetachThingPrincipalRequest, + GetPolicyVersionCommand, + GetPolicyVersionRequest, + GetPolicyVersionResponse, + IoTClient, + ListCertificatesCommand, + ListCertificatesRequest, + ListCertificatesResponse, + ListPoliciesCommand, + ListPoliciesRequest, + ListPoliciesResponse, + ListPolicyVersionsCommand, + ListPolicyVersionsRequest, + ListPrincipalPoliciesCommand, + ListPrincipalPoliciesRequest, + ListPrincipalPoliciesResponse, + ListPrincipalThingsCommand, + ListPrincipalThingsRequest, + ListTargetsForPolicyCommand, + ListTargetsForPolicyRequest, + ListThingPrincipalsCommand, + ListThingPrincipalsRequest, + ListThingPrincipalsResponse, + ListThingsCommand, + ListThingsRequest, + ListThingsResponse, + PolicyVersion, + SetDefaultPolicyVersionCommand, + SetDefaultPolicyVersionRequest, + UpdateCertificateCommand, + UpdateCertificateRequest, +} from '@aws-sdk/client-iot' import { parse } from '@aws-sdk/util-arn-parser' import { getLogger } from '../logger/logger' import { InterfaceNoSymbol } from '../utilities/tsUtils' @@ -30,14 +93,14 @@ const iotServiceArn = 'iot' const certArnResourcePattern = /cert\/(\w+)/ export interface ListThingCertificatesResponse { - readonly certificates: Iot.CertificateDescription[] + readonly certificates: CertificateDescription[] readonly nextToken: string | undefined } export class DefaultIotClient { public constructor( private readonly regionCode: string, - private readonly iotProvider: (regionCode: string) => Promise = createSdkClient + private readonly iotProvider: (regionCode: string) => IoTClient = createSdkClient ) {} /** @@ -45,16 +108,16 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listThings(request?: Iot.ListThingsRequest): Promise { + public async listThings(request?: ListThingsRequest): Promise { getLogger().debug('ListThings called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.ListThingsResponse = await iot - .listThings({ + const output: ListThingsResponse = await iot.send( + new ListThingsCommand({ maxResults: request?.maxResults ?? defaultMaxThings, nextToken: request?.nextToken, }) - .promise() + ) getLogger().debug('ListThings returned response: %O', output) return output @@ -65,11 +128,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async createThing(request: Iot.CreateThingRequest): Promise { + public async createThing(request: CreateThingRequest): Promise { getLogger().debug('CreateThing called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.CreateThingResponse = await iot.createThing({ thingName: request.thingName }).promise() + const output: CreateThingResponse = await iot.send(new CreateThingCommand({ thingName: request.thingName })) getLogger().debug('CreateThing returned response: %O', output) return output @@ -80,11 +143,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async deleteThing(request: Iot.DeleteThingRequest): Promise { + public async deleteThing(request: DeleteThingRequest): Promise { getLogger().debug('DeleteThing called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.deleteThing({ thingName: request.thingName }).promise() + await iot.send(new DeleteThingCommand({ thingName: request.thingName })) getLogger().debug('DeleteThing successful') } @@ -94,17 +157,17 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listCertificates(request: Iot.ListCertificatesRequest): Promise { + public async listCertificates(request: ListCertificatesRequest): Promise { getLogger().debug('ListCertificates called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.ListCertificatesResponse = await iot - .listCertificates({ + const output: ListCertificatesResponse = await iot.send( + new ListCertificatesCommand({ pageSize: request.pageSize ?? defaultMaxThings, marker: request.marker, ascendingOrder: request.ascendingOrder, }) - .promise() + ) getLogger().debug('ListCertificates returned response: %O', output) return output @@ -118,18 +181,16 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listThingPrincipals( - request: Iot.ListThingPrincipalsRequest - ): Promise { - const iot = await this.iotProvider(this.regionCode) + public async listThingPrincipals(request: ListThingPrincipalsRequest): Promise { + const iot = this.iotProvider(this.regionCode) - const output: Iot.ListThingPrincipalsResponse = await iot - .listThingPrincipals({ + const output: ListThingPrincipalsResponse = await iot.send( + new ListThingPrincipalsCommand({ thingName: request.thingName, maxResults: request.maxResults ?? defaultMaxThings, nextToken: request.nextToken, }) - .promise() + ) return output } @@ -138,12 +199,10 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - private async describeCertificate( - request: Iot.DescribeCertificateRequest - ): Promise { - const iot = await this.iotProvider(this.regionCode) + private async describeCertificate(request: DescribeCertificateRequest): Promise { + const iot = this.iotProvider(this.regionCode) - const output: Iot.DescribeCertificateResponse = await iot.describeCertificate(request).promise() + const output: DescribeCertificateResponse = await iot.send(new DescribeCertificateCommand(request)) return output } @@ -158,13 +217,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listThingCertificates( - request: Iot.ListThingPrincipalsRequest - ): Promise { + public async listThingCertificates(request: ListThingPrincipalsRequest): Promise { getLogger().debug('ListThingCertificates called with request: %O', request) const output = await this.listThingPrincipals(request) - const iotPrincipals: Iot.Principal[] = output.principals ?? [] + const iotPrincipals: string[] = output.principals ?? [] const nextToken = output.nextToken const describedCerts = iotPrincipals.map(async (iotPrincipal) => { @@ -179,7 +236,7 @@ export class DefaultIotClient { const resolvedCerts = (await Promise.all(describedCerts)) .filter((cert) => cert?.certificateDescription !== undefined) - .map((cert) => cert?.certificateDescription as Iot.CertificateDescription) + .map((cert) => cert?.certificateDescription as CertificateDescription) const response: ListThingCertificatesResponse = { certificates: resolvedCerts, nextToken: nextToken } getLogger().debug('ListThingCertificates returned response: %O', response) @@ -194,18 +251,18 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listThingsForCert(request: Iot.ListPrincipalThingsRequest): Promise { + public async listThingsForCert(request: ListPrincipalThingsRequest): Promise { getLogger().debug('ListThingsForCert called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output = await iot - .listPrincipalThings({ + const output = await iot.send( + new ListPrincipalThingsCommand({ maxResults: request.maxResults ?? defaultMaxThings, nextToken: request.nextToken, principal: request.principal, }) - .promise() - const iotThings: Iot.ThingName[] = output.things ?? [] + ) + const iotThings: string[] = output.things ?? [] getLogger().debug('ListThingsForCert returned response: %O', iotThings) return iotThings @@ -217,12 +274,12 @@ export class DefaultIotClient { * @throws Error if there is an error calling IoT. */ public async createCertificateAndKeys( - request: Iot.CreateKeysAndCertificateRequest - ): Promise { + request: CreateKeysAndCertificateRequest + ): Promise { getLogger().debug('CreateCertificate called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.CreateKeysAndCertificateResponse = await iot.createKeysAndCertificate(request).promise() + const output: CreateKeysAndCertificateResponse = await iot.send(new CreateKeysAndCertificateCommand(request)) getLogger().debug('CreateCertificate succeeded') return output @@ -233,11 +290,13 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async updateCertificate(request: Iot.UpdateCertificateRequest): Promise { + public async updateCertificate(request: UpdateCertificateRequest): Promise { getLogger().debug('UpdateCertificate called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.updateCertificate({ certificateId: request.certificateId, newStatus: request.newStatus }).promise() + await iot.send( + new UpdateCertificateCommand({ certificateId: request.certificateId, newStatus: request.newStatus }) + ) getLogger().debug('UpdateCertificate successful') } @@ -251,11 +310,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async deleteCertificate(request: Iot.DeleteCertificateRequest): Promise { + public async deleteCertificate(request: DeleteCertificateRequest): Promise { getLogger().debug('DeleteCertificate called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.deleteCertificate(request).promise() + await iot.send(new DeleteCertificateCommand(request)) getLogger().debug('DeleteCertificate successful') } @@ -265,11 +324,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async attachThingPrincipal(request: Iot.AttachThingPrincipalRequest): Promise { + public async attachThingPrincipal(request: AttachThingPrincipalRequest): Promise { getLogger().debug('AttachThingPrincipal called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.attachThingPrincipal({ thingName: request.thingName, principal: request.principal }).promise() + await iot.send(new AttachThingPrincipalCommand({ thingName: request.thingName, principal: request.principal })) getLogger().debug('AttachThingPrincipal successful') } @@ -279,11 +338,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async detachThingPrincipal(request: Iot.DetachThingPrincipalRequest): Promise { + public async detachThingPrincipal(request: DetachThingPrincipalRequest): Promise { getLogger().debug('DetachThingPrincipal called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.detachThingPrincipal({ thingName: request.thingName, principal: request.principal }).promise() + await iot.send(new DetachThingPrincipalCommand({ thingName: request.thingName, principal: request.principal })) getLogger().debug('DetachThingPrincipal successful') } @@ -293,17 +352,17 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listPolicies(request: Iot.ListPoliciesRequest): Promise { + public async listPolicies(request: ListPoliciesRequest): Promise { getLogger().debug('ListPolicies called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.ListPoliciesResponse = await iot - .listPolicies({ + const output: ListPoliciesResponse = await iot.send( + new ListPoliciesCommand({ pageSize: request.pageSize ?? defaultMaxThings, marker: request.marker, ascendingOrder: request.ascendingOrder, }) - .promise() + ) getLogger().debug('ListPolicies returned response: %O', output) return output @@ -314,18 +373,18 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listPrincipalPolicies(request: Iot.ListPrincipalPoliciesRequest): Promise { + public async listPrincipalPolicies(request: ListPrincipalPoliciesRequest): Promise { getLogger().debug('ListPrincipalPolicies called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.ListPrincipalPoliciesResponse = await iot - .listPrincipalPolicies({ + const output: ListPrincipalPoliciesResponse = await iot.send( + new ListPrincipalPoliciesCommand({ principal: request.principal, pageSize: request.pageSize ?? defaultMaxThings, marker: request.marker, ascendingOrder: request.ascendingOrder, }) - .promise() + ) getLogger().debug('ListPrincipalPolicies returned response: %O', output) return output @@ -339,18 +398,18 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async listPolicyTargets(request: Iot.ListTargetsForPolicyRequest): Promise { + public async listPolicyTargets(request: ListTargetsForPolicyRequest): Promise { getLogger().debug('ListPolicyTargets called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output = await iot - .listTargetsForPolicy({ + const output = await iot.send( + new ListTargetsForPolicyCommand({ pageSize: request.pageSize ?? defaultMaxThings, marker: request.marker, policyName: request.policyName, }) - .promise() - const arns: Iot.Target[] = output.targets ?? [] + ) + const arns: string[] = output.targets ?? [] getLogger().debug('ListPolicyTargets returned response: %O', arns) return arns @@ -361,11 +420,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async attachPolicy(request: Iot.AttachPolicyRequest): Promise { + public async attachPolicy(request: AttachPolicyRequest): Promise { getLogger().debug('AttachPolicy called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.attachPolicy({ policyName: request.policyName, target: request.target }).promise() + await iot.send(new AttachPolicyCommand({ policyName: request.policyName, target: request.target })) getLogger().debug('AttachPolicy successful') } @@ -375,11 +434,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async detachPolicy(request: Iot.DetachPolicyRequest): Promise { + public async detachPolicy(request: DetachPolicyRequest): Promise { getLogger().debug('DetachPolicy called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.detachPolicy({ policyName: request.policyName, target: request.target }).promise() + await iot.send(new DetachPolicyCommand({ policyName: request.policyName, target: request.target })) getLogger().debug('DetachPolicy successful') } @@ -389,11 +448,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async createPolicy(request: Iot.CreatePolicyRequest): Promise { + public async createPolicy(request: CreatePolicyRequest): Promise { getLogger().debug('CreatePolicy called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.CreatePolicyResponse = await iot.createPolicy(request).promise() + const output: CreatePolicyResponse = await iot.send(new CreatePolicyCommand(request)) getLogger().info(`Created policy: ${output.policyArn}`) getLogger().debug('CreatePolicy successful') @@ -408,11 +467,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async deletePolicy(request: Iot.DeletePolicyRequest): Promise { + public async deletePolicy(request: DeletePolicyRequest): Promise { getLogger().debug('DeletePolicy called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.deletePolicy({ policyName: request.policyName }).promise() + await iot.send(new DeletePolicyCommand({ policyName: request.policyName })) getLogger().debug('DeletePolicy successful') } @@ -424,9 +483,9 @@ export class DefaultIotClient { */ public async getEndpoint(): Promise { getLogger().debug('GetEndpoint called') - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output = await iot.describeEndpoint({ endpointType: iotEndpointType }).promise() + const output = await iot.send(new DescribeEndpointCommand({ endpointType: iotEndpointType })) if (!output.endpointAddress) { throw new Error('Failed to retrieve endpoint') } @@ -440,10 +499,10 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async *listPolicyVersions(request: Iot.ListPolicyVersionsRequest): AsyncIterableIterator { - const iot = await this.iotProvider(this.regionCode) + public async *listPolicyVersions(request: ListPolicyVersionsRequest): AsyncIterableIterator { + const iot = this.iotProvider(this.regionCode) - const response = await iot.listPolicyVersions(request).promise() + const response = await iot.send(new ListPolicyVersionsCommand(request)) if (response.policyVersions) { yield* response.policyVersions @@ -455,11 +514,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async createPolicyVersion(request: Iot.CreatePolicyVersionRequest): Promise { + public async createPolicyVersion(request: CreatePolicyVersionRequest): Promise { getLogger().debug('CreatePolicyVersion called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output = await iot.createPolicyVersion(request).promise() + const output = await iot.send(new CreatePolicyVersionCommand(request)) getLogger().info(`Created new version ${output.policyVersionId} of ${request.policyName}`) getLogger().debug('CreatePolicyVersion successful') @@ -474,11 +533,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async deletePolicyVersion(request: Iot.DeletePolicyVersionRequest): Promise { + public async deletePolicyVersion(request: DeletePolicyVersionRequest): Promise { getLogger().debug('DeletePolicyVersion called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.deletePolicyVersion(request).promise() + await iot.send(new DeletePolicyVersionCommand(request)) getLogger().debug('DeletePolicyVersion successful') } @@ -488,11 +547,11 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async setDefaultPolicyVersion(request: Iot.SetDefaultPolicyVersionRequest): Promise { + public async setDefaultPolicyVersion(request: SetDefaultPolicyVersionRequest): Promise { getLogger().debug('SetDefaultPolicyVersion called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - await iot.setDefaultPolicyVersion(request).promise() + await iot.send(new SetDefaultPolicyVersionCommand(request)) getLogger().debug('SetDefaultPolicyVersion successful') } @@ -502,17 +561,20 @@ export class DefaultIotClient { * * @throws Error if there is an error calling IoT. */ - public async getPolicyVersion(request: Iot.GetPolicyVersionRequest): Promise { + public async getPolicyVersion(request: GetPolicyVersionRequest): Promise { getLogger().debug('GetPolicyVersion called with request: %O', request) - const iot = await this.iotProvider(this.regionCode) + const iot = this.iotProvider(this.regionCode) - const output: Iot.GetPolicyVersionResponse = await iot.getPolicyVersion(request).promise() + const output: GetPolicyVersionResponse = await iot.send(new GetPolicyVersionCommand(request)) getLogger().debug('GetPolicyVersion successful') return output } } -async function createSdkClient(regionCode: string): Promise { - return await globals.sdkClientBuilder.createAwsService(Iot, undefined, regionCode) +function createSdkClient(regionCode: string): IoTClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: IoTClient, + clientOptions: { region: regionCode }, + }) } diff --git a/packages/core/src/shared/clients/lambdaClient.ts b/packages/core/src/shared/clients/lambdaClient.ts index 949b80b2fee..fb73ce9c2d2 100644 --- a/packages/core/src/shared/clients/lambdaClient.ts +++ b/packages/core/src/shared/clients/lambdaClient.ts @@ -3,18 +3,44 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Lambda } from 'aws-sdk' -import { _Blob } from 'aws-sdk/clients/lambda' +import { BlobPayloadInputTypes } from '@smithy/types' import { ToolkitError } from '../errors' import globals from '../extensionGlobals' import { getLogger } from '../logger/logger' import { ClassToInterfaceType } from '../utilities/tsUtils' -import { LambdaClient as LambdaSdkClient, GetFunctionCommand, GetFunctionCommandOutput } from '@aws-sdk/client-lambda' +import { + LambdaClient as LambdaSdkClient, + GetFunctionCommand, + GetFunctionCommandOutput, + FunctionConfiguration, + InvocationResponse, + ListFunctionsRequest, + ListFunctionsResponse, + GetFunctionResponse, + GetLayerVersionResponse, + ListLayerVersionsRequest, + LayerVersionsListItem, + ListLayerVersionsResponse, + UpdateFunctionConfigurationRequest, + FunctionUrlConfig, + GetFunctionConfigurationCommand, + PublishVersionCommand, + UpdateFunctionConfigurationCommand, + UpdateFunctionCodeCommand, + ListFunctionUrlConfigsCommand, + ListLayerVersionsCommand, + GetLayerVersionCommand, + ListFunctionsCommand, + DeleteFunctionCommand, + InvokeCommand, + waitUntilFunctionUpdatedV2, + waitUntilFunctionActiveV2, +} from '@aws-sdk/client-lambda' import { CancellationError } from '../utilities/timeoutUtils' import { fromSSO } from '@aws-sdk/credential-provider-sso' import { getIAMConnection } from '../../auth/utils' -import { WaiterConfiguration } from 'aws-sdk/lib/service' +import { NodeHttpHandler } from '@smithy/node-http-handler' export type LambdaClient = ClassToInterfaceType @@ -31,39 +57,35 @@ export class DefaultLambdaClient { public async deleteFunction(name: string, qualifier?: string): Promise { const sdkClient = await this.createSdkClient() - const response = await sdkClient - .deleteFunction({ + await sdkClient.send( + new DeleteFunctionCommand({ FunctionName: name, Qualifier: qualifier, }) - .promise() - - if (response.$response.error) { - throw response.$response.error - } + ) } - public async invoke(name: string, payload?: _Blob, version?: string): Promise { + public async invoke(name: string, payload?: BlobPayloadInputTypes, version?: string): Promise { const sdkClient = await this.createSdkClient() - const response = await sdkClient - .invoke({ + const response = await sdkClient.send( + new InvokeCommand({ FunctionName: name, LogType: 'Tail', Payload: payload, Qualifier: version, }) - .promise() + ) return response } - public async *listFunctions(): AsyncIterableIterator { + public async *listFunctions(): AsyncIterableIterator { const client = await this.createSdkClient() - const request: Lambda.ListFunctionsRequest = {} + const request: ListFunctionsRequest = {} do { - const response: Lambda.ListFunctionsResponse = await client.listFunctions(request).promise() + const response: ListFunctionsResponse = await client.send(new ListFunctionsCommand(request)) if (response.Functions) { yield* response.Functions @@ -73,12 +95,12 @@ export class DefaultLambdaClient { } while (request.Marker) } - public async getFunction(name: string): Promise { + public async getFunction(name: string): Promise { getLogger().debug(`GetFunction called for function: ${name}`) const client = await this.createSdkClient() try { - const response = await client.getFunction({ FunctionName: name }).promise() + const response = await client.send(new GetFunctionCommand({ FunctionName: name })) // prune `Code` from logs so we don't reveal a signed link to customer resources. getLogger().debug('GetFunction returned response (code section pruned): %O', { ...response, @@ -91,12 +113,12 @@ export class DefaultLambdaClient { } } - public async getLayerVersion(name: string, version: number): Promise { + public async getLayerVersion(name: string, version: number): Promise { getLogger().debug(`getLayerVersion called for LayerName: ${name}, VersionNumber ${version}`) const client = await this.createSdkClient() try { - const response = await client.getLayerVersion({ LayerName: name, VersionNumber: version }).promise() + const response = await client.send(new GetLayerVersionCommand({ LayerName: name, VersionNumber: version })) // prune `Code` from logs so we don't reveal a signed link to customer resources. getLogger().debug('getLayerVersion returned response (code section pruned): %O', { ...response, @@ -109,12 +131,12 @@ export class DefaultLambdaClient { } } - public async *listLayerVersions(name: string): AsyncIterableIterator { + public async *listLayerVersions(name: string): AsyncIterableIterator { const client = await this.createSdkClient() - const request: Lambda.ListLayerVersionsRequest = { LayerName: name } + const request: ListLayerVersionsRequest = { LayerName: name } do { - const response: Lambda.ListLayerVersionsResponse = await client.listLayerVersions(request).promise() + const response: ListLayerVersionsResponse = await client.send(new ListLayerVersionsCommand(request)) if (response.LayerVersions) { yield* response.LayerVersions @@ -124,38 +146,37 @@ export class DefaultLambdaClient { } while (request.Marker) } - public async getFunctionUrlConfigs(name: string): Promise { + public async getFunctionUrlConfigs(name: string): Promise { getLogger().debug(`GetFunctionUrlConfig called for function: ${name}`) const client = await this.createSdkClient() try { - const request = client.listFunctionUrlConfigs({ FunctionName: name }) - const response = await request.promise() + const response = await client.send(new ListFunctionUrlConfigsCommand({ FunctionName: name })) // prune `Code` from logs so we don't reveal a signed link to customer resources. getLogger().debug('GetFunctionUrlConfig returned response (code section pruned): %O', { ...response, Code: 'Pruned', }) - return response.FunctionUrlConfigs + return response.FunctionUrlConfigs ?? [] } catch (e) { throw ToolkitError.chain(e, 'Failed to get Lambda function URLs') } } - public async updateFunctionCode(name: string, zipFile: Uint8Array): Promise { + public async updateFunctionCode(name: string, zipFile: Uint8Array): Promise { getLogger().debug(`updateFunctionCode called for function: ${name}`) const client = await this.createSdkClient() try { - const response = await client - .updateFunctionCode({ + const response = await client.send( + new UpdateFunctionCodeCommand({ FunctionName: name, Publish: true, ZipFile: zipFile, }) - .promise() + ) getLogger().debug('updateFunctionCode returned response: %O', response) - await client.waitFor('functionUpdated', { FunctionName: name }).promise() + await waitUntilFunctionUpdatedV2({ client, maxWaitTime: 300 }, { FunctionName: name }) return response } catch (e) { @@ -165,14 +186,14 @@ export class DefaultLambdaClient { } public async updateFunctionConfiguration( - params: Lambda.UpdateFunctionConfigurationRequest, + params: UpdateFunctionConfigurationRequest, options: { maxRetries?: number initialDelayMs?: number backoffMultiplier?: number waitForUpdate?: boolean } = {} - ): Promise { + ): Promise { const client = await this.createSdkClient() const maxRetries = options.maxRetries ?? 5 const initialDelayMs = options.initialDelayMs ?? 1000 @@ -186,7 +207,7 @@ export class DefaultLambdaClient { // there could be race condition, if function is being updated, wait and retry while (retryCount <= maxRetries) { try { - const response = await client.updateFunctionConfiguration(params).promise() + const response = await client.send(new UpdateFunctionConfigurationCommand(params)) getLogger().debug('updateFunctionConfiguration returned response: %O', response) if (waitForUpdate) { // don't return if wait for result @@ -219,7 +240,9 @@ export class DefaultLambdaClient { let lastUpdateStatus = 'InProgress' while (lastUpdateStatus === 'InProgress') { await new Promise((resolve) => setTimeout(resolve, 1000)) - const response = await client.getFunctionConfiguration({ FunctionName: params.FunctionName }).promise() + const response = await client.send( + new GetFunctionConfigurationCommand({ FunctionName: params.FunctionName }) + ) lastUpdateStatus = response.LastUpdateStatus ?? 'Failed' if (lastUpdateStatus === 'Successful') { return response @@ -237,23 +260,23 @@ export class DefaultLambdaClient { public async publishVersion( name: string, options: { waitForUpdate?: boolean } = {} - ): Promise { + ): Promise { const client = await this.createSdkClient() // return until lambda update is completed const waitForUpdate = options.waitForUpdate ?? false - const response = await client - .publishVersion({ + const response = await client.send( + new PublishVersionCommand({ FunctionName: name, }) - .promise() + ) if (waitForUpdate) { let state = 'Pending' while (state === 'Pending') { await new Promise((resolve) => setTimeout(resolve, 1000)) - const statusResponse = await client - .getFunctionConfiguration({ FunctionName: name, Qualifier: response.Version }) - .promise() + const statusResponse = await client.send( + new GetFunctionConfigurationCommand({ FunctionName: name, Qualifier: response.Version }) + ) state = statusResponse.State ?? 'Failed' if (state === 'Active' || state === 'InActive') { // version creation finished @@ -277,31 +300,36 @@ export class DefaultLambdaClient { ) } - public async waitForActive(functionName: string, waiter?: WaiterConfiguration): Promise { + public async waitForActive( + functionName: string, + waiter?: { maxWaitTime?: number; minDelay?: number; maxDelay?: number } + ): Promise { const sdkClient = await this.createSdkClient() - await sdkClient - .waitFor('functionActive', { - FunctionName: functionName, - $waiter: waiter ?? { - delay: 1, - // In LocalStack, it requires 2 MBit/s connection to download ~150 MB Lambda image in 600 seconds - maxAttempts: 600, - }, - }) - .promise() - } - - private async createSdkClient(): Promise { - return await globals.sdkClientBuilder.createAwsService( - Lambda, + await waitUntilFunctionActiveV2( { - httpOptions: { timeout: this.defaultTimeoutInMs }, - customUserAgent: this.userAgent, + client: sdkClient, + maxWaitTime: waiter?.maxWaitTime ?? 600, + minDelay: waiter?.minDelay ?? 1, + maxDelay: waiter?.maxDelay ?? 120, }, - this.regionCode + { FunctionName: functionName } ) } + + private async createSdkClient(): Promise { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: LambdaSdkClient, + userAgent: !this.userAgent, + clientOptions: { + userAgent: this.userAgent ? [[this.userAgent]] : undefined, + region: this.regionCode, + requestHandler: new NodeHttpHandler({ + requestTimeout: this.defaultTimeoutInMs, + }), + }, + }) + } } export async function getFunctionWithCredentials(region: string, name: string): Promise { diff --git a/packages/core/src/shared/clients/redshiftClient.ts b/packages/core/src/shared/clients/redshiftClient.ts index a0e98bc405e..5464f58f1d2 100644 --- a/packages/core/src/shared/clients/redshiftClient.ts +++ b/packages/core/src/shared/clients/redshiftClient.ts @@ -4,22 +4,43 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Redshift, RedshiftServerless, RedshiftData } from 'aws-sdk' -import globals from '../extensionGlobals' -import { ClusterCredentials, ClustersMessage, GetClusterCredentialsMessage } from 'aws-sdk/clients/redshift' import { - GetCredentialsRequest, - GetCredentialsResponse, - ListWorkgroupsResponse, -} from 'aws-sdk/clients/redshiftserverless' + ClusterCredentials, + ClustersMessage, + DescribeClustersCommand, + DescribeClustersMessage, + GetClusterCredentialsCommand, + GetClusterCredentialsMessage, + RedshiftClient, +} from '@aws-sdk/client-redshift' import { + DescribeStatementCommand, DescribeStatementRequest, + ExecuteStatementCommand, + GetStatementResultCommand, GetStatementResultRequest, GetStatementResultResponse, + ListDatabasesCommand, + ListDatabasesRequest, ListDatabasesResponse, + ListSchemasCommand, + ListSchemasRequest, ListSchemasResponse, + ListTablesCommand, + ListTablesRequest, ListTablesResponse, -} from 'aws-sdk/clients/redshiftdata' + RedshiftDataClient, +} from '@aws-sdk/client-redshift-data' +import { + GetCredentialsCommand, + GetCredentialsRequest, + GetCredentialsResponse, + ListWorkgroupsCommand, + ListWorkgroupsRequest, + ListWorkgroupsResponse, + RedshiftServerlessClient, +} from '@aws-sdk/client-redshift-serverless' +import globals from '../extensionGlobals' import { ConnectionParams, ConnectionType, RedshiftWarehouseType } from '../../awsService/redshift/models/models' import { sleep } from '../utilities/timeoutUtils' import { SecretsManagerClient } from './secretsManagerClient' @@ -37,21 +58,21 @@ export class DefaultRedshiftClient { public readonly regionCode: string, private readonly redshiftDataClientProvider: ( regionCode: string - ) => Promise = createRedshiftDataClient, - private readonly redshiftClientProvider: (regionCode: string) => Promise = createRedshiftSdkClient, + ) => RedshiftDataClient = createRedshiftDataClient, + private readonly redshiftClientProvider: (regionCode: string) => RedshiftClient = createRedshiftSdkClient, private readonly redshiftServerlessClientProvider: ( regionCode: string - ) => Promise = createRedshiftServerlessSdkClient + ) => RedshiftServerlessClient = createRedshiftServerlessSdkClient ) {} // eslint-disable-next-line require-yield public async describeProvisionedClusters(nextToken?: string): Promise { - const redshiftClient = await this.redshiftClientProvider(this.regionCode) - const request: Redshift.DescribeClustersMessage = { + const redshiftClient = this.redshiftClientProvider(this.regionCode) + const request: DescribeClustersMessage = { Marker: nextToken, MaxRecords: 20, } - const response = await redshiftClient.describeClusters(request).promise() + const response = await redshiftClient.send(new DescribeClustersCommand(request)) if (response.Clusters) { response.Clusters = response.Clusters.filter( (cluster) => cluster.ClusterAvailabilityStatus?.toLowerCase() === 'available' @@ -61,12 +82,12 @@ export class DefaultRedshiftClient { } public async listServerlessWorkgroups(nextToken?: string): Promise { - const redshiftServerlessClient = await this.redshiftServerlessClientProvider(this.regionCode) - const request: RedshiftServerless.ListWorkgroupsRequest = { + const redshiftServerlessClient = this.redshiftServerlessClientProvider(this.regionCode) + const request: ListWorkgroupsRequest = { nextToken: nextToken, maxResults: 20, } - const response = await redshiftServerlessClient.listWorkgroups(request).promise() + const response = await redshiftServerlessClient.send(new ListWorkgroupsCommand(request)) if (response.workgroups) { response.workgroups = response.workgroups.filter( (workgroup) => workgroup.status?.toLowerCase() === 'available' @@ -76,10 +97,10 @@ export class DefaultRedshiftClient { } public async listDatabases(connectionParams: ConnectionParams, nextToken?: string): Promise { - const redshiftDataClient = await this.redshiftDataClientProvider(this.regionCode) + const redshiftDataClient = this.redshiftDataClientProvider(this.regionCode) const warehouseType = connectionParams.warehouseType const warehouseIdentifier = connectionParams.warehouseIdentifier - const input: RedshiftData.ListDatabasesRequest = { + const input: ListDatabasesRequest = { ClusterIdentifier: warehouseType === RedshiftWarehouseType.PROVISIONED ? warehouseIdentifier : undefined, Database: connectionParams.database, DbUser: @@ -94,13 +115,13 @@ export class DefaultRedshiftClient { ? connectionParams.secret : undefined, } - return redshiftDataClient.listDatabases(input).promise() + return redshiftDataClient.send(new ListDatabasesCommand(input)) } public async listSchemas(connectionParams: ConnectionParams, nextToken?: string): Promise { - const redshiftDataClient = await this.redshiftDataClientProvider(this.regionCode) + const redshiftDataClient = this.redshiftDataClientProvider(this.regionCode) const warehouseType = connectionParams.warehouseType const warehouseIdentifier = connectionParams.warehouseIdentifier - const input: RedshiftData.ListSchemasRequest = { + const input: ListSchemasRequest = { ClusterIdentifier: warehouseType === RedshiftWarehouseType.PROVISIONED ? warehouseIdentifier : undefined, Database: connectionParams.database, DbUser: @@ -114,7 +135,7 @@ export class DefaultRedshiftClient { ? connectionParams.secret : undefined, } - return redshiftDataClient.listSchemas(input).promise() + return redshiftDataClient.send(new ListSchemasCommand(input)) } public async listTables( @@ -122,10 +143,10 @@ export class DefaultRedshiftClient { schemaName: string, nextToken?: string ): Promise { - const redshiftDataClient = await this.redshiftDataClientProvider(this.regionCode) + const redshiftDataClient = this.redshiftDataClientProvider(this.regionCode) const warehouseType = connectionParams.warehouseType const warehouseIdentifier = connectionParams.warehouseIdentifier - const input: RedshiftData.ListTablesRequest = { + const input: ListTablesRequest = { ClusterIdentifier: warehouseType === RedshiftWarehouseType.PROVISIONED ? warehouseIdentifier : undefined, DbUser: connectionParams.username && connectionParams.connectionType !== ConnectionType.DatabaseUser @@ -140,7 +161,7 @@ export class DefaultRedshiftClient { ? connectionParams.secret : undefined, } - const ListTablesResponse = redshiftDataClient.listTables(input).promise() + const ListTablesResponse = redshiftDataClient.send(new ListTablesCommand(input)) return ListTablesResponse } @@ -150,11 +171,11 @@ export class DefaultRedshiftClient { nextToken?: string, executionId?: string ): Promise { - const redshiftData = await this.redshiftDataClientProvider(this.regionCode) + const redshiftData = this.redshiftDataClientProvider(this.regionCode) // if executionId is not passed in, that means that we're executing and retrieving the results of the query for the first time. if (!executionId) { - const execution = await redshiftData - .executeStatement({ + const execution = await redshiftData.send( + new ExecuteStatementCommand({ ClusterIdentifier: connectionParams.warehouseType === RedshiftWarehouseType.PROVISIONED ? connectionParams.warehouseIdentifier @@ -174,15 +195,15 @@ export class DefaultRedshiftClient { ? connectionParams.secret : undefined, }) - .promise() + ) executionId = execution.Id type Status = 'RUNNING' | 'FAILED' | 'FINISHED' let status: Status = 'RUNNING' while (status === 'RUNNING') { - const describeStatementResponse = await redshiftData - .describeStatement({ Id: executionId } as DescribeStatementRequest) - .promise() + const describeStatementResponse = await redshiftData.send( + new DescribeStatementCommand({ Id: executionId } as DescribeStatementRequest) + ) if (describeStatementResponse.Status === 'FAILED' || describeStatementResponse.Status === 'FINISHED') { status = describeStatementResponse.Status if (status === 'FAILED') { @@ -198,9 +219,9 @@ export class DefaultRedshiftClient { } } } - const result = await redshiftData - .getStatementResult({ Id: executionId, NextToken: nextToken } as GetStatementResultRequest) - .promise() + const result = await redshiftData.send( + new GetStatementResultCommand({ Id: executionId, NextToken: nextToken } as GetStatementResultRequest) + ) return { statementResultResponse: result, executionId: executionId } as ExecuteQueryResponse } @@ -210,20 +231,20 @@ export class DefaultRedshiftClient { connectionParams: ConnectionParams ): Promise { if (warehouseType === RedshiftWarehouseType.PROVISIONED) { - const redshiftClient = await this.redshiftClientProvider(this.regionCode) + const redshiftClient = this.redshiftClientProvider(this.regionCode) const getClusterCredentialsRequest: GetClusterCredentialsMessage = { DbUser: connectionParams.username!, DbName: connectionParams.database, ClusterIdentifier: connectionParams.warehouseIdentifier, } - return redshiftClient.getClusterCredentials(getClusterCredentialsRequest).promise() + return redshiftClient.send(new GetClusterCredentialsCommand(getClusterCredentialsRequest)) } else { - const redshiftServerless = await this.redshiftServerlessClientProvider(this.regionCode) + const redshiftServerless = this.redshiftServerlessClientProvider(this.regionCode) const getCredentialsRequest: GetCredentialsRequest = { dbName: connectionParams.database, workgroupName: connectionParams.warehouseIdentifier, } - return redshiftServerless.getCredentials(getCredentialsRequest).promise() + return redshiftServerless.send(new GetCredentialsCommand(getCredentialsRequest)) } } public genUniqueId(connectionParams: ConnectionParams): string { @@ -258,13 +279,22 @@ export class DefaultRedshiftClient { } } -async function createRedshiftSdkClient(regionCode: string): Promise { - return await globals.sdkClientBuilder.createAwsService(Redshift, { computeChecksums: true }, regionCode) +function createRedshiftSdkClient(regionCode: string): RedshiftClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: RedshiftClient, + clientOptions: { region: regionCode }, + }) } -async function createRedshiftServerlessSdkClient(regionCode: string): Promise { - return await globals.sdkClientBuilder.createAwsService(RedshiftServerless, { computeChecksums: true }, regionCode) +function createRedshiftServerlessSdkClient(regionCode: string): RedshiftServerlessClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: RedshiftServerlessClient, + clientOptions: { region: regionCode }, + }) } -async function createRedshiftDataClient(regionCode: string): Promise { - return await globals.sdkClientBuilder.createAwsService(RedshiftData, { computeChecksums: true }, regionCode) +function createRedshiftDataClient(regionCode: string): RedshiftDataClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: RedshiftDataClient, + clientOptions: { region: regionCode }, + }) } diff --git a/packages/core/src/shared/clients/schemaClient.ts b/packages/core/src/shared/clients/schemaClient.ts index 1aa38621a75..238b0d46810 100644 --- a/packages/core/src/shared/clients/schemaClient.ts +++ b/packages/core/src/shared/clients/schemaClient.ts @@ -3,7 +3,33 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Schemas } from 'aws-sdk' +import { + DescribeCodeBindingCommand, + DescribeCodeBindingResponse, + DescribeSchemaCommand, + DescribeSchemaResponse, + GetCodeBindingSourceCommand, + GetCodeBindingSourceResponse, + ListRegistriesCommand, + ListRegistriesRequest, + ListRegistriesResponse, + ListSchemasCommand, + ListSchemasRequest, + ListSchemasResponse, + ListSchemaVersionsCommand, + ListSchemaVersionsRequest, + ListSchemaVersionsResponse, + PutCodeBindingCommand, + PutCodeBindingResponse, + RegistrySummary, + SchemasClient, + SchemaSummary, + SchemaVersionSummary, + SearchSchemasCommand, + SearchSchemasRequest, + SearchSchemasResponse, + SearchSchemaSummary, +} from '@aws-sdk/client-schemas' import globals from '../extensionGlobals' import { ClassToInterfaceType } from '../utilities/tsUtils' @@ -12,13 +38,13 @@ export type SchemaClient = ClassToInterfaceType export class DefaultSchemaClient { public constructor(public readonly regionCode: string) {} - public async *listRegistries(): AsyncIterableIterator { - const client = await this.createSdkClient() + public async *listRegistries(): AsyncIterableIterator { + const client = this.createSdkClient() - const request: Schemas.ListRegistriesRequest = {} + const request: ListRegistriesRequest = {} do { - const response: Schemas.ListRegistriesResponse = await client.listRegistries(request).promise() + const response: ListRegistriesResponse = await client.send(new ListRegistriesCommand(request)) if (response.Registries) { yield* response.Registries @@ -28,15 +54,15 @@ export class DefaultSchemaClient { } while (request.NextToken) } - public async *listSchemas(registryName: string): AsyncIterableIterator { - const client = await this.createSdkClient() + public async *listSchemas(registryName: string): AsyncIterableIterator { + const client = this.createSdkClient() - const request: Schemas.ListSchemasRequest = { + const request: ListSchemasRequest = { RegistryName: registryName, } do { - const response: Schemas.ListSchemasResponse = await client.listSchemas(request).promise() + const response: ListSchemasResponse = await client.send(new ListSchemasCommand(request)) if (response.Schemas) { yield* response.Schemas @@ -50,31 +76,31 @@ export class DefaultSchemaClient { registryName: string, schemaName: string, schemaVersion?: string - ): Promise { - const client = await this.createSdkClient() + ): Promise { + const client = this.createSdkClient() - return await client - .describeSchema({ + return await client.send( + new DescribeSchemaCommand({ RegistryName: registryName, SchemaName: schemaName, SchemaVersion: schemaVersion, }) - .promise() + ) } public async *listSchemaVersions( registryName: string, schemaName: string - ): AsyncIterableIterator { - const client = await this.createSdkClient() + ): AsyncIterableIterator { + const client = this.createSdkClient() - const request: Schemas.ListSchemaVersionsRequest = { + const request: ListSchemaVersionsRequest = { RegistryName: registryName, SchemaName: schemaName, } do { - const response: Schemas.ListSchemaVersionsResponse = await client.listSchemaVersions(request).promise() + const response: ListSchemaVersionsResponse = await client.send(new ListSchemaVersionsCommand(request)) if (response.SchemaVersions) { yield* response.SchemaVersions @@ -84,19 +110,16 @@ export class DefaultSchemaClient { } while (request.NextToken) } - public async *searchSchemas( - keywords: string, - registryName: string - ): AsyncIterableIterator { - const client = await this.createSdkClient() + public async *searchSchemas(keywords: string, registryName: string): AsyncIterableIterator { + const client = this.createSdkClient() - const request: Schemas.SearchSchemasRequest = { + const request: SearchSchemasRequest = { Keywords: keywords, RegistryName: registryName, } do { - const response: Schemas.SearchSchemasResponse = await client.searchSchemas(request).promise() + const response: SearchSchemasResponse = await client.send(new SearchSchemasCommand(request)) if (response.Schemas) { yield* response.Schemas @@ -111,17 +134,17 @@ export class DefaultSchemaClient { registryName: string, schemaName: string, schemaVersion: string - ): Promise { - const client = await this.createSdkClient() + ): Promise { + const client = this.createSdkClient() - return await client - .getCodeBindingSource({ + return await client.send( + new GetCodeBindingSourceCommand({ Language: language, RegistryName: registryName, SchemaName: schemaName, SchemaVersion: schemaVersion, }) - .promise() + ) } public async putCodeBinding( @@ -129,37 +152,40 @@ export class DefaultSchemaClient { registryName: string, schemaName: string, schemaVersion: string - ): Promise { - const client = await this.createSdkClient() + ): Promise { + const client = this.createSdkClient() - return await client - .putCodeBinding({ + return await client.send( + new PutCodeBindingCommand({ Language: language, RegistryName: registryName, SchemaName: schemaName, SchemaVersion: schemaVersion, }) - .promise() + ) } public async describeCodeBinding( language: string, registryName: string, schemaName: string, schemaVersion: string - ): Promise { - const client = await this.createSdkClient() + ): Promise { + const client = this.createSdkClient() - return await client - .describeCodeBinding({ + return await client.send( + new DescribeCodeBindingCommand({ Language: language, RegistryName: registryName, SchemaName: schemaName, SchemaVersion: schemaVersion, }) - .promise() + ) } - private async createSdkClient(): Promise { - return await globals.sdkClientBuilder.createAwsService(Schemas, undefined, this.regionCode) + private createSdkClient(): SchemasClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: SchemasClient, + clientOptions: { region: this.regionCode }, + }) } } diff --git a/packages/core/src/shared/clients/secretsManagerClient.ts b/packages/core/src/shared/clients/secretsManagerClient.ts index 4696999495d..af9af46d55d 100644 --- a/packages/core/src/shared/clients/secretsManagerClient.ts +++ b/packages/core/src/shared/clients/secretsManagerClient.ts @@ -3,14 +3,16 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SecretsManager } from 'aws-sdk' -import globals from '../extensionGlobals' import { + CreateSecretCommand, CreateSecretRequest, CreateSecretResponse, + ListSecretsCommand, ListSecretsRequest, ListSecretsResponse, -} from 'aws-sdk/clients/secretsmanager' + SecretsManagerClient as SecretsManagerSdkClient, +} from '@aws-sdk/client-secrets-manager' +import globals from '../extensionGlobals' import { productName } from '../constants' export class SecretsManagerClient { @@ -18,7 +20,7 @@ export class SecretsManagerClient { public readonly regionCode: string, private readonly secretsManagerClientProvider: ( regionCode: string - ) => Promise = createSecretsManagerClient + ) => SecretsManagerSdkClient = createSecretsManagerClient ) {} /** @@ -27,7 +29,7 @@ export class SecretsManagerClient { * @returns a list of the secrets */ public async listSecrets(filter: string): Promise { - const secretsManagerClient = await this.secretsManagerClientProvider(this.regionCode) + const secretsManagerClient = this.secretsManagerClientProvider(this.regionCode) const request: ListSecretsRequest = { IncludePlannedDeletion: false, Filters: [ @@ -38,11 +40,11 @@ export class SecretsManagerClient { ], SortOrder: 'desc', } - return secretsManagerClient.listSecrets(request).promise() + return secretsManagerClient.send(new ListSecretsCommand(request)) } public async createSecret(secretString: string, username: string, password: string): Promise { - const secretsManagerClient = await this.secretsManagerClientProvider(this.regionCode) + const secretsManagerClient = this.secretsManagerClientProvider(this.regionCode) const request: CreateSecretRequest = { Description: `Database secret created with ${productName}`, Name: secretString ? secretString : '', @@ -59,10 +61,13 @@ export class SecretsManagerClient { ], ForceOverwriteReplicaSecret: true, } - return secretsManagerClient.createSecret(request).promise() + return secretsManagerClient.send(new CreateSecretCommand(request)) } } -async function createSecretsManagerClient(regionCode: string): Promise { - return await globals.sdkClientBuilder.createAwsService(SecretsManager, { computeChecksums: true }, regionCode) +function createSecretsManagerClient(regionCode: string): SecretsManagerSdkClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: SecretsManagerSdkClient, + clientOptions: { region: regionCode }, + }) } diff --git a/packages/core/src/shared/clients/ssmDocumentClient.ts b/packages/core/src/shared/clients/ssmDocumentClient.ts index 774b9a2b2fc..581cb0bc219 100644 --- a/packages/core/src/shared/clients/ssmDocumentClient.ts +++ b/packages/core/src/shared/clients/ssmDocumentClient.ts @@ -3,7 +3,36 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SSM } from 'aws-sdk' +import { + CreateDocumentCommand, + CreateDocumentRequest, + CreateDocumentResult, + DeleteDocumentCommand, + DeleteDocumentRequest, + DeleteDocumentResult, + DescribeDocumentCommand, + DescribeDocumentRequest, + DescribeDocumentResult, + DocumentFormat, + DocumentIdentifier, + DocumentVersionInfo, + GetDocumentCommand, + GetDocumentRequest, + GetDocumentResult, + ListDocumentsCommand, + ListDocumentsRequest, + ListDocumentsResult, + ListDocumentVersionsCommand, + ListDocumentVersionsRequest, + ListDocumentVersionsResult, + SSMClient, + UpdateDocumentCommand, + UpdateDocumentDefaultVersionCommand, + UpdateDocumentDefaultVersionRequest, + UpdateDocumentDefaultVersionResult, + UpdateDocumentRequest, + UpdateDocumentResult, +} from '@aws-sdk/client-ssm' import globals from '../extensionGlobals' import { ClassToInterfaceType } from '../utilities/tsUtils' @@ -12,23 +41,21 @@ export type SsmDocumentClient = ClassToInterfaceType export class DefaultSsmDocumentClient { public constructor(public readonly regionCode: string) {} - public async deleteDocument(documentName: string): Promise { - const client = await this.createSdkClient() + public async deleteDocument(documentName: string): Promise { + const client = this.createSdkClient() - const request: SSM.Types.DeleteDocumentRequest = { + const request: DeleteDocumentRequest = { Name: documentName, } - return await client.deleteDocument(request).promise() + return await client.send(new DeleteDocumentCommand(request)) } - public async *listDocuments( - request: SSM.Types.ListDocumentsRequest = {} - ): AsyncIterableIterator { - const client = await this.createSdkClient() + public async *listDocuments(request: ListDocumentsRequest = {}): AsyncIterableIterator { + const client = this.createSdkClient() do { - const response: SSM.Types.ListDocumentsResult = await client.listDocuments(request).promise() + const response: ListDocumentsResult = await client.send(new ListDocumentsCommand(request)) if (response.DocumentIdentifiers) { yield* response.DocumentIdentifiers @@ -38,15 +65,15 @@ export class DefaultSsmDocumentClient { } while (request.NextToken) } - public async *listDocumentVersions(documentName: string): AsyncIterableIterator { - const client = await this.createSdkClient() + public async *listDocumentVersions(documentName: string): AsyncIterableIterator { + const client = this.createSdkClient() - const request: SSM.Types.ListDocumentVersionsRequest = { + const request: ListDocumentVersionsRequest = { Name: documentName, } do { - const response: SSM.Types.ListDocumentVersionsResult = await client.listDocumentVersions(request).promise() + const response: ListDocumentVersionsResult = await client.send(new ListDocumentVersionsCommand(request)) if (response.DocumentVersions) { yield* response.DocumentVersions @@ -56,60 +83,63 @@ export class DefaultSsmDocumentClient { } while (request.NextToken) } - public async describeDocument(documentName: string, documentVersion?: string): Promise { - const client = await this.createSdkClient() + public async describeDocument(documentName: string, documentVersion?: string): Promise { + const client = this.createSdkClient() - const request: SSM.Types.DescribeDocumentRequest = { + const request: DescribeDocumentRequest = { Name: documentName, DocumentVersion: documentVersion, } - return await client.describeDocument(request).promise() + return await client.send(new DescribeDocumentCommand(request)) } public async getDocument( documentName: string, documentVersion?: string, - documentFormat?: string - ): Promise { - const client = await this.createSdkClient() + documentFormat?: DocumentFormat + ): Promise { + const client = this.createSdkClient() - const request: SSM.Types.GetDocumentRequest = { + const request: GetDocumentRequest = { Name: documentName, DocumentVersion: documentVersion, DocumentFormat: documentFormat, } - return await client.getDocument(request).promise() + return await client.send(new GetDocumentCommand(request)) } - public async createDocument(request: SSM.Types.CreateDocumentRequest): Promise { - const client = await this.createSdkClient() + public async createDocument(request: CreateDocumentRequest): Promise { + const client = this.createSdkClient() - return await client.createDocument(request).promise() + return await client.send(new CreateDocumentCommand(request)) } - public async updateDocument(request: SSM.Types.UpdateDocumentRequest): Promise { - const client = await this.createSdkClient() + public async updateDocument(request: UpdateDocumentRequest): Promise { + const client = this.createSdkClient() - return await client.updateDocument(request).promise() + return await client.send(new UpdateDocumentCommand(request)) } public async updateDocumentVersion( documentName: string, documentVersion: string - ): Promise { - const client = await this.createSdkClient() + ): Promise { + const client = this.createSdkClient() - const request: SSM.Types.UpdateDocumentDefaultVersionRequest = { + const request: UpdateDocumentDefaultVersionRequest = { Name: documentName, DocumentVersion: documentVersion, } - return await client.updateDocumentDefaultVersion(request).promise() + return await client.send(new UpdateDocumentDefaultVersionCommand(request)) } - private async createSdkClient(): Promise { - return await globals.sdkClientBuilder.createAwsService(SSM, undefined, this.regionCode) + private createSdkClient(): SSMClient { + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: SSMClient, + clientOptions: { region: this.regionCode }, + }) } } diff --git a/packages/core/src/shared/clients/stsClient.ts b/packages/core/src/shared/clients/stsClient.ts index 6cc01f57fa8..f3a225882a5 100644 --- a/packages/core/src/shared/clients/stsClient.ts +++ b/packages/core/src/shared/clients/stsClient.ts @@ -3,41 +3,60 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { STS } from 'aws-sdk' +import { STSClient, AssumeRoleCommand, GetCallerIdentityCommand } from '@aws-sdk/client-sts' +import type { AssumeRoleRequest, AssumeRoleResponse, GetCallerIdentityResponse } from '@aws-sdk/client-sts' +import { AwsCredentialIdentityProvider } from '@smithy/types' import { Credentials } from '@aws-sdk/types' import globals from '../extensionGlobals' import { ClassToInterfaceType } from '../utilities/tsUtils' -export type GetCallerIdentityResponse = STS.GetCallerIdentityResponse +export type { GetCallerIdentityResponse } export type StsClient = ClassToInterfaceType + +// Helper function to convert Credentials to AwsCredentialIdentityProvider +function toCredentialProvider(credentials: Credentials | AwsCredentialIdentityProvider): AwsCredentialIdentityProvider { + if (typeof credentials === 'function') { + return credentials + } + // Convert static credentials to provider function + return async () => credentials +} + export class DefaultStsClient { public constructor( public readonly regionCode: string, - private readonly credentials?: Credentials, + private readonly credentials?: Credentials | AwsCredentialIdentityProvider, private readonly endpointUrl?: string ) {} - public async assumeRole(request: STS.AssumeRoleRequest): Promise { - const sdkClient = await this.createSdkClient() - const response = await sdkClient.assumeRole(request).promise() + public async assumeRole(request: AssumeRoleRequest): Promise { + const sdkClient = this.createSdkClient() + const response = await sdkClient.send(new AssumeRoleCommand(request)) return response } - public async getCallerIdentity(): Promise { - const sdkClient = await this.createSdkClient() - const response = await sdkClient.getCallerIdentity().promise() + public async getCallerIdentity(): Promise { + const sdkClient = this.createSdkClient() + const response = await sdkClient.send(new GetCallerIdentityCommand({})) return response } - private async createSdkClient(): Promise { - return await globals.sdkClientBuilder.createAwsService( - STS, - { - credentials: this.credentials, - stsRegionalEndpoints: 'regional', - endpoint: this.endpointUrl, - }, - this.regionCode - ) + private createSdkClient(): STSClient { + const clientOptions: { region: string; endpoint?: string; credentials?: AwsCredentialIdentityProvider } = { + region: this.regionCode, + } + + if (this.endpointUrl) { + clientOptions.endpoint = this.endpointUrl + } + + if (this.credentials) { + clientOptions.credentials = toCredentialProvider(this.credentials) + } + + return globals.sdkClientBuilderV3.createAwsService({ + serviceClient: STSClient, + clientOptions, + }) } } diff --git a/packages/core/src/shared/errors.ts b/packages/core/src/shared/errors.ts index 5564610c1f6..292a6cc5f5a 100644 --- a/packages/core/src/shared/errors.ts +++ b/packages/core/src/shared/errors.ts @@ -605,6 +605,10 @@ export function isAwsError(error: unknown): error is AWSError & { error_descript return error instanceof Error && hasCode(error) && hasTime(error) } +export function isServiceException(error: unknown): error is ServiceException { + return error instanceof ServiceException +} + export function hasCode(error: T): error is T & { code: string } { return typeof (error as { code?: unknown }).code === 'string' } diff --git a/packages/core/src/shared/extensions/ssh.ts b/packages/core/src/shared/extensions/ssh.ts index 44af313d108..834b945cec7 100644 --- a/packages/core/src/shared/extensions/ssh.ts +++ b/packages/core/src/shared/extensions/ssh.ts @@ -12,7 +12,7 @@ import { ChildProcess, ChildProcessResult } from '../utilities/processUtils' import { ArrayConstructor, NonNullObject } from '../utilities/typeConstructors' import { Settings } from '../settings' import { VSCODE_EXTENSION_ID } from '../extensions' -import { SSM } from 'aws-sdk' +import { StartSessionResponse } from '@aws-sdk/client-ssm' import { ErrorInformation, ToolkitError } from '../errors' const localize = nls.loadMessageBundle() @@ -144,7 +144,7 @@ export async function testSshConnection( hostname: string, sshPath: string, user: string, - session: SSM.StartSessionResponse + session: StartSessionResponse ): Promise { const env = { SESSION_ID: session.SessionId, STREAM_URL: session.StreamUrl, TOKEN: session.TokenValue } const process = new ProcessClass(sshPath, ['-T', `${user}@${hostname}`, 'echo "test connection succeeded" && exit']) diff --git a/packages/core/src/shared/fs/templateRegistry.ts b/packages/core/src/shared/fs/templateRegistry.ts index 00afe876c4d..a9ec3a66ac8 100644 --- a/packages/core/src/shared/fs/templateRegistry.ts +++ b/packages/core/src/shared/fs/templateRegistry.ts @@ -18,6 +18,7 @@ import { Timeout } from '../utilities/timeoutUtils' import { localize } from '../utilities/vsCodeUtils' import { PerfLog } from '../logger/perfLogger' import { showMessageWithCancel } from '../utilities/messages' +import { Runtime } from '@aws-sdk/client-lambda' export class CloudFormationTemplateRegistry extends WatchedFiles { public name: string = 'CloudFormationTemplateRegistry' @@ -188,7 +189,7 @@ export function getResourcesForHandlerFromTemplateDatum( resource.Properties, 'Runtime', templateDatum.item - ) + ) as Runtime const registeredCodeUri = CloudFormation.getStringForProperty( resource.Properties, 'CodeUri', diff --git a/packages/core/src/shared/sam/cli/samCliInit.ts b/packages/core/src/shared/sam/cli/samCliInit.ts index b087b7cc5f4..366c7539519 100644 --- a/packages/core/src/shared/sam/cli/samCliInit.ts +++ b/packages/core/src/shared/sam/cli/samCliInit.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import { SchemaTemplateExtraContext } from '../../../eventSchemas/templates/schemasAppTemplateUtils' import { Architecture, DependencyManager } from '../../../lambda/models/samLambdaRuntime' import { getSamCliTemplateParameter, SamTemplate } from '../../../lambda/models/samTemplates' diff --git a/packages/core/src/shared/sam/cli/samCliLocalInvoke.ts b/packages/core/src/shared/sam/cli/samCliLocalInvoke.ts index 265b0c86338..c1e60ebcb41 100644 --- a/packages/core/src/shared/sam/cli/samCliLocalInvoke.ts +++ b/packages/core/src/shared/sam/cli/samCliLocalInvoke.ts @@ -15,7 +15,7 @@ import globals from '../../extensionGlobals' import { SamCliSettings } from './samCliSettings' import { addTelemetryEnvVar, collectSamErrors, SamCliError } from './samCliInvokerUtils' import { fs } from '../../fs/fs' -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import { getSamCliPathAndVersion } from '../utils' import { deprecatedRuntimes } from '../../../lambda/models/samLambdaRuntime' diff --git a/packages/core/src/shared/sam/debugger/awsSamDebugConfiguration.ts b/packages/core/src/shared/sam/debugger/awsSamDebugConfiguration.ts index 389b91f6208..f11be86d00c 100644 --- a/packages/core/src/shared/sam/debugger/awsSamDebugConfiguration.ts +++ b/packages/core/src/shared/sam/debugger/awsSamDebugConfiguration.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode' import * as path from 'path' -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import { getNormalizedRelativePath } from '../../utilities/pathUtils' import { APIGatewayProperties, diff --git a/packages/core/src/shared/sam/debugger/awsSamDebugConfigurationValidator.ts b/packages/core/src/shared/sam/debugger/awsSamDebugConfigurationValidator.ts index f71310f0261..b400746d7e6 100644 --- a/packages/core/src/shared/sam/debugger/awsSamDebugConfigurationValidator.ts +++ b/packages/core/src/shared/sam/debugger/awsSamDebugConfigurationValidator.ts @@ -20,6 +20,7 @@ import { } from './awsSamDebugConfiguration' import { tryGetAbsolutePath } from '../../utilities/workspaceUtils' import { CloudFormationTemplateRegistry } from '../../fs/templateRegistry' +import { Runtime } from '@aws-sdk/client-lambda' export interface ValidationResult { isValid: boolean @@ -187,7 +188,7 @@ export class DefaultAwsSamDebugConfigurationValidator implements AwsSamDebugConf } } // can't infer the runtime for image-based lambdas - if (!config.lambda?.runtime || !samImageLambdaRuntimes().has(config.lambda.runtime)) { + if (!config.lambda?.runtime || !samImageLambdaRuntimes().has(config.lambda.runtime as Runtime)) { return { isValid: false, message: localize( @@ -201,7 +202,7 @@ export class DefaultAwsSamDebugConfigurationValidator implements AwsSamDebugConf // TODO: Decide what to do with this re: refs. // As of now, this has to be directly declared without a ref, despite the fact that SAM will handle a ref. // Should we just pass validation off to SAM and ignore validation at this point, or should we directly process the value (like the handler)? - const runtime = CloudFormation.getStringForProperty(resource?.Properties, 'Runtime', cfnTemplate) + const runtime = CloudFormation.getStringForProperty(resource?.Properties, 'Runtime', cfnTemplate) as Runtime if (!runtime || !samZipLambdaRuntimes.has(runtime)) { return { isValid: false, @@ -262,7 +263,10 @@ export class DefaultAwsSamDebugConfigurationValidator implements AwsSamDebugConf } private validateCodeConfig(debugConfiguration: AwsSamDebuggerConfiguration): ValidationResult { - if (!debugConfiguration.lambda?.runtime || !samZipLambdaRuntimes.has(debugConfiguration.lambda.runtime)) { + if ( + !debugConfiguration.lambda?.runtime || + !samZipLambdaRuntimes.has(debugConfiguration.lambda.runtime as Runtime) + ) { return { isValid: false, message: localize( diff --git a/packages/core/src/shared/sam/debugger/awsSamDebugger.ts b/packages/core/src/shared/sam/debugger/awsSamDebugger.ts index 2b6e9311e6b..217ce451dcd 100644 --- a/packages/core/src/shared/sam/debugger/awsSamDebugger.ts +++ b/packages/core/src/shared/sam/debugger/awsSamDebugger.ts @@ -59,7 +59,8 @@ import { minSamCliVersionForImageSupport, minSamCliVersionForGoSupport } from '. import { getIdeProperties } from '../../extensionUtilities' import { resolve } from 'path' import globals from '../../extensionGlobals' -import { Runtime, telemetry } from '../../telemetry/telemetry' +import { telemetry, Runtime as TelemetryRuntime } from '../../telemetry/telemetry' +import { Runtime } from '@aws-sdk/client-lambda' import { ErrorInformation, isUserCancelledError, ToolkitError } from '../../errors' import { openLaunchJsonFile } from './commands/addSamDebugConfiguration' import { Logging } from '../../logger/commands' @@ -471,8 +472,8 @@ export class SamDebugConfigProvider implements vscode.DebugConfigurationProvider } const isZip = CloudFormation.isZipLambdaResource(templateResource?.Properties) - const runtime: string | undefined = - config.lambda?.runtime ?? + const runtime: Runtime | undefined = + (config.lambda?.runtime as Runtime) ?? (template && isZip ? CloudFormation.getStringForProperty(templateResource?.Properties, 'Runtime', template) : undefined) ?? @@ -690,7 +691,7 @@ export class SamDebugConfigProvider implements vscode.DebugConfigurationProvider public async invokeConfig(config: SamLaunchRequestArgs): Promise { telemetry.record({ debug: !config.noDebug, - runtime: config.runtime as Runtime, + runtime: config.runtime as TelemetryRuntime, lambdaArchitecture: config.architecture, lambdaPackageType: (await isImageLambdaConfig(config)) ? 'Image' : 'Zip', version: await getSamCliVersion(getSamCliContext()), diff --git a/packages/core/src/shared/sam/debugger/pythonSamDebug.ts b/packages/core/src/shared/sam/debugger/pythonSamDebug.ts index 670c2ddd71a..902dc85003d 100644 --- a/packages/core/src/shared/sam/debugger/pythonSamDebug.ts +++ b/packages/core/src/shared/sam/debugger/pythonSamDebug.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import * as os from 'os' import * as path from 'path' import { @@ -166,7 +166,7 @@ function getPythonExeAndBootstrap(runtime: Runtime) { return { python: '/var/lang/bin/python3.11', bootstrap: '/var/runtime/bootstrap.py' } case 'python3.12': return { python: '/var/lang/bin/python3.12', bootstrap: '/var/runtime/bootstrap.py' } - case 'python3.13': + case 'python3.13' as Runtime: return { python: '/var/lang/bin/python3.13', bootstrap: '/var/runtime/bootstrap.py' } default: throw new Error(`Python SAM debug logic ran for invalid Python runtime: ${runtime}`) diff --git a/packages/core/src/shared/sam/localLambdaRunner.ts b/packages/core/src/shared/sam/localLambdaRunner.ts index 6d28048be48..447fad81f26 100644 --- a/packages/core/src/shared/sam/localLambdaRunner.ts +++ b/packages/core/src/shared/sam/localLambdaRunner.ts @@ -32,6 +32,7 @@ import { SamCliError } from './cli/samCliInvokerUtils' import fs from '../fs/fs' import { getSpawnEnv } from '../env/resolveEnv' import { asEnvironmentVariables } from '../../auth/credentials/utils' +import { Runtime } from '@aws-sdk/client-lambda' const localize = nls.loadMessageBundle() @@ -247,7 +248,7 @@ async function invokeLambdaHandler( parameterOverrides: config.parameterOverrides, name: config.name, region: config.region, - runtime: config.lambda?.runtime, + runtime: config.lambda?.runtime as Runtime, } // sam local invoke ... @@ -524,7 +525,7 @@ export async function waitForPort(port: number, timeout: Timeout, isDebugPort: b } } -export function shouldAppendRelativePathToFuncHandler(runtime: string): boolean { +export function shouldAppendRelativePathToFuncHandler(runtime: Runtime): boolean { // getFamily will throw an error if the runtime doesn't exist switch (getFamily(runtime)) { case RuntimeFamily.NodeJS: diff --git a/packages/core/src/shared/sam/utils.ts b/packages/core/src/shared/sam/utils.ts index ca2446fe3e9..51e93e80645 100644 --- a/packages/core/src/shared/sam/utils.ts +++ b/packages/core/src/shared/sam/utils.ts @@ -18,6 +18,7 @@ import { telemetry } from '../telemetry/telemetry' import globals from '../extensionGlobals' import { getLogger } from '../logger/logger' import { ChildProcessResult } from '../utilities/processUtils' +import { Runtime } from '@aws-sdk/client-lambda' /** * @description determines the root directory of the project given Template Item @@ -66,7 +67,7 @@ export async function isDotnetRuntime(templateUri: vscode.Uri, contents?: string } } } - const globalRuntime = samTemplate.template.Globals?.Function?.Runtime as string + const globalRuntime = samTemplate.template.Globals?.Function?.Runtime as Runtime return globalRuntime ? getFamily(globalRuntime) === RuntimeFamily.DotNet : false } diff --git a/packages/core/src/shared/telemetry/vscodeTelemetry.json b/packages/core/src/shared/telemetry/vscodeTelemetry.json index fee97143abd..fcf6140eb13 100644 --- a/packages/core/src/shared/telemetry/vscodeTelemetry.json +++ b/packages/core/src/shared/telemetry/vscodeTelemetry.json @@ -1,5 +1,19 @@ { "types": [ + { + "name": "toolId", + "type": "string", + "description": "The tool being installed", + "allowedValues": [ + "session-manager-plugin", + "dotnet-lambda-deploy", + "dotnet-deploy-cli", + "aws-cli", + "sam-cli", + "docker", + "finch" + ] + }, { "name": "amazonQProfileRegion", "type": "string", diff --git a/packages/core/src/shared/ui/sam/stackPrompter.ts b/packages/core/src/shared/ui/sam/stackPrompter.ts index be1350489c5..3e86dc08859 100644 --- a/packages/core/src/shared/ui/sam/stackPrompter.ts +++ b/packages/core/src/shared/ui/sam/stackPrompter.ts @@ -2,7 +2,7 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -import { StackSummary } from 'aws-sdk/clients/cloudformation' +import { StackSummary } from '@aws-sdk/client-cloudformation' import { getAwsConsoleUrl } from '../../awsConsole' import { CloudFormationClient } from '../../clients/cloudFormation' import * as vscode from 'vscode' @@ -13,9 +13,10 @@ import { getRecentResponse } from '../../sam/utils' export const localize = nls.loadMessageBundle() -const canPickStack = (s: StackSummary) => s.StackStatus.endsWith('_COMPLETE') +const canPickStack = (s: StackSummary) => s.StackStatus?.endsWith('_COMPLETE') const canShowStack = (s: StackSummary) => - (s.StackStatus.endsWith('_COMPLETE') || s.StackStatus.endsWith('_IN_PROGRESS')) && !s.StackStatus.includes('DELETE') + (s.StackStatus?.endsWith('_COMPLETE') || s.StackStatus?.endsWith('_IN_PROGRESS')) && + !s.StackStatus.includes('DELETE') /** * Creates a quick pick prompter for choosing a CloudFormation stack diff --git a/packages/core/src/shared/utilities/cliUtils.ts b/packages/core/src/shared/utilities/cliUtils.ts index a37a7228687..bf19cd19791 100644 --- a/packages/core/src/shared/utilities/cliUtils.ts +++ b/packages/core/src/shared/utilities/cliUtils.ts @@ -55,7 +55,7 @@ interface Cli { exec?: string } -export type AwsClis = Extract +export type AwsClis = Extract /** * CLIs and their full filenames and download paths for their respective OSes @@ -170,6 +170,21 @@ export const awsClis: { [cli in AwsClis]: Cli } = { manualInstallLink: 'https://docs.docker.com/desktop', exec: 'docker', }, + // Currently Finch is available for MacOS and Linux; Windows support will be added if/when available + finch: { + command: { + unix: ['finch', path.join('/', 'usr', 'bin', 'finch'), path.join('/', 'usr', 'local', 'bin', 'finch')], + }, + source: { + macos: { + x86: 'https://github.com/runfinch/finch/releases/download/v1.11.0/Finch-v1.11.0-x86_64.pkg', + arm: 'https://github.com/runfinch/finch/releases/download/v1.11.0/Finch-v1.11.0-aarch64.pkg', + }, + }, + name: 'Finch', + manualInstallLink: 'https://runfinch.com/docs/getting-started/installation/', + exec: 'finch', + }, } /** @@ -185,7 +200,7 @@ export async function installCli( ): Promise { const cliToInstall = awsClis[cli] if (!cliToInstall) { - throw new InstallerError(`Invalid not found for CLI: ${cli}`) + throw new InstallerError(`Installer not found for CLI: ${cli}`) } let result: Result = 'Succeeded' let reason: string = '' @@ -247,10 +262,11 @@ export async function installCli( case 'aws-cli': case 'sam-cli': case 'docker': + case 'finch': cliPath = await installGui(cli, tempDir, progress, timeout) break default: - throw new InstallerError(`Invalid not found for CLI: ${cli}`) + throw new InstallerError(`Installer not found for CLI: ${cli}`) } } finally { timeout.dispose() diff --git a/packages/core/src/ssmDocument/commands/openDocumentItem.ts b/packages/core/src/ssmDocument/commands/openDocumentItem.ts index af0c6760358..07832d0b560 100644 --- a/packages/core/src/ssmDocument/commands/openDocumentItem.ts +++ b/packages/core/src/ssmDocument/commands/openDocumentItem.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { SSM } from 'aws-sdk' +import { DocumentFormat, DocumentVersionInfo } from '@aws-sdk/client-ssm' import * as vscode from 'vscode' import { DocumentItemNode } from '../explorer/documentItemNode' import { AwsContext } from '../../shared/awsContext' @@ -16,7 +16,7 @@ import { showViewLogsMessage } from '../../shared/utilities/messages' import { telemetry } from '../../shared/telemetry/telemetry' import { Result } from '../../shared/telemetry/telemetry' -export async function openDocumentItem(node: DocumentItemNode, awsContext: AwsContext, format?: string) { +export async function openDocumentItem(node: DocumentItemNode, awsContext: AwsContext, format?: DocumentFormat) { const logger: Logger = getLogger() let result: Result = 'Succeeded' @@ -65,7 +65,7 @@ export async function openDocumentItemYaml(node: DocumentItemNode, awsContext: A await openDocumentItem(node, awsContext, 'YAML') } -async function promptUserforDocumentVersion(versions: SSM.Types.DocumentVersionInfo[]): Promise { +async function promptUserforDocumentVersion(versions: DocumentVersionInfo[]): Promise { // Prompt user to pick document version const quickPickItems: vscode.QuickPickItem[] = [] for (const version of versions) { diff --git a/packages/core/src/ssmDocument/commands/publishDocument.ts b/packages/core/src/ssmDocument/commands/publishDocument.ts index 402c86412a6..36a3145b952 100644 --- a/packages/core/src/ssmDocument/commands/publishDocument.ts +++ b/packages/core/src/ssmDocument/commands/publishDocument.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SSM } from 'aws-sdk' +import { CreateDocumentRequest, UpdateDocumentRequest } from '@aws-sdk/client-ssm' import * as vscode from 'vscode' import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() @@ -75,7 +75,7 @@ export async function createDocument( logger.info(`Creating Systems Manager Document '${wizardResponse.name}'`) try { - const request: SSM.CreateDocumentRequest = { + const request: CreateDocumentRequest = { Content: textDocument.getText(), Name: wizardResponse.name, DocumentType: wizardResponse.documentType, @@ -109,7 +109,7 @@ export async function updateDocument( logger.info(`Updating Systems Manager Document '${wizardResponse.name}'`) try { - const request: SSM.UpdateDocumentRequest = { + const request: UpdateDocumentRequest = { Content: textDocument.getText(), Name: wizardResponse.name, DocumentVersion: '$LATEST', diff --git a/packages/core/src/ssmDocument/commands/updateDocumentVersion.ts b/packages/core/src/ssmDocument/commands/updateDocumentVersion.ts index cb3c1577360..2574ed2f70d 100644 --- a/packages/core/src/ssmDocument/commands/updateDocumentVersion.ts +++ b/packages/core/src/ssmDocument/commands/updateDocumentVersion.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { SSM } from 'aws-sdk' +import { DocumentVersionInfo } from '@aws-sdk/client-ssm' import * as vscode from 'vscode' import { AwsContext } from '../../shared/awsContext' import { getLogger, Logger } from '../../shared/logger/logger' @@ -76,7 +76,7 @@ export async function updateDocumentVersion(node: DocumentItemNodeWriteable, aws } } -async function promptUserforDocumentVersion(versions: SSM.Types.DocumentVersionInfo[]): Promise { +async function promptUserforDocumentVersion(versions: DocumentVersionInfo[]): Promise { // Prompt user to pick document version const quickPickItems: vscode.QuickPickItem[] = [] for (const version of versions) { diff --git a/packages/core/src/ssmDocument/explorer/documentItemNode.ts b/packages/core/src/ssmDocument/explorer/documentItemNode.ts index 1fb06df96d1..ee17e53d41f 100644 --- a/packages/core/src/ssmDocument/explorer/documentItemNode.ts +++ b/packages/core/src/ssmDocument/explorer/documentItemNode.ts @@ -3,8 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SSM } from 'aws-sdk' - +import { DocumentFormat, DocumentIdentifier, DocumentVersionInfo, GetDocumentResult } from '@aws-sdk/client-ssm' import { SsmDocumentClient } from '../../shared/clients/ssmDocumentClient' import { AWSTreeNodeBase } from '../../shared/treeview/nodes/awsTreeNodeBase' @@ -13,7 +12,7 @@ import { getIcon } from '../../shared/icons' export class DocumentItemNode extends AWSTreeNodeBase { public constructor( - private documentItem: SSM.Types.DocumentIdentifier, + private documentItem: DocumentIdentifier, public readonly client: SsmDocumentClient, public override readonly regionCode: string ) { @@ -23,7 +22,7 @@ export class DocumentItemNode extends AWSTreeNodeBase { this.iconPath = getIcon('vscode-file') } - public update(documentItem: SSM.Types.DocumentIdentifier): void { + public update(documentItem: DocumentIdentifier): void { this.documentItem = documentItem this.label = this.documentName } @@ -38,13 +37,13 @@ export class DocumentItemNode extends AWSTreeNodeBase { public async getDocumentContent( documentVersion?: string, - documentFormat?: string - ): Promise { + documentFormat?: DocumentFormat + ): Promise { if (!this.documentName || !this.documentName.length) { return Promise.resolve({}) } - let resolvedDocumentFormat: string | undefined + let resolvedDocumentFormat: DocumentFormat | undefined if (documentFormat === undefined) { // retrieves the document format from the service @@ -61,7 +60,7 @@ export class DocumentItemNode extends AWSTreeNodeBase { ) } - public async listSchemaVersion(): Promise { + public async listSchemaVersion(): Promise { return await toArrayAsync(this.client.listDocumentVersions(this.documentName)) } } diff --git a/packages/core/src/ssmDocument/explorer/documentItemNodeWriteable.ts b/packages/core/src/ssmDocument/explorer/documentItemNodeWriteable.ts index 75a9a011d2b..4c2ffd6e813 100644 --- a/packages/core/src/ssmDocument/explorer/documentItemNodeWriteable.ts +++ b/packages/core/src/ssmDocument/explorer/documentItemNodeWriteable.ts @@ -3,14 +3,14 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SSM } from 'aws-sdk' +import { DeleteDocumentResult, DocumentIdentifier, UpdateDocumentDefaultVersionResult } from '@aws-sdk/client-ssm' import { RegistryItemNode } from './registryItemNode' import { SsmDocumentClient } from '../../shared/clients/ssmDocumentClient' import { DocumentItemNode } from './documentItemNode' export class DocumentItemNodeWriteable extends DocumentItemNode { public constructor( - documentItem: SSM.Types.DocumentIdentifier, + documentItem: DocumentIdentifier, public override readonly client: SsmDocumentClient, public override readonly regionCode: string, public readonly parent: RegistryItemNode @@ -20,7 +20,7 @@ export class DocumentItemNodeWriteable extends DocumentItemNode { this.parent = parent } - public async deleteDocument(): Promise { + public async deleteDocument(): Promise { if (!this.documentName || !this.documentName.length) { return Promise.resolve({}) } @@ -28,9 +28,7 @@ export class DocumentItemNodeWriteable extends DocumentItemNode { return await this.client.deleteDocument(this.documentName) } - public async updateDocumentVersion( - documentVersion?: string - ): Promise { + public async updateDocumentVersion(documentVersion?: string): Promise { if (!documentVersion || !documentVersion.length) { return Promise.resolve({}) } diff --git a/packages/core/src/ssmDocument/explorer/registryItemNode.ts b/packages/core/src/ssmDocument/explorer/registryItemNode.ts index d5ca928f88f..dae0771f67d 100644 --- a/packages/core/src/ssmDocument/explorer/registryItemNode.ts +++ b/packages/core/src/ssmDocument/explorer/registryItemNode.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { SSM } from 'aws-sdk' +import { DocumentIdentifier, ListDocumentsRequest } from '@aws-sdk/client-ssm' import * as vscode from 'vscode' import { DefaultSsmDocumentClient, SsmDocumentClient } from '../../shared/clients/ssmDocumentClient' @@ -64,8 +64,8 @@ export class RegistryItemNode extends AWSTreeNodeBase { }) } - private async getDocumentByOwner(client: SsmDocumentClient): Promise { - const request: SSM.ListDocumentsRequest = { + private async getDocumentByOwner(client: SsmDocumentClient): Promise { + const request: ListDocumentsRequest = { Filters: [ { Key: 'DocumentType', @@ -95,7 +95,7 @@ export class RegistryItemNode extends AWSTreeNodeBase { } public async updateChildren(): Promise { - const documents = new Map() + const documents = new Map() const docs = await this.getDocumentByOwner(this.client) for (const doc of docs) { diff --git a/packages/core/src/ssmDocument/wizards/publishDocumentWizard.ts b/packages/core/src/ssmDocument/wizards/publishDocumentWizard.ts index 74a786b74c7..763c9995933 100644 --- a/packages/core/src/ssmDocument/wizards/publishDocumentWizard.ts +++ b/packages/core/src/ssmDocument/wizards/publishDocumentWizard.ts @@ -6,7 +6,7 @@ import * as nls from 'vscode-nls' const localize = nls.loadMessageBundle() -import { SSM } from 'aws-sdk' +import { DocumentKeyValuesFilter } from '@aws-sdk/client-ssm' import { createCommonButtons } from '../../shared/ui/buttons' import { createRegionPrompter } from '../../shared/ui/common/region' import { createInputBox } from '../../shared/ui/inputPrompter' @@ -27,8 +27,8 @@ export enum PublishSSMDocumentAction { QuickUpdate = 'Update', } -async function* loadDocuments(region: string, documentType?: SSM.Types.DocumentType) { - const filters: SSM.Types.DocumentKeyValuesFilterList = [ +async function* loadDocuments(region: string, documentType?: string) { + const filters: DocumentKeyValuesFilter[] = [ { Key: 'Owner', Values: ['Self'], diff --git a/packages/core/src/stepFunctions/workflowStudio/types.ts b/packages/core/src/stepFunctions/workflowStudio/types.ts index 5edf944eb2c..22a93a8404d 100644 --- a/packages/core/src/stepFunctions/workflowStudio/types.ts +++ b/packages/core/src/stepFunctions/workflowStudio/types.ts @@ -2,8 +2,8 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ -import { IAM } from 'aws-sdk' -import * as StepFunctions from '@aws-sdk/client-sfn' +import { ListRolesCommandInput } from '@aws-sdk/client-iam' +import { TestStateInput } from '@aws-sdk/client-sfn' import * as vscode from 'vscode' export enum WorkflowMode { @@ -94,8 +94,8 @@ export enum ApiAction { } type ApiCallRequestMapping = { - [ApiAction.IAMListRoles]: IAM.ListRolesRequest - [ApiAction.SFNTestState]: StepFunctions.TestStateInput + [ApiAction.IAMListRoles]: ListRolesCommandInput + [ApiAction.SFNTestState]: TestStateInput } interface ApiCallRequestMessageBase extends Message { diff --git a/packages/core/src/test/amazonqGumby/transformationJobHistory.test.ts b/packages/core/src/test/amazonqGumby/transformationJobHistory.test.ts index b286ad6537f..f5a92299255 100644 --- a/packages/core/src/test/amazonqGumby/transformationJobHistory.test.ts +++ b/packages/core/src/test/amazonqGumby/transformationJobHistory.test.ts @@ -98,23 +98,51 @@ describe('Transformation History Handler', function () { it('Creates history file with headers when it does not exist', async function () { sinon.stub(fs, 'existsFile').resolves(false) - await writeToHistoryFile('01/01/25, 10:00 AM', 'test-project', 'COMPLETED', '5 min', 'job-123', '/job/path') + await writeToHistoryFile( + '01/01/25, 10:00 AM', + 'test-project', + 'COMPLETED', + '5 min', + 'job-123', + '/job/path', + 'LANGUAGE_UPGRADE', + 'JDK8', + 'JDK17', + '/path/here', + 'clean test-compile' + ) const expectedPath = path.join(os.homedir(), '.aws', 'transform', 'transformation_history.tsv') const fileContent = writtenFiles.get(expectedPath) assert(fileContent) - assert(fileContent.includes('date\tproject_name\tstatus\tduration\tdiff_patch\tsummary\tjob_id\n')) assert( fileContent.includes( - `01/01/25, 10:00 AM\ttest-project\tCOMPLETED\t5 min\t${path.join('/job/path', 'diff.patch')}\t${path.join('/job/path', 'summary', 'summary.md')}\tjob-123\n` + 'date\tproject_name\tstatus\tduration\tdiff_patch\tsummary\tjob_id\ttransformation_type\tsource_jdk_version\ttarget_jdk_version\tcustom_dependency_version_file_path\tcustom_build_command\n' + ) + ) + assert( + fileContent.includes( + `01/01/25, 10:00 AM\ttest-project\tCOMPLETED\t5 min\t${path.join('/job/path', 'diff.patch')}\t${path.join('/job/path', 'summary', 'summary.md')}\tjob-123\tLANGUAGE_UPGRADE\tJDK8\tJDK17\t/path/here\tclean test-compile\n` ) ) }) it('Excludes artifact paths for failed jobs', async function () { sinon.stub(fs, 'existsFile').resolves(false) - await writeToHistoryFile('01/01/25, 10:00 AM', 'test-project', 'FAILED', '5 min', 'job-123', '/job/path') + await writeToHistoryFile( + '01/01/25, 10:00 AM', + 'test-project', + 'FAILED', + '5 min', + 'job-123', + '/job/path', + 'LANGUAGE_UPGRADE', + 'JDK8', + 'JDK17', + '/path/here', + 'clean test-compile' + ) const expectedPath = path.join(os.homedir(), '.aws', 'transform', 'transformation_history.tsv') const fileContent = writtenFiles.get(expectedPath) @@ -130,7 +158,7 @@ describe('Transformation History Handler', function () { it('Appends new job to existing history file', async function () { const existingContent = 'date\tproject_name\tstatus\tduration\tdiff_patch\tsummary\tjob_id\n' + - '12/31/24, 09:00 AM\told-project\tCOMPLETED\t3 min\t/old/diff.patch\t/old/summary.md\told-job-456\n' + '12/31/24, 09:00 AM\told-project\tCOMPLETED\t3 min\t/old/diff.patch\t/old/summary.md\told-job-456\t/old/path\tLANGUAGE_UPGRADE\tJDK8\tJDK17\t/old/path2\tclean test-compile\n' writtenFiles.set( path.join(os.homedir(), '.aws', 'transform', 'transformation_history.tsv'), @@ -139,14 +167,28 @@ describe('Transformation History Handler', function () { sinon.stub(fs, 'existsFile').resolves(true) - await writeToHistoryFile('01/01/25, 10:00 AM', 'new-project', 'FAILED', '2 min', 'new-job-789', '/new/path') + await writeToHistoryFile( + '01/01/25, 10:00 AM', + 'new-project', + 'FAILED', + '2 min', + 'new-job-789', + '/new/path', + 'LANGUAGE_UPGRADE', + 'JDK8', + 'JDK17', + '/path/here', + 'clean test-compile' + ) const expectedPath = path.join(os.homedir(), '.aws', 'transform', 'transformation_history.tsv') const fileContent = writtenFiles.get(expectedPath) // Verify old data is preserved assert( - fileContent?.includes('old-project\tCOMPLETED\t3 min\t/old/diff.patch\t/old/summary.md\told-job-456') + fileContent?.includes( + 'old-project\tCOMPLETED\t3 min\t/old/diff.patch\t/old/summary.md\told-job-456\t/old/path\tLANGUAGE_UPGRADE\tJDK8\tJDK17\t/old/path2\tclean test-compile\n' + ) ) // Verify new data is added diff --git a/packages/core/src/test/awsService/accessanalyzer/iamPolicyChecks.test.ts b/packages/core/src/test/awsService/accessanalyzer/iamPolicyChecks.test.ts index 995fc1588d6..15f1c398506 100644 --- a/packages/core/src/test/awsService/accessanalyzer/iamPolicyChecks.test.ts +++ b/packages/core/src/test/awsService/accessanalyzer/iamPolicyChecks.test.ts @@ -12,7 +12,7 @@ import { PolicyChecksError, } from '../../../awsService/accessanalyzer/vue/iamPolicyChecks' import { globals } from '../../../shared' -import { AccessAnalyzer, Config } from 'aws-sdk' +import { AccessAnalyzerClient } from '@aws-sdk/client-accessanalyzer' import * as s3Client from '../../../shared/clients/s3' import { S3Client } from '../../../shared/clients/s3' import * as iamPolicyChecks from '../../../awsService/accessanalyzer/vue/iamPolicyChecks' @@ -97,9 +97,8 @@ describe('validatePolicy', function () { let executeCommandStub: sinon.SinonStub let pushValidatePolicyDiagnosticStub: sinon.SinonStub let validateDiagnosticSetStub: sinon.SinonStub - const client = new AccessAnalyzer() - client.config = new Config() - const validatePolicyMock = sinon.mock(AccessAnalyzer) + const client = new AccessAnalyzerClient() + const validatePolicyMock = sinon.mock(client) beforeEach(function () { sandbox = sinon.createSandbox() @@ -317,7 +316,7 @@ describe('customChecks', function () { beforeEach(function () { sandbox = sinon.createSandbox() - const client = AccessAnalyzer.prototype + const client = AccessAnalyzerClient.prototype const initialData = { cfnParameterPath: '', checkAccessNotGrantedActionsTextArea: '', diff --git a/packages/core/src/test/awsService/apigateway/commands/invokeRemoteRestApi.test.ts b/packages/core/src/test/awsService/apigateway/commands/invokeRemoteRestApi.test.ts index c50b3cf7555..26c145dbb8f 100644 --- a/packages/core/src/test/awsService/apigateway/commands/invokeRemoteRestApi.test.ts +++ b/packages/core/src/test/awsService/apigateway/commands/invokeRemoteRestApi.test.ts @@ -5,7 +5,7 @@ import assert from 'assert' import { listValidMethods } from '../../../../awsService/apigateway/vue/invokeRemoteRestApi' -import { Resource } from 'aws-sdk/clients/apigateway' +import { Resource } from '@aws-sdk/client-api-gateway' describe('listValidMethods', function () { const allMethods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT'] diff --git a/packages/core/src/test/awsService/appBuilder/lambda2sam/lambda2samCoreLogic.test.ts b/packages/core/src/test/awsService/appBuilder/lambda2sam/lambda2samCoreLogic.test.ts index 05a5aad9ed4..c618dac2197 100644 --- a/packages/core/src/test/awsService/appBuilder/lambda2sam/lambda2samCoreLogic.test.ts +++ b/packages/core/src/test/awsService/appBuilder/lambda2sam/lambda2samCoreLogic.test.ts @@ -19,7 +19,7 @@ import { ToolkitError } from '../../../../shared/errors' import os from 'os' import path from 'path' import { LAMBDA_FUNCTION_TYPE } from '../../../../shared/cloudformation/cloudformation' -import { ResourcesToImport } from 'aws-sdk/clients/cloudformation' +import { ResourceToImport } from '@aws-sdk/client-cloudformation' describe('lambda2samCoreLogic', function () { let sandbox: sinon.SinonSandbox @@ -422,7 +422,7 @@ describe('lambda2samCoreLogic', function () { // Setup Lambda node const lambdaNode = mockLambdaNode() - const resourceToImport: ResourcesToImport = [ + const resourceToImport: ResourceToImport[] = [ { ResourceType: LAMBDA_FUNCTION_TYPE, LogicalResourceId: 'TestFunc', @@ -470,7 +470,7 @@ describe('lambda2samCoreLogic', function () { // Make createChangeSet fail cfnClientStub.createChangeSet.resolves({}) // No Id - const resourceToImport: ResourcesToImport = [ + const resourceToImport: ResourceToImport[] = [ { ResourceType: LAMBDA_FUNCTION_TYPE, LogicalResourceId: 'TestFunc', diff --git a/packages/core/src/test/awsService/appBuilder/utils.test.ts b/packages/core/src/test/awsService/appBuilder/utils.test.ts index eaaa69254d7..08edd14f47c 100644 --- a/packages/core/src/test/awsService/appBuilder/utils.test.ts +++ b/packages/core/src/test/awsService/appBuilder/utils.test.ts @@ -26,9 +26,11 @@ import { assertTextEditorContains } from '../../testUtil' import { DefaultLambdaClient } from '../../../shared/clients/lambdaClient' import { ToolkitError } from '../../../shared/errors' import globals from '../../../shared/extensionGlobals' +import { Runtime } from '@aws-sdk/client-lambda' +import { CloudFormationClient } from '@aws-sdk/client-cloudformation' interface TestScenario { - runtime: string + runtime: Runtime handler: string codeUri: string fileLocation: string @@ -505,7 +507,7 @@ describe('AppBuilder Utils', function () { mockLambdaClient.invoke.rejects(permissionError) try { - await enhancedClient.invoke('test-function', '{}') + await enhancedClient.invoke('test-function', new TextEncoder().encode('{}')) assert.fail('Expected error to be thrown') } catch (error) { assert(error instanceof ToolkitError) @@ -571,19 +573,13 @@ describe('AppBuilder Utils', function () { }) describe('EnhancedCloudFormationClient', function () { - let mockCfnClient: any + let mockCfnClient: sinon.SinonStubbedInstance let enhancedClient: EnhancedCloudFormationClient beforeEach(function () { // Create a mock CloudFormation client with all required methods - mockCfnClient = { - describeStacks: sandbox.stub(), - getTemplate: sandbox.stub(), - createChangeSet: sandbox.stub(), - describeStackResource: sandbox.stub(), - describeStackResources: sandbox.stub(), - } - enhancedClient = new EnhancedCloudFormationClient(mockCfnClient, 'us-east-1') + mockCfnClient = sandbox.createStubInstance(CloudFormationClient) + enhancedClient = new EnhancedCloudFormationClient(mockCfnClient as any, 'us-east-1') }) it('should enhance permission errors for describeStacks', async function () { @@ -592,9 +588,7 @@ describe('AppBuilder Utils', function () { time: new Date(), statusCode: 403, }) - mockCfnClient.describeStacks.returns({ - promise: sandbox.stub().rejects(permissionError), - } as any) + mockCfnClient.send.rejects(permissionError) try { await enhancedClient.describeStacks({ StackName: 'test-stack' }) @@ -619,9 +613,7 @@ describe('AppBuilder Utils', function () { time: new Date(), statusCode: 403, }) - mockCfnClient.getTemplate.returns({ - promise: sandbox.stub().rejects(permissionError), - } as any) + mockCfnClient.send.rejects(permissionError) try { await enhancedClient.getTemplate({ StackName: 'test-stack' }) @@ -644,9 +636,7 @@ describe('AppBuilder Utils', function () { time: new Date(), statusCode: 403, }) - mockCfnClient.createChangeSet.returns({ - promise: sandbox.stub().rejects(permissionError), - } as any) + mockCfnClient.send.rejects(permissionError) try { await enhancedClient.createChangeSet({ @@ -673,9 +663,7 @@ describe('AppBuilder Utils', function () { time: new Date(), statusCode: 403, }) - mockCfnClient.describeStackResource.returns({ - promise: sandbox.stub().rejects(permissionError), - } as any) + mockCfnClient.send.rejects(permissionError) try { await enhancedClient.describeStackResource({ @@ -701,9 +689,7 @@ describe('AppBuilder Utils', function () { time: new Date(), statusCode: 403, }) - mockCfnClient.describeStackResources.returns({ - promise: sandbox.stub().rejects(permissionError), - } as any) + mockCfnClient.send.rejects(permissionError) try { await enhancedClient.describeStackResources({ StackName: 'test-stack' }) @@ -722,9 +708,7 @@ describe('AppBuilder Utils', function () { it('should pass through non-permission errors', async function () { const nonPermissionError = new Error('Stack not found') - mockCfnClient.describeStacks.returns({ - promise: sandbox.stub().rejects(nonPermissionError), - } as any) + mockCfnClient.send.rejects(nonPermissionError) try { await enhancedClient.describeStacks({ StackName: 'test-stack' }) @@ -736,9 +720,7 @@ describe('AppBuilder Utils', function () { it('should return successful results when no errors occur', async function () { const mockResponse = { Stacks: [{ StackName: 'test-stack' }] } - mockCfnClient.describeStacks.returns({ - promise: sandbox.stub().resolves(mockResponse), - } as any) + mockCfnClient.send.resolves(mockResponse) const result = await enhancedClient.describeStacks({ StackName: 'test-stack' }) assert.strictEqual(result, mockResponse) @@ -748,7 +730,7 @@ describe('AppBuilder Utils', function () { describe('Client Factory Functions', function () { beforeEach(function () { // Stub the global SDK client builder - sandbox.stub(globals.sdkClientBuilder, 'createAwsService').resolves({} as any) + sandbox.stub(globals.sdkClientBuilderV3, 'createAwsService').resolves({} as any) }) it('should return EnhancedLambdaClient from getLambdaClient', function () { diff --git a/packages/core/src/test/awsService/appBuilder/walkthrough.test.ts b/packages/core/src/test/awsService/appBuilder/walkthrough.test.ts index 988f01902fd..add3ee6e546 100644 --- a/packages/core/src/test/awsService/appBuilder/walkthrough.test.ts +++ b/packages/core/src/test/awsService/appBuilder/walkthrough.test.ts @@ -51,6 +51,11 @@ const scenarios: TestScenario[] = [ platform: 'win32', shouldSucceed: true, }, + { + toolID: 'finch', + platform: 'win32', + shouldSucceed: false, + }, { toolID: 'aws-cli', platform: 'darwin', @@ -66,6 +71,11 @@ const scenarios: TestScenario[] = [ platform: 'darwin', shouldSucceed: true, }, + { + toolID: 'finch', + platform: 'darwin', + shouldSucceed: true, + }, { toolID: 'aws-cli', platform: 'linux', @@ -81,6 +91,11 @@ const scenarios: TestScenario[] = [ platform: 'linux', shouldSucceed: false, }, + { + toolID: 'finch', + platform: 'linux', + shouldSucceed: false, + }, ] describe('AppBuilder Walkthrough', function () { @@ -209,11 +224,14 @@ describe('AppBuilder Walkthrough', function () { }) it('download serverlessland proj', async function () { + const config = vscode.workspace.getConfiguration('aws.samcli') + await config.update('enableCodeLenses', false, vscode.ConfigurationTarget.Global) // When await genWalkthroughProject('API', workspaceUri, 'python') // Then template should be overwritten assert.equal(await fs.exists(vscode.Uri.joinPath(workspaceUri, 'template.yaml')), true) assert.notEqual(await fs.readFileText(vscode.Uri.joinPath(workspaceUri, 'template.yaml')), prevInfo) + await config.update('enableCodeLenses', true, vscode.ConfigurationTarget.Global) }) }) diff --git a/packages/core/src/test/awsService/cloudWatchLogs/document/logDataDocumentProvider.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/document/logDataDocumentProvider.test.ts index 221d0a6fee3..3457623cb79 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/document/logDataDocumentProvider.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/document/logDataDocumentProvider.test.ts @@ -21,7 +21,7 @@ import { import { Settings } from '../../../../shared/settings' import { LogDataCodeLensProvider } from '../../../../awsService/cloudWatchLogs/document/logDataCodeLensProvider' import { CLOUDWATCH_LOGS_SCHEME } from '../../../../shared/constants' -import { FilteredLogEvent } from 'aws-sdk/clients/cloudwatchlogs' +import { FilteredLogEvent } from '@aws-sdk/client-cloudwatch-logs' const getLogEventsMessage = 'This is from getLogEvents' diff --git a/packages/core/src/test/awsService/cloudWatchLogs/registry/logDataRegistry.test.ts b/packages/core/src/test/awsService/cloudWatchLogs/registry/logDataRegistry.test.ts index 6f65bc2438c..1a00bb49c69 100644 --- a/packages/core/src/test/awsService/cloudWatchLogs/registry/logDataRegistry.test.ts +++ b/packages/core/src/test/awsService/cloudWatchLogs/registry/logDataRegistry.test.ts @@ -25,7 +25,7 @@ import { testLogData, unregisteredData, } from '../utils.test' -import { FilteredLogEvents } from 'aws-sdk/clients/cloudwatchlogs' +import { FilteredLogEvent } from '@aws-sdk/client-cloudwatch-logs' import { formatDateTimestamp } from '../../../../shared/datetime' describe('LogDataRegistry', async function () { @@ -128,8 +128,8 @@ describe('LogDataRegistry', async function () { const pageToken1 = 'page1Token' const pageToken2 = 'page2Token' - function createCwlEvents(id: string, count: number): FilteredLogEvents { - let events: FilteredLogEvents = [] + function createCwlEvents(id: string, count: number): FilteredLogEvent[] { + let events: FilteredLogEvent[] = [] for (let i = 0; i < count; i++) { events = events.concat({ message: `message-${id}`, logStreamName: `stream-${id}` }) } diff --git a/packages/core/src/test/awsService/iot/commands/attachCertificate.test.ts b/packages/core/src/test/awsService/iot/commands/attachCertificate.test.ts index f0796e9cc60..840c375a80c 100644 --- a/packages/core/src/test/awsService/iot/commands/attachCertificate.test.ts +++ b/packages/core/src/test/awsService/iot/commands/attachCertificate.test.ts @@ -5,7 +5,7 @@ import * as vscode from 'vscode' import * as sinon from 'sinon' -import { Iot } from 'aws-sdk' +import { Certificate } from '@aws-sdk/client-iot' import { attachCertificateCommand, CertGen } from '../../../../awsService/iot/commands/attachCertificate' import { IotThingFolderNode } from '../../../../awsService/iot/explorer/iotThingFolderNode' import { IotThingNode } from '../../../../awsService/iot/explorer/iotThingNode' @@ -19,22 +19,22 @@ import assert from 'assert' describe('attachCertCommand', function () { const thingName = 'iot-thing' let iot: IotClient - let certs: Iot.Certificate[] + let certs: Certificate[] let thingNode: IotThingNode let selection: number = 0 let sandbox: sinon.SinonSandbox let spyExecuteCommand: sinon.SinonSpy - const prompt: (iot: IotClient, certFetch: CertGen) => Promise> = async ( + const prompt: (iot: IotClient, certFetch: CertGen) => Promise> = async ( iot, certFetch ) => { const iterable = certFetch(iot) - const responses: DataQuickPickItem[] = [] + const responses: DataQuickPickItem[] = [] for await (const response of iterable) { responses.push(...response) } - return selection > -1 ? (responses[selection].data as Iot.Certificate) : undefined + return selection > -1 ? (responses[selection].data as Certificate) : undefined } beforeEach(function () { diff --git a/packages/core/src/test/awsService/iot/commands/createCert.test.ts b/packages/core/src/test/awsService/iot/commands/createCert.test.ts index 00f87b4c8a8..1f280629410 100644 --- a/packages/core/src/test/awsService/iot/commands/createCert.test.ts +++ b/packages/core/src/test/awsService/iot/commands/createCert.test.ts @@ -9,7 +9,7 @@ import { createCertificateCommand } from '../../../../awsService/iot/commands/cr import { IotNode } from '../../../../awsService/iot/explorer/iotNodes' import { IotClient } from '../../../../shared/clients/iotClient' import { IotCertsFolderNode } from '../../../../awsService/iot/explorer/iotCertFolderNode' -import { Iot } from 'aws-sdk' +import { CreateKeysAndCertificateResponse } from '@aws-sdk/client-iot' import { getTestWindow } from '../../../shared/vscode/window' import assert from 'assert' @@ -21,7 +21,7 @@ describe('createCertificateCommand', function () { const certificateArn = 'arn' const certificatePem = 'certPem' const keyPair = { PrivateKey: 'private', PublicKey: 'public' } - const certificate: Iot.CreateKeysAndCertificateResponse = { certificateId, certificateArn, certificatePem, keyPair } + const certificate: CreateKeysAndCertificateResponse = { certificateId, certificateArn, certificatePem, keyPair } let iot: IotClient let node: IotCertsFolderNode let saveLocation: vscode.Uri | undefined = vscode.Uri.file('/certificate.txt') diff --git a/packages/core/src/test/awsService/iot/commands/deletePolicy.test.ts b/packages/core/src/test/awsService/iot/commands/deletePolicy.test.ts index fc0c748317f..9812b915f36 100644 --- a/packages/core/src/test/awsService/iot/commands/deletePolicy.test.ts +++ b/packages/core/src/test/awsService/iot/commands/deletePolicy.test.ts @@ -5,7 +5,7 @@ import * as sinon from 'sinon' import * as vscode from 'vscode' -import { Iot } from 'aws-sdk' +import { PolicyVersion } from '@aws-sdk/client-iot' import { deletePolicyCommand } from '../../../../awsService/iot/commands/deletePolicy' import { IotPolicyFolderNode } from '../../../../awsService/iot/explorer/iotPolicyFolderNode' import { IotPolicyWithVersionsNode } from '../../../../awsService/iot/explorer/iotPolicyNode' @@ -42,8 +42,8 @@ describe('deletePolicyCommand', function () { iot.listPolicyTargets = listPolicyStub const policyVersions = ['1'] const listPolicyVersionsStub = sinon.stub().returns( - asyncGenerator( - policyVersions.map((versionId) => { + asyncGenerator( + policyVersions.map((versionId) => { return { versionId: versionId, } @@ -86,8 +86,8 @@ describe('deletePolicyCommand', function () { iot.listPolicyTargets = listPolicyStub const policyVersions = ['1', '2'] const listPolicyVersionsStub = sinon.stub().returns( - asyncGenerator( - policyVersions.map((versionId) => { + asyncGenerator( + policyVersions.map((versionId) => { return { versionId: versionId, } diff --git a/packages/core/src/test/awsService/iot/explorer/iotCertFolderNode.test.ts b/packages/core/src/test/awsService/iot/explorer/iotCertFolderNode.test.ts index 3d0905ad3a7..7247b1df632 100644 --- a/packages/core/src/test/awsService/iot/explorer/iotCertFolderNode.test.ts +++ b/packages/core/src/test/awsService/iot/explorer/iotCertFolderNode.test.ts @@ -7,7 +7,7 @@ import assert from 'assert' import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' import { IotNode } from '../../../../awsService/iot/explorer/iotNodes' import { IotCertificate, IotClient } from '../../../../shared/clients/iotClient' -import { Iot } from 'aws-sdk' +import { Certificate } from '@aws-sdk/client-iot' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' import { IotCertWithPoliciesNode } from '../../../../awsService/iot/explorer/iotCertificateNode' import { IotCertsFolderNode } from '../../../../awsService/iot/explorer/iotCertFolderNode' @@ -21,7 +21,7 @@ describe('IotCertFolderNode', function () { let iot: IotClient let config: TestSettings - const cert: Iot.Certificate = { + const cert: Certificate = { certificateId: 'cert', certificateArn: 'arn', status: 'ACTIVE', diff --git a/packages/core/src/test/awsService/iot/explorer/iotCertificateNode.test.ts b/packages/core/src/test/awsService/iot/explorer/iotCertificateNode.test.ts index 911b234d8f9..3afdcb6181d 100644 --- a/packages/core/src/test/awsService/iot/explorer/iotCertificateNode.test.ts +++ b/packages/core/src/test/awsService/iot/explorer/iotCertificateNode.test.ts @@ -6,7 +6,7 @@ import assert from 'assert' import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' import { IotClient, IotPolicy } from '../../../../shared/clients/iotClient' -import { Iot } from 'aws-sdk' +import { Policy } from '@aws-sdk/client-iot' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' import { IotPolicyCertNode } from '../../../../awsService/iot/explorer/iotPolicyNode' import { IotCertWithPoliciesNode } from '../../../../awsService/iot/explorer/iotCertificateNode' @@ -22,7 +22,7 @@ describe('IotCertificateNode', function () { let config: TestSettings const certArn = 'certArn' const cert = { id: 'cert', arn: certArn, activeStatus: 'ACTIVE', creationDate: new Date(0) } - const policy: Iot.Policy = { policyName: 'policy', policyArn: 'arn' } + const policy: Policy = { policyName: 'policy', policyArn: 'arn' } const expectedPolicy: IotPolicy = { name: 'policy', arn: 'arn' } function assertPolicyNode(node: AWSTreeNodeBase, expectedPolicy: IotPolicy): void { diff --git a/packages/core/src/test/awsService/iot/explorer/iotPolicyFolderNode.test.ts b/packages/core/src/test/awsService/iot/explorer/iotPolicyFolderNode.test.ts index d8da4e97585..18e91a02531 100644 --- a/packages/core/src/test/awsService/iot/explorer/iotPolicyFolderNode.test.ts +++ b/packages/core/src/test/awsService/iot/explorer/iotPolicyFolderNode.test.ts @@ -7,7 +7,7 @@ import assert from 'assert' import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' import { IotNode } from '../../../../awsService/iot/explorer/iotNodes' import { IotClient, IotPolicy } from '../../../../shared/clients/iotClient' -import { Iot } from 'aws-sdk' +import { Policy } from '@aws-sdk/client-iot' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' import { IotPolicyWithVersionsNode } from '../../../../awsService/iot/explorer/iotPolicyNode' import { IotPolicyFolderNode } from '../../../../awsService/iot/explorer/iotPolicyFolderNode' @@ -20,7 +20,7 @@ describe('IotPolicyFolderNode', function () { let iot: IotClient let config: TestSettings - const policy: Iot.Policy = { policyName: 'policy', policyArn: 'arn' } + const policy: Policy = { policyName: 'policy', policyArn: 'arn' } const expectedPolicy: IotPolicy = { name: 'policy', arn: 'arn' } function assertPolicyNode(node: AWSTreeNodeBase, expectedPolicy: IotPolicy): void { diff --git a/packages/core/src/test/awsService/iot/explorer/iotPolicyNode.test.ts b/packages/core/src/test/awsService/iot/explorer/iotPolicyNode.test.ts index 795c0fae396..88e55b929df 100644 --- a/packages/core/src/test/awsService/iot/explorer/iotPolicyNode.test.ts +++ b/packages/core/src/test/awsService/iot/explorer/iotPolicyNode.test.ts @@ -5,7 +5,7 @@ import assert from 'assert' import { IotClient, IotPolicy } from '../../../../shared/clients/iotClient' -import { Iot } from 'aws-sdk' +import { PolicyVersion } from '@aws-sdk/client-iot' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' import { asyncGenerator } from '../../../../shared/utilities/collectionUtils' import { IotPolicyWithVersionsNode } from '../../../../awsService/iot/explorer/iotPolicyNode' @@ -19,12 +19,12 @@ describe('IotPolicyNode', function () { let config: TestSettings const policyName = 'policy' const expectedPolicy: IotPolicy = { name: policyName, arn: 'arn' } - const policyVersion: Iot.PolicyVersion = { versionId: 'V1', isDefaultVersion: true } + const policyVersion: PolicyVersion = { versionId: 'V1', isDefaultVersion: true } function assertPolicyVersionNode( node: AWSTreeNodeBase, expectedPolicy: IotPolicy, - expectedVersion: Iot.PolicyVersion + expectedVersion: PolicyVersion ): void { assert.ok(node instanceof IotPolicyVersionNode, `Node ${node} should be a Policy Version Node`) assert.deepStrictEqual((node as IotPolicyVersionNode).version, expectedVersion) @@ -39,7 +39,7 @@ describe('IotPolicyNode', function () { describe('getChildren', function () { it('gets children', async function () { const versions = [{ versionId: 'V1', isDefaultVersion: true }] - const stub = sinon.stub().returns(asyncGenerator(versions)) + const stub = sinon.stub().returns(asyncGenerator(versions)) iot.listPolicyVersions = stub const node = new IotPolicyWithVersionsNode( expectedPolicy, diff --git a/packages/core/src/test/awsService/iot/explorer/iotPolicyVersionNode.test.ts b/packages/core/src/test/awsService/iot/explorer/iotPolicyVersionNode.test.ts index 415e4f29fe7..4faf56e743d 100644 --- a/packages/core/src/test/awsService/iot/explorer/iotPolicyVersionNode.test.ts +++ b/packages/core/src/test/awsService/iot/explorer/iotPolicyVersionNode.test.ts @@ -5,7 +5,7 @@ import assert from 'assert' import { IotClient, IotPolicy } from '../../../../shared/clients/iotClient' -import { Iot } from 'aws-sdk' +import { PolicyVersion } from '@aws-sdk/client-iot' import { IotPolicyWithVersionsNode } from '../../../../awsService/iot/explorer/iotPolicyNode' import { IotPolicyVersionNode } from '../../../../awsService/iot/explorer/iotPolicyVersionNode' import { stringOrProp } from '../../../../shared/utilities/tsUtils' @@ -16,8 +16,8 @@ describe('IotPolicyVersionNode', function () { const expectedPolicy: IotPolicy = { name: policyName, arn: 'arn' } const createDate = new Date(Date.UTC(2021, 1, 1)) // Feb 1 UTC = Jan 31 PDT const createDateFormatted = formatLocalized(createDate) - const policyVersion: Iot.PolicyVersion = { versionId: 'V1', isDefaultVersion: true, createDate } - const nonDefaultVersion: Iot.PolicyVersion = { versionId: 'V2', isDefaultVersion: false, createDate } + const policyVersion: PolicyVersion = { versionId: 'V1', isDefaultVersion: true, createDate } + const nonDefaultVersion: PolicyVersion = { versionId: 'V2', isDefaultVersion: false, createDate } it('creates an IoT Policy Version Node for default version', async function () { const node = new IotPolicyVersionNode( diff --git a/packages/core/src/test/awsService/iot/explorer/iotThingFolderNode.test.ts b/packages/core/src/test/awsService/iot/explorer/iotThingFolderNode.test.ts index db25a689fbd..667b39974b7 100644 --- a/packages/core/src/test/awsService/iot/explorer/iotThingFolderNode.test.ts +++ b/packages/core/src/test/awsService/iot/explorer/iotThingFolderNode.test.ts @@ -9,7 +9,7 @@ import { IotNode } from '../../../../awsService/iot/explorer/iotNodes' import { IotThingFolderNode } from '../../../../awsService/iot/explorer/iotThingFolderNode' import { IotThingNode } from '../../../../awsService/iot/explorer/iotThingNode' import { IotClient, IotThing } from '../../../../shared/clients/iotClient' -import { Iot } from 'aws-sdk' +import { ThingAttribute } from '@aws-sdk/client-iot' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' import { TestSettings } from '../../../utilities/testSettingsConfiguration' import sinon from 'sinon' @@ -20,7 +20,7 @@ describe('IotThingFolderNode', function () { let iot: IotClient let config: TestSettings - const thing: Iot.ThingAttribute = { thingName: 'thing', thingArn: 'arn' } + const thing: ThingAttribute = { thingName: 'thing', thingArn: 'arn' } const expectedThing: IotThing = { name: 'thing', arn: 'arn' } function assertThingNode(node: AWSTreeNodeBase, expectedThing: IotThing): void { diff --git a/packages/core/src/test/awsService/iot/explorer/iotThingNode.test.ts b/packages/core/src/test/awsService/iot/explorer/iotThingNode.test.ts index 52d0d92e060..663860ef968 100644 --- a/packages/core/src/test/awsService/iot/explorer/iotThingNode.test.ts +++ b/packages/core/src/test/awsService/iot/explorer/iotThingNode.test.ts @@ -6,7 +6,7 @@ import assert from 'assert' import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' import { IotCertificate, IotClient } from '../../../../shared/clients/iotClient' -import { Iot } from 'aws-sdk' +import { Certificate } from '@aws-sdk/client-iot' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' import { IotThingCertNode } from '../../../../awsService/iot/explorer/iotCertificateNode' import { IotThingNode } from '../../../../awsService/iot/explorer/iotThingNode' @@ -22,7 +22,7 @@ describe('IotThingNode', function () { let config: TestSettings const thingName = 'thing' const thing = { name: thingName, arn: 'thingArn' } - const cert: Iot.Certificate = { + const cert: Certificate = { certificateId: 'cert', certificateArn: 'arn', status: 'ACTIVE', diff --git a/packages/core/src/test/awsService/redshift/explorer/redshiftDatabaseNode.test.ts b/packages/core/src/test/awsService/redshift/explorer/redshiftDatabaseNode.test.ts index 07f81a0dfea..f291b926c0c 100644 --- a/packages/core/src/test/awsService/redshift/explorer/redshiftDatabaseNode.test.ts +++ b/packages/core/src/test/awsService/redshift/explorer/redshiftDatabaseNode.test.ts @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -import sinon = require('sinon') +import { mockClient } from 'aws-sdk-client-mock' import { RedshiftDatabaseNode } from '../../../../awsService/redshift/explorer/redshiftDatabaseNode' -import { RedshiftData } from 'aws-sdk' +import { RedshiftDataClient, ListSchemasCommand } from '@aws-sdk/client-redshift-data' import { DefaultRedshiftClient } from '../../../../shared/clients/redshiftClient' import { ConnectionParams, ConnectionType, RedshiftWarehouseType } from '../../../../awsService/redshift/models/models' import assert = require('assert') @@ -14,44 +14,37 @@ import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBa import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' describe('RedshiftDatabaseNode', function () { - const sandbox = sinon.createSandbox() - const mockRedshiftData = {} - const redshiftClient = new DefaultRedshiftClient('us-east-1', async () => mockRedshiftData, undefined, undefined) + const mockRedshiftData = mockClient(RedshiftDataClient) + const redshiftClient = new DefaultRedshiftClient('us-east-1', () => mockRedshiftData as any, undefined, undefined) const connectionParams = new ConnectionParams( ConnectionType.TempCreds, 'testDb1', 'warehouseId', RedshiftWarehouseType.PROVISIONED ) - let listSchemasStub: sinon.SinonStub describe('getChildren', function () { - beforeEach(function () { - listSchemasStub = sandbox.stub() - mockRedshiftData.listSchemas = listSchemasStub - }) - afterEach(function () { - sandbox.reset() + mockRedshiftData.reset() }) it('loads schemas successfully', async () => { const node = new RedshiftDatabaseNode('testDB1', redshiftClient, connectionParams) - listSchemasStub.returns({ promise: () => Promise.resolve({ Schemas: ['schema1'] }) }) + mockRedshiftData.on(ListSchemasCommand).resolves({ Schemas: ['schema1'] }) const childNodes = await node.getChildren() verifyChildNodes(childNodes, false) }) it('loads schemas and shows load more node when there are more schemas', async () => { const node = new RedshiftDatabaseNode('testDB1', redshiftClient, connectionParams) - listSchemasStub.returns({ promise: () => Promise.resolve({ Schemas: ['schema1'], NextToken: 'next' }) }) + mockRedshiftData.on(ListSchemasCommand).resolves({ Schemas: ['schema1'], NextToken: 'next' }) const childNodes = await node.getChildren() verifyChildNodes(childNodes, true) }) it('shows error node when listSchema fails', async () => { const node = new RedshiftDatabaseNode('testDB1', redshiftClient, connectionParams) - listSchemasStub.returns({ promise: () => Promise.reject('Failed') }) + mockRedshiftData.on(ListSchemasCommand).rejects('Failed') const childNodes = await node.getChildren() assert.strictEqual(childNodes.length, 1) assert.strictEqual(childNodes[0].contextValue, 'awsErrorNode') diff --git a/packages/core/src/test/awsService/redshift/explorer/redshiftNode.test.ts b/packages/core/src/test/awsService/redshift/explorer/redshiftNode.test.ts index af9c9ffd5ce..26df4f5abf7 100644 --- a/packages/core/src/test/awsService/redshift/explorer/redshiftNode.test.ts +++ b/packages/core/src/test/awsService/redshift/explorer/redshiftNode.test.ts @@ -3,29 +3,27 @@ * SPDX-License-Identifier: Apache-2.0 */ // eslint-disable-next-line header/header -import sinon = require('sinon') +import { mockClient, AwsClientStub } from 'aws-sdk-client-mock' import { RedshiftNode } from '../../../../awsService/redshift/explorer/redshiftNode' import { DefaultRedshiftClient } from '../../../../shared/clients/redshiftClient' -import { AWSError, Redshift, RedshiftServerless, Request } from 'aws-sdk' import assert = require('assert') import { RedshiftWarehouseNode } from '../../../../awsService/redshift/explorer/redshiftWarehouseNode' -import { ClusterList, ClustersMessage } from 'aws-sdk/clients/redshift' -import { ListWorkgroupsResponse, WorkgroupList } from 'aws-sdk/clients/redshiftserverless' +import { Cluster, ClustersMessage, RedshiftClient, DescribeClustersCommand } from '@aws-sdk/client-redshift' +import { + ListWorkgroupsResponse, + Workgroup, + RedshiftServerlessClient, + ListWorkgroupsCommand, +} from '@aws-sdk/client-redshift-serverless' import { RedshiftWarehouseType } from '../../../../awsService/redshift/models/models' import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' -function success(output?: T): Request { - return { - promise: () => Promise.resolve(output), - } as Request -} - function getExpectedProvisionedResponse(withNextToken: boolean): ClustersMessage { const response = { Clusters: [ { ClusterNamespaceArn: 'testArn', ClusterIdentifier: 'testId', ClusterAvailabilityStatus: 'available' }, - ] as ClusterList, + ] as Cluster[], } as ClustersMessage if (withNextToken) { response.Marker = 'next' @@ -35,7 +33,7 @@ function getExpectedProvisionedResponse(withNextToken: boolean): ClustersMessage function getExpectedServerlessResponse(withNextToken: boolean): ListWorkgroupsResponse { const response = { - workgroups: [{ workgroupArn: 'testArn', workgroupName: 'testWorkgroup', status: 'available' }] as WorkgroupList, + workgroups: [{ workgroupArn: 'testArn', workgroupName: 'testWorkgroup', status: 'AVAILABLE' }] as Workgroup[], } as ListWorkgroupsResponse if (withNextToken) { response.nextToken = 'next' @@ -70,79 +68,59 @@ describe('redshiftNode', function () { describe('getChildren', function () { let node: RedshiftNode let redshiftClient: DefaultRedshiftClient - let mockRedshift: Redshift - let mockRedshiftServerless: RedshiftServerless - const sandbox: sinon.SinonSandbox = sinon.createSandbox() - const describeClustersStub = sandbox.stub() - const listWorkgroupsStub = sandbox.stub() - - function verifyStubCallCounts(describeClustersStubCallCount: number, listWorkgroupsStubCallCount: number) { - assert.strictEqual( - describeClustersStub.callCount, - describeClustersStubCallCount, - 'DescribeClustersStub call count mismatch' - ) - assert.strictEqual( - listWorkgroupsStub.callCount, - listWorkgroupsStubCallCount, - 'ListWorkgroupsStub call count mismatch' - ) - } + let mockRedshift: AwsClientStub + let mockRedshiftServerless: AwsClientStub beforeEach(function () { - mockRedshift = {} - mockRedshiftServerless = {} + mockRedshift = mockClient(RedshiftClient) + mockRedshiftServerless = mockClient(RedshiftServerlessClient) redshiftClient = new DefaultRedshiftClient( 'us-east-1', undefined, - async (r) => Promise.resolve(mockRedshift), - async (r) => Promise.resolve(mockRedshiftServerless) + // @ts-expect-error + () => mockRedshift, + () => mockRedshiftServerless ) - mockRedshift.describeClusters = describeClustersStub - mockRedshiftServerless.listWorkgroups = listWorkgroupsStub node = new RedshiftNode(redshiftClient) }) afterEach(function () { - sandbox.reset() + mockRedshift.reset() + mockRedshiftServerless.reset() }) it('gets both provisioned and serverless warehouses when no results have been loaded', async () => { - describeClustersStub.returns(success(getExpectedProvisionedResponse(false))) - listWorkgroupsStub.returns(success(getExpectedServerlessResponse(false))) + mockRedshift.on(DescribeClustersCommand).resolves(getExpectedProvisionedResponse(false)) + mockRedshiftServerless.on(ListWorkgroupsCommand).resolves(getExpectedServerlessResponse(false)) const childNodes = await node.getChildren() verifyChildNodeCounts(childNodes, 1, 1, 0) - verifyStubCallCounts(1, 1) }) it('gets both provisioned and serverless warehouses if results have been loaded but there are more results', async () => { - describeClustersStub.returns(success(getExpectedProvisionedResponse(true))) - listWorkgroupsStub.returns(success(getExpectedServerlessResponse(true))) + mockRedshift.on(DescribeClustersCommand).resolves(getExpectedProvisionedResponse(true)) + mockRedshiftServerless.on(ListWorkgroupsCommand).resolves(getExpectedServerlessResponse(true)) const childNodes = await node.getChildren() verifyChildNodeCounts(childNodes, 1, 1, 1) - verifyStubCallCounts(1, 1) }) it('gets only provisioned warehouses if results have been loaded and there are only more provisioned warehouses', async () => { - describeClustersStub.returns(success(getExpectedProvisionedResponse(true))) - listWorkgroupsStub.returns(success(getExpectedServerlessResponse(false))) + mockRedshift.on(DescribeClustersCommand).resolves(getExpectedProvisionedResponse(true)) + mockRedshiftServerless.on(ListWorkgroupsCommand).resolves(getExpectedServerlessResponse(false)) const childNodes = await node.getChildren() verifyChildNodeCounts(childNodes, 1, 1, 1) await node.loadMoreChildren() const newChildNodes = await node.getChildren() verifyChildNodeCounts(newChildNodes, 2, 1, 1) - verifyStubCallCounts(2, 1) }) it('gets only serverless warehouses if results have been loaded and there are only more serverless warehouses', async () => { - describeClustersStub.returns(success(getExpectedProvisionedResponse(false))) - listWorkgroupsStub.returns(success(getExpectedServerlessResponse(true))) + mockRedshift.on(DescribeClustersCommand).resolves(getExpectedProvisionedResponse(false)) + mockRedshiftServerless.on(ListWorkgroupsCommand).resolves(getExpectedServerlessResponse(true)) const childNodes = await node.getChildren() verifyChildNodeCounts(childNodes, 1, 1, 1) await node.loadMoreChildren() const newChildNodes = await node.getChildren() verifyChildNodeCounts(newChildNodes, 1, 2, 1) - verifyStubCallCounts(1, 2) }) }) }) diff --git a/packages/core/src/test/awsService/redshift/explorer/redshiftSchemaNode.test.ts b/packages/core/src/test/awsService/redshift/explorer/redshiftSchemaNode.test.ts index a3e4a17f4aa..68c2d792cfa 100644 --- a/packages/core/src/test/awsService/redshift/explorer/redshiftSchemaNode.test.ts +++ b/packages/core/src/test/awsService/redshift/explorer/redshiftSchemaNode.test.ts @@ -3,22 +3,21 @@ * SPDX-License-Identifier: Apache-2.0 */ -import * as sinon from 'sinon' +import { mockClient, AwsClientStub } from 'aws-sdk-client-mock' import * as assert from 'assert' import { DefaultRedshiftClient } from '../../../../shared/clients/redshiftClient' -import { RedshiftData } from 'aws-sdk' +import { RedshiftDataClient, ListTablesCommand, ListTablesResponse } from '@aws-sdk/client-redshift-data' import { RedshiftSchemaNode } from '../../../../awsService/redshift/explorer/redshiftSchemaNode' import { ConnectionParams, ConnectionType, RedshiftWarehouseType } from '../../../../awsService/redshift/models/models' import { RedshiftTableNode } from '../../../../awsService/redshift/explorer/redshiftTableNode' -import { ListTablesResponse } from 'aws-sdk/clients/redshiftdata' import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' describe('RedshiftSchemaNode', function () { - const sandbox = sinon.createSandbox() - const mockRedshiftData: RedshiftData = {} + const mockRedshiftData: AwsClientStub = mockClient(RedshiftDataClient) const redshiftClient: DefaultRedshiftClient = new DefaultRedshiftClient( 'us-east-1', - async () => mockRedshiftData, + // @ts-expect-error + () => mockRedshiftData, undefined, undefined ) @@ -28,23 +27,16 @@ describe('RedshiftSchemaNode', function () { 'warehouseId', RedshiftWarehouseType.PROVISIONED ) - let listTablesStub: sinon.SinonStub describe('getChildren', function () { - beforeEach(function () { - listTablesStub = sandbox.stub() - mockRedshiftData.listTables = listTablesStub - }) - afterEach(function () { - sandbox.reset() + mockRedshiftData.reset() }) it('gets table nodes and filters out tables with pkey', async () => { - listTablesStub.returns({ - promise: () => - Promise.resolve({ Tables: [{ name: 'test' }, { name: 'test_pkey' }] } as ListTablesResponse), - }) + mockRedshiftData + .on(ListTablesCommand) + .resolves({ Tables: [{ name: 'test' }, { name: 'test_pkey' }] } as ListTablesResponse) const node = new RedshiftSchemaNode('testSchema', redshiftClient, connectionParams) const childNodes = await node.getChildren() assert.strictEqual(childNodes.length, 1) @@ -52,13 +44,10 @@ describe('RedshiftSchemaNode', function () { }) it('gets table nodes & adds load more node if there are more nodes to be loaded', async () => { - listTablesStub.returns({ - promise: () => - Promise.resolve({ - Tables: [{ name: 'test' }, { name: 'test_pkey' }], - NextToken: 'next', - } as ListTablesResponse), - }) + mockRedshiftData.on(ListTablesCommand).resolves({ + Tables: [{ name: 'test' }, { name: 'test_pkey' }], + NextToken: 'next', + } as ListTablesResponse) const node = new RedshiftSchemaNode('testSchema', redshiftClient, connectionParams) const childNodes = await node.getChildren() assert.strictEqual(childNodes.length, 2) @@ -67,7 +56,7 @@ describe('RedshiftSchemaNode', function () { }) it('shows error node when list table API errors out', async () => { - listTablesStub.returns({ promise: () => Promise.reject('failed') }) + mockRedshiftData.on(ListTablesCommand).rejects('failed') const node = new RedshiftSchemaNode('testSchema', redshiftClient, connectionParams) const childNodes = await node.getChildren() assert.strictEqual(childNodes.length, 1) diff --git a/packages/core/src/test/awsService/redshift/explorer/redshiftWarehouseNode.test.ts b/packages/core/src/test/awsService/redshift/explorer/redshiftWarehouseNode.test.ts index d06128b2585..b82e9c972f9 100644 --- a/packages/core/src/test/awsService/redshift/explorer/redshiftWarehouseNode.test.ts +++ b/packages/core/src/test/awsService/redshift/explorer/redshiftWarehouseNode.test.ts @@ -5,7 +5,7 @@ import sinon = require('sinon') import { DefaultRedshiftClient } from '../../../../shared/clients/redshiftClient' -import { ListDatabasesResponse } from 'aws-sdk/clients/redshiftdata' +import { ListDatabasesResponse, RedshiftDataClient, ListDatabasesCommand } from '@aws-sdk/client-redshift-data' import { ConnectionParams, ConnectionType, RedshiftWarehouseType } from '../../../../awsService/redshift/models/models' import { RedshiftWarehouseNode, @@ -17,9 +17,9 @@ import * as assert from 'assert' import { RedshiftDatabaseNode } from '../../../../awsService/redshift/explorer/redshiftDatabaseNode' import { AWSCommandTreeNode } from '../../../../shared/treeview/nodes/awsCommandTreeNode' import { RedshiftNodeConnectionWizard } from '../../../../awsService/redshift/wizards/connectionWizard' -import RedshiftData = require('aws-sdk/clients/redshiftdata') import { MoreResultsNode } from '../../../../awsexplorer/moreResultsNode' import { AWSTreeNodeBase } from '../../../../shared/treeview/nodes/awsTreeNodeBase' +import { mockClient, AwsClientStub } from 'aws-sdk-client-mock' function verifyChildNodes(childNodes: AWSTreeNodeBase[], databaseNodeCount: number, shouldHaveLoadMore: boolean) { assert.strictEqual(childNodes.length, databaseNodeCount + (shouldHaveLoadMore ? 1 : 0) + 1) @@ -41,7 +41,6 @@ function verifyRetryNode(childNodes: AWSTreeNodeBase[]) { describe('redshiftWarehouseNode', function () { describe('getChildren', function () { - const sandbox = sinon.createSandbox() const expectedResponse = { Databases: ['testDb1'] } as ListDatabasesResponse const expectedResponseWithNextToken = { Databases: ['testDb1'], NextToken: 'next' } as ListDatabasesResponse const connectionParams = new ConnectionParams( @@ -51,31 +50,32 @@ describe('redshiftWarehouseNode', function () { RedshiftWarehouseType.PROVISIONED ) const resourceNode = { arn: 'testARN', name: 'warehouseId' } as AWSResourceNode - const mockRedshiftData = {} - const redshiftClient = new DefaultRedshiftClient( - 'us-east-1', - async (r) => Promise.resolve(mockRedshiftData), - undefined, - undefined - ) - const redshiftNode = new RedshiftNode(redshiftClient) - let listDatabasesStub: sinon.SinonStub + let mockRedshiftData: AwsClientStub + let redshiftClient: DefaultRedshiftClient + let redshiftNode: RedshiftNode let warehouseNode: RedshiftWarehouseNode let connectionWizardStub: sinon.SinonStub beforeEach(function () { - listDatabasesStub = sandbox.stub() - mockRedshiftData.listDatabases = listDatabasesStub + mockRedshiftData = mockClient(RedshiftDataClient) + redshiftClient = new DefaultRedshiftClient( + 'us-east-1', + // @ts-expect-error + () => mockRedshiftData, + undefined, + undefined + ) + redshiftNode = new RedshiftNode(redshiftClient) }) afterEach(function () { - sandbox.reset() + mockRedshiftData.reset() connectionWizardStub.restore() }) it('gets databases for a warehouse and adds a start button', async () => { connectionWizardStub = sinon.stub(RedshiftNodeConnectionWizard.prototype, 'run').resolves(connectionParams) warehouseNode = new RedshiftWarehouseNode(redshiftNode, resourceNode, RedshiftWarehouseType.PROVISIONED) - listDatabasesStub.returns({ promise: () => Promise.resolve(expectedResponse) }) + mockRedshiftData.on(ListDatabasesCommand).resolves(expectedResponse) const childNodes = await warehouseNode.getChildren() @@ -85,7 +85,7 @@ describe('redshiftWarehouseNode', function () { it('gets databases for a warehouse, adds a start button and a load more button if there are more results', async () => { connectionWizardStub = sinon.stub(RedshiftNodeConnectionWizard.prototype, 'run').resolves(connectionParams) warehouseNode = new RedshiftWarehouseNode(redshiftNode, resourceNode, RedshiftWarehouseType.PROVISIONED) - listDatabasesStub.returns({ promise: () => Promise.resolve(expectedResponseWithNextToken) }) + mockRedshiftData.on(ListDatabasesCommand).resolves(expectedResponseWithNextToken) const childNodes = await warehouseNode.getChildren() @@ -102,7 +102,7 @@ describe('redshiftWarehouseNode', function () { it('shows a node with retry if there is error fetching databases', async () => { connectionWizardStub = sinon.stub(RedshiftNodeConnectionWizard.prototype, 'run').resolves(connectionParams) warehouseNode = new RedshiftWarehouseNode(redshiftNode, resourceNode, RedshiftWarehouseType.PROVISIONED) - listDatabasesStub.returns({ promise: () => Promise.reject('Failed') }) + mockRedshiftData.on(ListDatabasesCommand).rejects('Failed') const childNodes = await warehouseNode.getChildren() verifyRetryNode(childNodes) }) diff --git a/packages/core/src/test/awsService/redshift/notebook/redshiftNotebookController.test.ts b/packages/core/src/test/awsService/redshift/notebook/redshiftNotebookController.test.ts index 982ce2a6c9c..8b9bfd5b546 100644 --- a/packages/core/src/test/awsService/redshift/notebook/redshiftNotebookController.test.ts +++ b/packages/core/src/test/awsService/redshift/notebook/redshiftNotebookController.test.ts @@ -5,19 +5,19 @@ import * as vscode from 'vscode' import { RedshiftNotebookController } from '../../../../awsService/redshift/notebook/redshiftNotebookController' -import sinon = require('sinon') +import { mockClient, AwsClientStub } from 'aws-sdk-client-mock' import assert = require('assert') import { DefaultRedshiftClient } from '../../../../shared/clients/redshiftClient' -import { RedshiftData } from 'aws-sdk' +import { RedshiftDataClient } from '@aws-sdk/client-redshift-data' +import sinon = require('sinon') describe('RedshiftNotebookController', () => { - const mockRedshiftData = {} - const redshiftClient = new DefaultRedshiftClient('us-east-1', async () => mockRedshiftData, undefined, undefined) + const mockRedshiftData: AwsClientStub = mockClient(RedshiftDataClient) + // @ts-expect-error + const redshiftClient = new DefaultRedshiftClient('us-east-1', () => mockRedshiftData, undefined, undefined) let notebookController: any let createNotebookControllerStub: any - let executeQueryStub: sinon.SinonStub beforeEach(() => { - redshiftClient.executeQuery = executeQueryStub createNotebookControllerStub = sinon.stub(vscode.notebooks, 'createNotebookController') const controllerInstanceValue = { supportedLanguages: ['sql'], @@ -29,6 +29,7 @@ describe('RedshiftNotebookController', () => { notebookController = new RedshiftNotebookController(redshiftClient) }) afterEach(() => { + mockRedshiftData.reset() sinon.restore() }) it('validating parameters of a notebook controller instance', () => { diff --git a/packages/core/src/test/awsService/sagemaker/model.test.ts b/packages/core/src/test/awsService/sagemaker/model.test.ts index e6a9637ed15..7570e1bfe31 100644 --- a/packages/core/src/test/awsService/sagemaker/model.test.ts +++ b/packages/core/src/test/awsService/sagemaker/model.test.ts @@ -211,6 +211,28 @@ describe('SageMaker Model', () => { assertLogsContain(`Removed '${hostname}' from known_hosts`, false, 'debug') }) + it('removes case-sensitive hostname when entry in known_hosts is lowercase', async function () { + const mixedCaseHostname = 'Test.Host.Com' + + sandbox.stub(fs, 'existsFile').resolves(true) + + const inputContent = `test.host.com ssh-rsa AAAA\nsome.other.com ssh-rsa BBBB` + const expectedOutput = `some.other.com ssh-rsa BBBB` + + sandbox.stub(fs, 'readFileText').resolves(inputContent) + const writeStub = sandbox.stub(fs, 'writeFile').resolves() + + await removeKnownHost(mixedCaseHostname) + + sinon.assert.calledWith( + writeStub, + path.join(os.homedir(), '.ssh', 'known_hosts'), + sinon.match((value: string) => value.trim() === expectedOutput), + { atomic: true } + ) + assertLogsContain(`Removed '${mixedCaseHostname}' from known_hosts`, false, 'debug') + }) + it('handles hostname in comma-separated list', async function () { sandbox.stub(fs, 'existsFile').resolves(true) diff --git a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts index 218fa384c1e..f3ae2fbceff 100644 --- a/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts +++ b/packages/core/src/test/codewhisperer/commands/transformByQ.test.ts @@ -6,7 +6,7 @@ import assert, { fail } from 'assert' import * as vscode from 'vscode' import * as sinon from 'sinon' -import { DB, transformByQState, TransformByQStoppedError } from '../../../codewhisperer/models/model' +import { DB, JDKVersion, transformByQState, TransformByQStoppedError } from '../../../codewhisperer/models/model' import { stopTransformByQ, finalizeTransformationJob } from '../../../codewhisperer/commands/startTransformByQ' import { HttpResponse } from 'aws-sdk' import * as codeWhisperer from '../../../codewhisperer/client/codewhisperer' @@ -283,6 +283,8 @@ dependencyManagement: it(`WHEN update job history called THEN returns details of last run job`, async function () { transformByQState.setJobId('abc-123') + transformByQState.setSourceJDKVersion(JDKVersion.JDK8) + transformByQState.setTargetJDKVersion(JDKVersion.JDK17) transformByQState.setProjectName('test-project') transformByQState.setPolledJobStatus('COMPLETED') transformByQState.setStartTime('05/03/24, 11:35 AM') diff --git a/packages/core/src/test/codewhisperer/startSecurityScan.test.ts b/packages/core/src/test/codewhisperer/startSecurityScan.test.ts index 551949aa3ab..e45bee1b7fa 100644 --- a/packages/core/src/test/codewhisperer/startSecurityScan.test.ts +++ b/packages/core/src/test/codewhisperer/startSecurityScan.test.ts @@ -17,14 +17,7 @@ import { assertTelemetry, closeAllEditors, getFetchStubWithResponse } from '../t import { AWSError } from 'aws-sdk' import { getTestWindow } from '../shared/vscode/window' import { SeverityLevel } from '../shared/vscode/message' -import { cancel } from '../../shared/localizedText' -import { - showScannedFilesMessage, - stopScanMessage, - CodeAnalysisScope, - monthlyLimitReachedNotification, - scansLimitReachedErrorMessage, -} from '../../codewhisperer/models/constants' +import { showScannedFilesMessage, CodeAnalysisScope } from '../../codewhisperer/models/constants' import * as model from '../../codewhisperer/models/model' import * as errors from '../../shared/errors' import * as timeoutUtils from '../../shared/utilities/timeoutUtils' @@ -124,70 +117,6 @@ describe('startSecurityScan', function () { }) }) - it('Should stop security scan for project scans when confirmed', async function () { - getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) - const securityScanRenderSpy = sinon.spy(diagnosticsProvider, 'initSecurityScanRender') - const securityScanStoppedErrorSpy = sinon.spy(model, 'CodeScanStoppedError') - const testWindow = getTestWindow() - testWindow.onDidShowMessage((message) => { - if (message.message === stopScanMessage) { - message.selectItem(startSecurityScan.stopScanButton) - } - }) - model.codeScanState.setToRunning() - const scanPromise = startSecurityScan.startSecurityScan( - mockSecurityPanelViewProvider, - editor, - createClient(), - extensionContext, - CodeAnalysisScope.PROJECT, - false - ) - await startSecurityScan.confirmStopSecurityScan( - model.codeScanState, - false, - CodeAnalysisScope.PROJECT, - undefined - ) - await scanPromise - assert.ok(securityScanRenderSpy.notCalled) - assert.ok(securityScanStoppedErrorSpy.calledOnce) - const warnings = testWindow.shownMessages.filter((m) => m.severity === SeverityLevel.Warning) - assert.ok(warnings.map((m) => m.message).includes(stopScanMessage)) - }) - - it('Should not stop security scan for project scans when not confirmed', async function () { - getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) - const securityScanRenderSpy = sinon.spy(diagnosticsProvider, 'initSecurityScanRender') - const securityScanStoppedErrorSpy = sinon.spy(model, 'CodeScanStoppedError') - const testWindow = getTestWindow() - testWindow.onDidShowMessage((message) => { - if (message.message === stopScanMessage) { - message.selectItem(cancel) - } - }) - model.codeScanState.setToRunning() - const scanPromise = startSecurityScan.startSecurityScan( - mockSecurityPanelViewProvider, - editor, - createClient(), - extensionContext, - CodeAnalysisScope.PROJECT, - false - ) - await startSecurityScan.confirmStopSecurityScan( - model.codeScanState, - false, - CodeAnalysisScope.PROJECT, - undefined - ) - await scanPromise - assert.ok(securityScanRenderSpy.calledOnce) - assert.ok(securityScanStoppedErrorSpy.notCalled) - const warnings = testWindow.shownMessages.filter((m) => m.severity === SeverityLevel.Warning) - assert.ok(warnings.map((m) => m.message).includes(stopScanMessage)) - }) - it('Should stop security scan for auto file scans if setting is disabled', async function () { getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) const securityScanRenderSpy = sinon.spy(diagnosticsProvider, 'initSecurityScanRender') @@ -272,39 +201,6 @@ describe('startSecurityScan', function () { ]) }) - it('Should not cancel a project scan if a file scan has started', async function () { - getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) - await model.CodeScansState.instance.setScansEnabled(true) - - const scanPromise = startSecurityScan.startSecurityScan( - mockSecurityPanelViewProvider, - editor, - createClient(), - extensionContext, - CodeAnalysisScope.PROJECT, - false - ) - await startSecurityScan.startSecurityScan( - mockSecurityPanelViewProvider, - editor, - createClient(), - extensionContext, - CodeAnalysisScope.FILE_AUTO, - false - ) - await scanPromise - assertTelemetry('codewhisperer_securityScan', [ - { - result: 'Succeeded', - codewhispererCodeScanScope: 'FILE_AUTO', - }, - { - result: 'Succeeded', - codewhispererCodeScanScope: 'PROJECT', - }, - ]) - }) - it('Should handle failed scan job status', async function () { getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) @@ -330,36 +226,6 @@ describe('startSecurityScan', function () { }) }) - it('Should show notification when throttled for project scans', async function () { - getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) - const mockClient = createClient() - mockClient.createCodeScan.throws({ - code: 'ThrottlingException', - time: new Date(), - name: 'error name', - message: scansLimitReachedErrorMessage, - } satisfies AWSError) - sinon.stub(errors, 'isAwsError').returns(true) - const testWindow = getTestWindow() - await startSecurityScan.startSecurityScan( - mockSecurityPanelViewProvider, - editor, - mockClient, - extensionContext, - CodeAnalysisScope.PROJECT, - false - ) - - assert.ok(testWindow.shownMessages.map((m) => m.message).includes(monthlyLimitReachedNotification)) - assertTelemetry('codewhisperer_securityScan', { - codewhispererCodeScanScope: 'PROJECT', - result: 'Failed', - reason: 'ThrottlingException', - reasonDesc: `ThrottlingException: Maximum com.amazon.aws.codewhisperer.StartCodeAnalysis reached for this month.`, - passive: false, - }) - }) - it('Should set monthly quota exceeded when throttled for auto file scans', async function () { getFetchStubWithResponse({ status: 200, statusText: 'testing stub' }) await model.CodeScansState.instance.setScansEnabled(true) diff --git a/packages/core/src/test/credentials/provider/ecsCredentialsProvider.test.ts b/packages/core/src/test/credentials/provider/ecsCredentialsProvider.test.ts index 143a987242e..0008e044902 100644 --- a/packages/core/src/test/credentials/provider/ecsCredentialsProvider.test.ts +++ b/packages/core/src/test/credentials/provider/ecsCredentialsProvider.test.ts @@ -4,14 +4,14 @@ */ import assert from 'assert' -import { Credentials } from 'aws-sdk' +import { AwsCredentialIdentity } from '@aws-sdk/types' import { EcsCredentialsProvider } from '../../../auth/providers/ecsCredentialsProvider' import { EnvironmentVariables } from '../../../shared/environmentVariables' describe('EcsCredentialsProvider', function () { const dummyUri = 'dummyUri' const dummyRegion = 'dummmyRegion' - const dummyCredentials = { accessKeyId: 'dummyKey' } as Credentials + const dummyCredentials = { accessKeyId: 'dummyKey' } as AwsCredentialIdentity const dummyProvider = () => { return Promise.resolve(dummyCredentials) } diff --git a/packages/core/src/test/dynamicResources/explorer/resourceTypeNode.test.ts b/packages/core/src/test/dynamicResources/explorer/resourceTypeNode.test.ts index 96130761f0d..86296885df2 100644 --- a/packages/core/src/test/dynamicResources/explorer/resourceTypeNode.test.ts +++ b/packages/core/src/test/dynamicResources/explorer/resourceTypeNode.test.ts @@ -13,7 +13,7 @@ import { assertNodeListOnlyHasPlaceholderNode, } from '../../utilities/explorerNodeAssertions' import { CloudControlClient } from '../../../shared/clients/cloudControl' -import { CloudControl } from 'aws-sdk' +import { ResourceDescription } from '@aws-sdk/client-cloudcontrol' import { ResourceTypeMetadata } from '../../../dynamicResources/model/resources' import sinon from 'sinon' @@ -183,7 +183,7 @@ describe('ResourceTypeNode', function () { cloudControl.listResources = sinon.stub().resolves({ TypeName: fakeTypeName, NextToken: undefined, - ResourceDescriptions: resourceIdentifiers.map((identifier) => { + ResourceDescriptions: resourceIdentifiers.map((identifier) => { return { Identifier: identifier, ResourceModel: '', diff --git a/packages/core/src/test/eventSchemas/commands/downloadSchemaItemCode.test.ts b/packages/core/src/test/eventSchemas/commands/downloadSchemaItemCode.test.ts index 9b630eed07d..140248eaefc 100644 --- a/packages/core/src/test/eventSchemas/commands/downloadSchemaItemCode.test.ts +++ b/packages/core/src/test/eventSchemas/commands/downloadSchemaItemCode.test.ts @@ -7,7 +7,11 @@ import assert from 'assert' import * as path from 'path' import * as vscode from 'vscode' -import { Schemas } from 'aws-sdk' +import { + DescribeCodeBindingResponse, + GetCodeBindingSourceResponse, + PutCodeBindingResponse, +} from '@aws-sdk/client-schemas' import * as sinon from 'sinon' import { @@ -61,8 +65,8 @@ describe('CodeDownloader', function () { describe('codeDownloader', async function () { it('should return an error if the response body is not Buffer', async function () { - const response: Schemas.GetCodeBindingSourceResponse = { - Body: 'Invalied body', + const response: GetCodeBindingSourceResponse = { + Body: 'Invalied body' as any, } sandbox.stub(schemaClient, 'getCodeBindingSource').returns(Promise.resolve(response)) @@ -75,8 +79,8 @@ describe('CodeDownloader', function () { it('should return arrayBuffer for valid Body type', async function () { const myBuffer = Buffer.from('TEST STRING') - const response: Schemas.GetCodeBindingSourceResponse = { - Body: myBuffer, + const response: GetCodeBindingSourceResponse = { + Body: myBuffer as any, } sandbox.stub(schemaClient, 'getCodeBindingSource').returns(Promise.resolve(response)) @@ -148,7 +152,7 @@ describe('CodeGenerator', function () { describe('codeGenerator', async function () { it('should return the current status of code generation', async function () { - const response: Schemas.PutCodeBindingResponse = { + const response: PutCodeBindingResponse = { Status: CodeGenerationStatus.CREATE_IN_PROGRESS, } sandbox.stub(schemaClient, 'putCodeBinding').returns(Promise.resolve(response)) @@ -164,7 +168,7 @@ describe('CodeGenerator', function () { // If code bindings were not generated, but putCodeBinding was already called, ConflictException occurs // Return CREATE_IN_PROGRESS and keep polling in this case it('should return valid code generation status if it gets ConflictException', async function () { - const response: Schemas.PutCodeBindingResponse = { + const response: PutCodeBindingResponse = { Status: CodeGenerationStatus.CREATE_IN_PROGRESS, } @@ -224,10 +228,10 @@ describe('CodeGeneratorStatusPoller', function () { describe('getCurrentStatus', async function () { it('should return the current status of code generation', async function () { - const firstStatus: Schemas.DescribeCodeBindingResponse = { + const firstStatus: DescribeCodeBindingResponse = { Status: CodeGenerationStatus.CREATE_IN_PROGRESS, } - const secondStatus: Schemas.DescribeCodeBindingResponse = { + const secondStatus: DescribeCodeBindingResponse = { Status: CodeGenerationStatus.CREATE_COMPLETE, } @@ -245,7 +249,7 @@ describe('CodeGeneratorStatusPoller', function () { describe('codeGeneratorStatusPoller', async function () { it('fails if code generation status is invalid without retry', async function () { - const schemaResponse: Schemas.DescribeCodeBindingResponse = { + const schemaResponse: DescribeCodeBindingResponse = { Status: CodeGenerationStatus.CREATE_FAILED, } @@ -266,7 +270,7 @@ describe('CodeGeneratorStatusPoller', function () { }) it('times out after max attempts if status is still in progress', async function () { - const schemaResponse: Schemas.DescribeCodeBindingResponse = { + const schemaResponse: DescribeCodeBindingResponse = { Status: CodeGenerationStatus.CREATE_IN_PROGRESS, } @@ -290,7 +294,7 @@ describe('CodeGeneratorStatusPoller', function () { }) it('succeeds when code is previously generated without retry', async function () { - const schemaResponse: Schemas.DescribeCodeBindingResponse = { + const schemaResponse: DescribeCodeBindingResponse = { Status: CodeGenerationStatus.CREATE_COMPLETE, } @@ -402,7 +406,7 @@ describe('SchemaCodeDownload', function () { it('should generate code if download fails with ResourceNotFound and place it into requested directory', async function () { sandbox.stub(poller, 'pollForCompletion').returns(Promise.resolve('CREATE_COMPLETE')) const codeDownloaderStub = sandbox.stub(downloader, 'download') - const codeGeneratorResponse: Schemas.PutCodeBindingResponse = { + const codeGeneratorResponse: PutCodeBindingResponse = { Status: 'CREATE_IN_PROGRESS', } sandbox.stub(generator, 'generate').returns(Promise.resolve(codeGeneratorResponse)) diff --git a/packages/core/src/test/eventSchemas/commands/searchSchemas.test.ts b/packages/core/src/test/eventSchemas/commands/searchSchemas.test.ts index 089a971a40c..dd7c2175ccd 100644 --- a/packages/core/src/test/eventSchemas/commands/searchSchemas.test.ts +++ b/packages/core/src/test/eventSchemas/commands/searchSchemas.test.ts @@ -5,7 +5,7 @@ import assert from 'assert' -import { Schemas } from 'aws-sdk' +import { DescribeSchemaResponse, SearchSchemaSummary, SearchSchemaVersionSummary } from '@aws-sdk/client-schemas' import * as sinon from 'sinon' import { SchemasNode } from '../../../eventSchemas/explorer/schemasNode' import { getTabSizeSetting } from '../../../shared/utilities/editorUtilities' @@ -42,25 +42,25 @@ describe('Search Schemas', function () { const failRegistry = 'failRegistry' const failRegistry2 = 'failRegistry2' - const versionSummary1: Schemas.SearchSchemaVersionSummary = { + const versionSummary1: SearchSchemaVersionSummary = { SchemaVersion: '1', } - const versionSummary2: Schemas.SearchSchemaVersionSummary = { + const versionSummary2: SearchSchemaVersionSummary = { SchemaVersion: '2', } - const searchSummary1: Schemas.SearchSchemaSummary = { + const searchSummary1: SearchSchemaSummary = { RegistryName: testRegistry, SchemaName: 'testSchema1', SchemaVersions: [versionSummary1, versionSummary2], } - const searchSummary2: Schemas.SearchSchemaSummary = { + const searchSummary2: SearchSchemaSummary = { RegistryName: testRegistry, SchemaName: 'testSchema2', SchemaVersions: [versionSummary1], } - const searchSummary3: Schemas.SearchSchemaSummary = { + const searchSummary3: SearchSchemaSummary = { RegistryName: testRegistry2, SchemaName: 'testSchema3', SchemaVersions: [versionSummary1], @@ -178,7 +178,7 @@ describe('Search Schemas', function () { const multipleRegistryNames = [testRegistry, testRegistry2] const awsEventSchemaRaw = '{"openapi":"3.0.0","info":{"version":"1.0.0","title":"Event"},"paths":{},"components":{"schemas":{"Event":{"type":"object"}}}}' - const schemaResponse: Schemas.DescribeSchemaResponse = { + const schemaResponse: DescribeSchemaResponse = { Content: awsEventSchemaRaw, } diff --git a/packages/core/src/test/eventSchemas/commands/viewSchemaItem.test.ts b/packages/core/src/test/eventSchemas/commands/viewSchemaItem.test.ts index c7e063dbec2..9127bfe96a5 100644 --- a/packages/core/src/test/eventSchemas/commands/viewSchemaItem.test.ts +++ b/packages/core/src/test/eventSchemas/commands/viewSchemaItem.test.ts @@ -3,8 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Schemas } from 'aws-sdk' - +import { DescribeSchemaResponse } from '@aws-sdk/client-schemas' import assert from 'assert' import * as sinon from 'sinon' import * as vscode from 'vscode' @@ -117,7 +116,7 @@ describe('viewSchemaItem', async function () { } function generateSchemaItemNode(): SchemaItemNode { - const schemaResponse: Schemas.DescribeSchemaResponse = { + const schemaResponse: DescribeSchemaResponse = { Content: awsEventSchemaRaw, } const schemaClient = new DefaultSchemaClient('') diff --git a/packages/core/src/test/eventSchemas/explorer/registryItemNode.test.ts b/packages/core/src/test/eventSchemas/explorer/registryItemNode.test.ts index 5fdd61e5c42..719520cde64 100644 --- a/packages/core/src/test/eventSchemas/explorer/registryItemNode.test.ts +++ b/packages/core/src/test/eventSchemas/explorer/registryItemNode.test.ts @@ -6,7 +6,7 @@ import assert from 'assert' import * as os from 'os' import * as sinon from 'sinon' -import { Schemas } from 'aws-sdk' +import { RegistrySummary, SchemaSummary } from '@aws-sdk/client-schemas' import { RegistryItemNode } from '../../../eventSchemas/explorer/registryItemNode' import { SchemaItemNode } from '../../../eventSchemas/explorer/schemaItemNode' import { SchemasNode } from '../../../eventSchemas/explorer/schemasNode' @@ -21,7 +21,7 @@ import { asyncGenerator } from '../../../shared/utilities/collectionUtils' import { getIcon } from '../../../shared/icons' import { stub } from '../../utilities/stubber' -function createSchemaClient(data?: { schemas?: Schemas.SchemaSummary[]; registries?: Schemas.RegistrySummary[] }) { +function createSchemaClient(data?: { schemas?: SchemaSummary[]; registries?: RegistrySummary[] }) { const client = stub(DefaultSchemaClient, { regionCode: 'code' }) client.listSchemas.callsFake(() => asyncGenerator(data?.schemas ?? [])) client.listRegistries.callsFake(() => asyncGenerator(data?.registries ?? [])) @@ -30,7 +30,7 @@ function createSchemaClient(data?: { schemas?: Schemas.SchemaSummary[]; registri } describe('RegistryItemNode', function () { - let fakeRegistry: Schemas.RegistrySummary + let fakeRegistry: RegistrySummary before(function () { fakeRegistry = { @@ -58,17 +58,17 @@ describe('RegistryItemNode', function () { }) it('returns schemas that belong to Registry', async function () { - const schema1Item: Schemas.SchemaSummary = { + const schema1Item: SchemaSummary = { SchemaArn: 'arn:schema1', SchemaName: 'schema1Name', } - const schema2Item: Schemas.SchemaSummary = { + const schema2Item: SchemaSummary = { SchemaArn: 'arn:schema1', SchemaName: 'schema2Name', } - const schema3Item: Schemas.SchemaSummary = { + const schema3Item: SchemaSummary = { SchemaArn: 'arn:schema1', SchemaName: 'schema3Name', } diff --git a/packages/core/src/test/eventSchemas/model/schemaCodeLangs.test.ts b/packages/core/src/test/eventSchemas/model/schemaCodeLangs.test.ts index 619f7bd035e..6c023a52676 100644 --- a/packages/core/src/test/eventSchemas/model/schemaCodeLangs.test.ts +++ b/packages/core/src/test/eventSchemas/model/schemaCodeLangs.test.ts @@ -10,6 +10,7 @@ import { schemaCodeLangs, } from '../../../eventSchemas/models/schemaCodeLangs' import { samZipLambdaRuntimes } from '../../../lambda/models/samLambdaRuntime' +import { Runtime } from '@aws-sdk/client-lambda' describe('getLanguageDetails', function () { it('should successfully return details for supported languages', function () { @@ -32,7 +33,7 @@ describe('getApiValueForSchemasDownload', function () { case 'python3.9': case 'python3.11': case 'python3.12': - case 'python3.13': + case 'python3.13' as Runtime: case 'python3.10': { const result = getApiValueForSchemasDownload(runtime) assert.strictEqual(result, 'Python36', 'Api value used by schemas api') diff --git a/packages/core/src/test/lambda/commands/copyLambdaUrl.test.ts b/packages/core/src/test/lambda/commands/copyLambdaUrl.test.ts index e55267182a3..acd3b98f052 100644 --- a/packages/core/src/test/lambda/commands/copyLambdaUrl.test.ts +++ b/packages/core/src/test/lambda/commands/copyLambdaUrl.test.ts @@ -10,7 +10,7 @@ import { LambdaFunctionNode } from '../../../lambda/explorer/lambdaFunctionNode' import { DefaultLambdaClient, LambdaClient } from '../../../shared/clients/lambdaClient' import { addCodiconToString } from '../../../shared/utilities/textUtilities' import { env } from 'vscode' -import { FunctionUrlConfig } from 'aws-sdk/clients/lambda' +import { FunctionUrlConfig } from '@aws-sdk/client-lambda' import { createQuickPickPrompterTester } from '../../shared/ui/testUtils' import { getTestWindow } from '../../shared/vscode/window' @@ -22,11 +22,11 @@ import { getTestWindow } from '../../shared/vscode/window' */ export function buildFunctionUrlConfig(options: Partial): FunctionUrlConfig { return { - AuthType: options.AuthType ?? '', - CreationTime: options.CreationTime ?? '', - FunctionArn: options.FunctionArn ?? '', - FunctionUrl: options.FunctionUrl ?? '', - LastModifiedTime: options.LastModifiedTime ?? '', + AuthType: options.AuthType, + CreationTime: options.CreationTime, + FunctionArn: options.FunctionArn, + FunctionUrl: options.FunctionUrl, + LastModifiedTime: options.LastModifiedTime, } } @@ -94,10 +94,10 @@ describe('lambda func url prompter', async () => { const tester = createQuickPickPrompterTester(prompter) tester.assertItems( configList.map((c) => { - return { label: c.FunctionArn, data: c.FunctionUrl } // order matters + return { label: c.FunctionArn!, data: c.FunctionUrl } // order matters }) ) - tester.acceptItem(configList[1].FunctionArn) + tester.acceptItem(configList[1].FunctionArn!) await tester.result(configList[1].FunctionUrl) }) }) diff --git a/packages/core/src/test/lambda/commands/createNewSamApp.test.ts b/packages/core/src/test/lambda/commands/createNewSamApp.test.ts index 8bb25119301..c31f922483c 100644 --- a/packages/core/src/test/lambda/commands/createNewSamApp.test.ts +++ b/packages/core/src/test/lambda/commands/createNewSamApp.test.ts @@ -26,7 +26,7 @@ import { import { normalize } from '../../../shared/utilities/pathUtils' import { getIdeProperties, isCloud9 } from '../../../shared/extensionUtilities' import globals from '../../../shared/extensionGlobals' -import { Runtime } from '../../../shared/telemetry/telemetry' +import { Runtime } from '@aws-sdk/client-lambda' import { stub } from '../../utilities/stubber' import sinon from 'sinon' import { fs } from '../../../shared' diff --git a/packages/core/src/test/lambda/local/debugConfiguration.test.ts b/packages/core/src/test/lambda/local/debugConfiguration.test.ts index 12192127eeb..0a0aab0dc99 100644 --- a/packages/core/src/test/lambda/local/debugConfiguration.test.ts +++ b/packages/core/src/test/lambda/local/debugConfiguration.test.ts @@ -18,7 +18,7 @@ import { CloudFormationTemplateRegistry } from '../../../shared/fs/templateRegis import { getArchitecture, isImageLambdaConfig } from '../../../lambda/local/debugConfiguration' import * as CloudFormation from '../../../shared/cloudformation/cloudformation' import globals from '../../../shared/extensionGlobals' -import { Runtime } from '../../../shared/telemetry/telemetry' +import { Runtime } from '@aws-sdk/client-lambda' import { fs } from '../../../shared' describe('makeCoreCLRDebugConfiguration', function () { diff --git a/packages/core/src/test/lambda/models/samLambdaRuntime.test.ts b/packages/core/src/test/lambda/models/samLambdaRuntime.test.ts index f47cc3fe06b..566c465a0dd 100644 --- a/packages/core/src/test/lambda/models/samLambdaRuntime.test.ts +++ b/packages/core/src/test/lambda/models/samLambdaRuntime.test.ts @@ -4,7 +4,6 @@ */ import assert from 'assert' -import { Runtime } from 'aws-sdk/clients/lambda' import { compareSamLambdaRuntime, getDependencyManager, @@ -16,11 +15,12 @@ import { getNodeMajorVersion, nodeJsRuntimes, } from '../../../lambda/models/samLambdaRuntime' +import { Runtime } from '@aws-sdk/client-lambda' describe('compareSamLambdaRuntime', async function () { const scenarios: { - lowerRuntime: Runtime - higherRuntime: Runtime + lowerRuntime: string + higherRuntime: string }[] = [ { lowerRuntime: 'nodejs14.x', higherRuntime: 'nodejs16.x' }, { lowerRuntime: 'nodejs16.x', higherRuntime: 'nodejs16.x (Image)' }, @@ -48,13 +48,13 @@ describe('getDependencyManager', function () { assert.throws(() => getDependencyManager('nodejs')) }) it('throws on unknown runtimes', function () { - assert.throws(() => getDependencyManager('BASIC')) + assert.throws(() => getDependencyManager('BASIC' as Runtime)) }) }) describe('getFamily', function () { it('unknown runtime name', function () { - assert.strictEqual(getFamily('foo'), RuntimeFamily.Unknown) + assert.strictEqual(getFamily('foo' as Runtime), RuntimeFamily.Unknown) }) it('handles all known runtimes', function () { for (const runtime of samZipLambdaRuntimes) { diff --git a/packages/core/src/test/lambda/models/samTemplates.test.ts b/packages/core/src/test/lambda/models/samTemplates.test.ts index 4abb3f87315..7fe78e630c8 100644 --- a/packages/core/src/test/lambda/models/samTemplates.test.ts +++ b/packages/core/src/test/lambda/models/samTemplates.test.ts @@ -20,6 +20,7 @@ import { import { Set } from 'immutable' import { samZipLambdaRuntimes } from '../../../lambda/models/samLambdaRuntime' +import { Runtime } from '@aws-sdk/client-lambda' let validTemplateOptions: Set let validPythonTemplateOptions: Set @@ -66,7 +67,7 @@ describe('getSamTemplateWizardOption', function () { case 'python3.10': case 'python3.11': case 'python3.12': - case 'python3.13': + case 'python3.13' as Runtime: assert.deepStrictEqual( result, validPythonTemplateOptions, diff --git a/packages/core/src/test/lambda/remoteDebugging/ldkClient.test.ts b/packages/core/src/test/lambda/remoteDebugging/ldkClient.test.ts index 91f99aa0409..98734e51833 100644 --- a/packages/core/src/test/lambda/remoteDebugging/ldkClient.test.ts +++ b/packages/core/src/test/lambda/remoteDebugging/ldkClient.test.ts @@ -5,19 +5,30 @@ import assert from 'assert' import sinon from 'sinon' -import { Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import { LdkClient, getRegionFromArn, isTunnelInfo } from '../../../lambda/remoteDebugging/ldkClient' import { LocalProxy } from '../../../lambda/remoteDebugging/localProxy' import * as utils from '../../../lambda/remoteDebugging/utils' import * as telemetryUtil from '../../../shared/telemetry/util' import globals from '../../../shared/extensionGlobals' import { createMockFunctionConfig, createMockProgress } from './testUtils' +import { + IoTSecureTunnelingClient, + IoTSecureTunnelingClientResolvedConfig, + ListTunnelsCommand, + OpenTunnelCommand, + RotateTunnelAccessTokenCommand, + ServiceInputTypes, + ServiceOutputTypes, + TunnelStatus, +} from '@aws-sdk/client-iotsecuretunneling' +import { AwsStub, mockClient } from 'aws-sdk-client-mock' describe('LdkClient', () => { let sandbox: sinon.SinonSandbox let ldkClient: LdkClient let mockLambdaClient: any - let mockIoTSTClient: any + let mockIoTSTClient: AwsStub let mockLocalProxy: any beforeEach(() => { @@ -32,15 +43,8 @@ describe('LdkClient', () => { } sandbox.stub(utils, 'getLambdaClientWithAgent').returns(mockLambdaClient) - // Mock IoT ST client with proper promise structure - const createPromiseStub = () => sandbox.stub() - mockIoTSTClient = { - listTunnels: sandbox.stub().returns({ promise: createPromiseStub() }), - openTunnel: sandbox.stub().returns({ promise: createPromiseStub() }), - closeTunnel: sandbox.stub().returns({ promise: createPromiseStub() }), - rotateTunnelAccessToken: sandbox.stub().returns({ promise: createPromiseStub() }), - } - sandbox.stub(utils, 'getIoTSTClientWithAgent').resolves(mockIoTSTClient) + mockIoTSTClient = mockClient(IoTSecureTunnelingClient) + sandbox.stub(utils, 'getIoTSTClientWithAgent').returns(mockIoTSTClient as any) // Mock LocalProxy mockLocalProxy = { @@ -105,8 +109,8 @@ describe('LdkClient', () => { describe('createOrReuseTunnel()', () => { it('should create new tunnel when none exists', async () => { - mockIoTSTClient.listTunnels().promise.resolves({ tunnelSummaries: [] }) - mockIoTSTClient.openTunnel().promise.resolves({ + mockIoTSTClient.on(ListTunnelsCommand).resolves({ tunnelSummaries: [] }) + mockIoTSTClient.on(OpenTunnelCommand).resolves({ tunnelId: 'tunnel-123', sourceAccessToken: 'source-token', destinationAccessToken: 'dest-token', @@ -118,20 +122,24 @@ describe('LdkClient', () => { assert.strictEqual(result?.tunnelID, 'tunnel-123') assert.strictEqual(result?.sourceToken, 'source-token') assert.strictEqual(result?.destinationToken, 'dest-token') - assert(mockIoTSTClient.listTunnels.called, 'Should list existing tunnels') - assert(mockIoTSTClient.openTunnel.called, 'Should create new tunnel') + assert.strictEqual( + mockIoTSTClient.commandCalls(ListTunnelsCommand).length, + 1, + 'Should list existing tunnels' + ) + assert.strictEqual(mockIoTSTClient.commandCalls(OpenTunnelCommand).length, 1, 'Should create new tunnel') }) it('should reuse existing tunnel with sufficient time remaining', async () => { const existingTunnel = { tunnelId: 'existing-tunnel', description: 'RemoteDebugging+test-client-id', - status: 'OPEN', + status: TunnelStatus.OPEN, createdAt: new Date(Date.now() - 60 * 60 * 1000), // 1 hour ago } - mockIoTSTClient.listTunnels().promise.resolves({ tunnelSummaries: [existingTunnel] }) - mockIoTSTClient.rotateTunnelAccessToken().promise.resolves({ + mockIoTSTClient.on(ListTunnelsCommand).resolves({ tunnelSummaries: [existingTunnel] }) + mockIoTSTClient.on(RotateTunnelAccessTokenCommand).resolves({ sourceAccessToken: 'rotated-source-token', destinationAccessToken: 'rotated-dest-token', }) @@ -145,8 +153,8 @@ describe('LdkClient', () => { }) it('should handle tunnel creation errors', async () => { - mockIoTSTClient.listTunnels().promise.resolves({ tunnelSummaries: [] }) - mockIoTSTClient.openTunnel().promise.rejects(new Error('Tunnel creation failed')) + mockIoTSTClient.on(ListTunnelsCommand).resolves({ tunnelSummaries: [] }) + mockIoTSTClient.on(OpenTunnelCommand).rejects(new Error('Tunnel creation failed')) await assert.rejects( async () => await ldkClient.createOrReuseTunnel('us-east-1'), @@ -158,7 +166,7 @@ describe('LdkClient', () => { describe('refreshTunnelTokens()', () => { it('should refresh tunnel tokens successfully', async () => { - mockIoTSTClient.rotateTunnelAccessToken().promise.resolves({ + mockIoTSTClient.on(RotateTunnelAccessTokenCommand).resolves({ sourceAccessToken: 'new-source-token', destinationAccessToken: 'new-dest-token', }) @@ -172,7 +180,7 @@ describe('LdkClient', () => { }) it('should handle token refresh errors', async () => { - mockIoTSTClient.rotateTunnelAccessToken().promise.rejects(new Error('Token refresh failed')) + mockIoTSTClient.on(RotateTunnelAccessTokenCommand).rejects(new Error('Token refresh failed')) await assert.rejects( async () => await ldkClient.refreshTunnelTokens('tunnel-123', 'us-east-1'), @@ -183,7 +191,7 @@ describe('LdkClient', () => { }) describe('getFunctionDetail()', () => { - const mockFunctionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig({ + const mockFunctionConfig: FunctionConfiguration = createMockFunctionConfig({ FunctionArn: 'arn:aws:lambda:us-east-1:123456789012:function:testFunction', }) @@ -212,7 +220,7 @@ describe('LdkClient', () => { }) describe('createDebugDeployment()', () => { - const mockFunctionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig({ + const mockFunctionConfig: FunctionConfiguration = createMockFunctionConfig({ FunctionArn: 'arn:aws:lambda:us-east-1:123456789012:function:testFunction', }) @@ -291,7 +299,7 @@ describe('LdkClient', () => { }) describe('removeDebugDeployment()', () => { - const mockFunctionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig({ + const mockFunctionConfig: FunctionConfiguration = createMockFunctionConfig({ FunctionArn: 'arn:aws:lambda:us-east-1:123456789012:function:testFunction', }) @@ -415,6 +423,92 @@ describe('LdkClient', () => { assert.strictEqual(result, true, 'Should return true when no proxy to stop') }) }) + + describe('Client User-Agent', () => { + it('should create Lambda client with correct user-agent', async () => { + // Restore the existing stub and create a new one to track calls + const existingStub = (utils.getLambdaClientWithAgent as any).restore + ? (utils.getLambdaClientWithAgent as sinon.SinonStub) + : undefined + if (existingStub) { + existingStub.restore() + } + + // Stub getUserAgent at the telemetryUtil level to return a known value + const getUserAgentStub = sandbox.stub(telemetryUtil, 'getUserAgent') + getUserAgentStub.returns('test-user-agent') + + // Stub the sdkClientBuilderV3 to capture the client options + let capturedClientOptions: any + const createAwsServiceStub = sandbox.stub(globals.sdkClientBuilderV3, 'createAwsService') + createAwsServiceStub.callsFake((options: any) => { + capturedClientOptions = options + // Return a mock Lambda client that has the required methods + return { + send: async () => ({ + Configuration: createMockFunctionConfig({ + FunctionArn: 'arn:aws:lambda:us-east-1:123456789012:function:testFunction', + }), + }), + middlewareStack: {} as any, + destroy: () => {}, + } as any + }) + + const mockFunctionConfig: FunctionConfiguration = createMockFunctionConfig({ + FunctionArn: 'arn:aws:lambda:us-east-1:123456789012:function:testFunction', + }) + + await ldkClient.getFunctionDetail(mockFunctionConfig.FunctionArn!) + + assert(createAwsServiceStub.called, 'Should call createAwsService') + assert.strictEqual(capturedClientOptions.clientOptions.region, 'us-east-1', 'Should use correct region') + assert.deepStrictEqual( + capturedClientOptions.clientOptions.userAgent, + [['LAMBDA-DEBUG/1.0.0 test-user-agent']], + 'Should include correct user-agent with LAMBDA-DEBUG prefix in Lambda API calls' + ) + }) + + it('should create IoT client with correct user-agent', async () => { + // Restore the existing stub and create a new one to track calls + const existingStub = (utils.getIoTSTClientWithAgent as any).restore + ? (utils.getIoTSTClientWithAgent as sinon.SinonStub) + : undefined + if (existingStub) { + existingStub.restore() + } + + // Stub getUserAgent to return a known value + const getUserAgentStub = sandbox.stub(telemetryUtil, 'getUserAgent') + getUserAgentStub.returns('test-user-agent') + + // Stub the sdkClientBuilderV3 to capture the client options + let capturedClientOptions: any + const createAwsServiceStub = sandbox.stub(globals.sdkClientBuilderV3, 'createAwsService') + createAwsServiceStub.callsFake((options: any) => { + capturedClientOptions = options + return mockIoTSTClient as any + }) + + mockIoTSTClient.on(ListTunnelsCommand).resolves({ tunnelSummaries: [] }) + mockIoTSTClient.on(OpenTunnelCommand).resolves({ + tunnelId: 'tunnel-123', + sourceAccessToken: 'source-token', + destinationAccessToken: 'dest-token', + }) + + await ldkClient.createOrReuseTunnel('us-east-1') + + assert(createAwsServiceStub.calledOnce, 'Should call createAwsService once') + assert.strictEqual(capturedClientOptions.clientOptions.region, 'us-east-1', 'Should use correct region') + assert.deepStrictEqual( + capturedClientOptions.clientOptions.userAgent, + [['LAMBDA-DEBUG/1.0.0 test-user-agent']], + 'Should include correct user-agent with LAMBDA-DEBUG prefix' + ) + }) + }) }) describe('Helper Functions', () => { diff --git a/packages/core/src/test/lambda/remoteDebugging/ldkController.test.ts b/packages/core/src/test/lambda/remoteDebugging/ldkController.test.ts index 3975fc5a3c9..040264a9ff8 100644 --- a/packages/core/src/test/lambda/remoteDebugging/ldkController.test.ts +++ b/packages/core/src/test/lambda/remoteDebugging/ldkController.test.ts @@ -6,7 +6,7 @@ import assert from 'assert' import * as vscode from 'vscode' import sinon, { SinonStubbedInstance, createStubInstance } from 'sinon' -import { Lambda } from 'aws-sdk' +import { FunctionConfiguration } from '@aws-sdk/client-lambda' import { RemoteDebugController, activateRemoteDebugging, @@ -203,7 +203,7 @@ describe('RemoteDebugController', () => { describe('Debug Session Management', () => { let mockConfig: DebugConfig - let mockFunctionConfig: Lambda.FunctionConfiguration + let mockFunctionConfig: FunctionConfiguration beforeEach(() => { mockConfig = createMockDebugConfig({ @@ -409,7 +409,7 @@ describe('RemoteDebugController', () => { describe('Telemetry Verification', () => { let mockConfig: DebugConfig - let mockFunctionConfig: Lambda.FunctionConfiguration + let mockFunctionConfig: FunctionConfiguration beforeEach(() => { mockConfig = createMockDebugConfig({ @@ -478,7 +478,7 @@ describe('tryAutoDetectOutFile', () => { const debugConfig: DebugConfig = createMockDebugConfig({ handlerFile: '/path/to/handler.js', // JavaScript file, not TypeScript }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig() + const functionConfig: FunctionConfiguration = createMockFunctionConfig() const result = await tryAutoDetectOutFile(debugConfig, functionConfig) @@ -489,7 +489,7 @@ describe('tryAutoDetectOutFile', () => { const debugConfig: DebugConfig = createMockDebugConfig({ handlerFile: undefined, }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig() + const functionConfig: FunctionConfiguration = createMockFunctionConfig() const result = await tryAutoDetectOutFile(debugConfig, functionConfig) @@ -504,7 +504,7 @@ describe('tryAutoDetectOutFile', () => { samProjectRoot: testSamProjectRoot, samFunctionLogicalId: testSamLogicalId, }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig() + const functionConfig: FunctionConfiguration = createMockFunctionConfig() // Mock fs.exists to return true for SAM build path sandbox.stub(fs, 'exists').resolves(true) @@ -520,7 +520,7 @@ describe('tryAutoDetectOutFile', () => { samProjectRoot: testSamProjectRoot, samFunctionLogicalId: testSamLogicalId, }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig() + const functionConfig: FunctionConfiguration = createMockFunctionConfig() // Mock fs.exists to return false sandbox.stub(fs, 'exists').resolves(false) @@ -536,7 +536,7 @@ describe('tryAutoDetectOutFile', () => { const debugConfig: DebugConfig = createMockDebugConfig({ handlerFile: '/path/to/cdk-project/src/handler.ts', }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig({ + const functionConfig: FunctionConfiguration = createMockFunctionConfig({ FunctionName: testFunctionName, }) @@ -579,7 +579,7 @@ describe('tryAutoDetectOutFile', () => { assert.strictEqual(result, expectedAssetDir.fsPath, 'Should return CDK asset directory path') - const functionNonExistConfig: Lambda.FunctionConfiguration = createMockFunctionConfig({ + const functionNonExistConfig: FunctionConfiguration = createMockFunctionConfig({ FunctionName: 'NonExistentFunction', }) const result2 = await tryAutoDetectOutFile(debugConfig, functionNonExistConfig) @@ -597,7 +597,7 @@ describe('tryAutoDetectOutFile', () => { const debugConfig: DebugConfig = createMockDebugConfig({ handlerFile: '/path/to/handler.ts', }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig() + const functionConfig: FunctionConfiguration = createMockFunctionConfig() // Mock no workspace folder sandbox.stub(vscode.workspace, 'getWorkspaceFolder').returns(undefined) @@ -615,7 +615,7 @@ describe('tryAutoDetectOutFile', () => { samProjectRoot: testSamProjectRoot, samFunctionLogicalId: testSamLogicalId, }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig({ + const functionConfig: FunctionConfiguration = createMockFunctionConfig({ FunctionName: testFunctionName, }) @@ -637,7 +637,7 @@ describe('tryAutoDetectOutFile', () => { samProjectRoot: testSamProjectRoot, samFunctionLogicalId: testSamLogicalId, }) - const functionConfig: Lambda.FunctionConfiguration = createMockFunctionConfig() + const functionConfig: FunctionConfiguration = createMockFunctionConfig() // Mock fs.exists to return true sandbox.stub(fs, 'exists').resolves(true) diff --git a/packages/core/src/test/lambda/remoteDebugging/localStackLambdaDebugger.test.ts b/packages/core/src/test/lambda/remoteDebugging/localStackLambdaDebugger.test.ts index 46448cbbc08..d91fc150f71 100644 --- a/packages/core/src/test/lambda/remoteDebugging/localStackLambdaDebugger.test.ts +++ b/packages/core/src/test/lambda/remoteDebugging/localStackLambdaDebugger.test.ts @@ -18,7 +18,7 @@ import { setupMockVSCodeDebugAPIs, } from './testUtils' import { DebugConfig } from '../../../lambda/remoteDebugging/lambdaDebugger' -import { Lambda } from 'aws-sdk' +import { FunctionConfiguration, Runtime } from '@aws-sdk/client-lambda' import { assertTelemetry } from '../../testUtil' import * as remoteDebuggingUtils from '../../../lambda/remoteDebugging/utils' import { DefaultLambdaClient } from '../../../shared/clients/lambdaClient' @@ -31,7 +31,7 @@ describe('RemoteDebugController with LocalStackLambdaDebugger', () => { let controller: RemoteDebugController let mockGlobalState: any let mockConfig: DebugConfig - let mockFunctionConfig: Lambda.FunctionConfiguration + let mockFunctionConfig: FunctionConfiguration let fetchStub: sinon.SinonStub beforeEach(() => { @@ -60,7 +60,7 @@ describe('RemoteDebugController with LocalStackLambdaDebugger', () => { layerArn: undefined, lambdaTimeout: undefined, }) - mockFunctionConfig = createMockFunctionConfig({ Runtime: 'nodejs22.x' }) + mockFunctionConfig = createMockFunctionConfig({ Runtime: 'nodejs22.x' as Runtime }) }) afterEach(() => { diff --git a/packages/core/src/test/lambda/remoteDebugging/testUtils.ts b/packages/core/src/test/lambda/remoteDebugging/testUtils.ts index 03aec290426..42deaa4ec96 100644 --- a/packages/core/src/test/lambda/remoteDebugging/testUtils.ts +++ b/packages/core/src/test/lambda/remoteDebugging/testUtils.ts @@ -4,7 +4,7 @@ */ import sinon from 'sinon' -import { Lambda } from 'aws-sdk' +import { Architecture, FunctionConfiguration, Runtime, SnapStartApplyOn } from '@aws-sdk/client-lambda' import { LambdaFunctionNode } from '../../../lambda/explorer/lambdaFunctionNode' import { InitialData } from '../../../lambda/vue/remoteInvoke/invokeLambda' import type { DebugConfig } from '../../../lambda/remoteDebugging/lambdaDebugger' @@ -12,19 +12,17 @@ import type { DebugConfig } from '../../../lambda/remoteDebugging/lambdaDebugger /** * Creates a mock Lambda function configuration for testing */ -export function createMockFunctionConfig( - overrides: Partial = {} -): Lambda.FunctionConfiguration { +export function createMockFunctionConfig(overrides: Partial = {}): FunctionConfiguration { return { FunctionName: 'testFunction', FunctionArn: 'arn:aws:lambda:us-west-2:123456789012:function:testFunction', - Runtime: 'nodejs18.x', + Runtime: Runtime.nodejs18x, Handler: 'index.handler', Timeout: 30, Layers: [], Environment: { Variables: {} }, - Architectures: ['x86_64'], - SnapStart: { ApplyOn: 'None' }, + Architectures: [Architecture.x86_64], + SnapStart: { ApplyOn: SnapStartApplyOn.None }, ...overrides, } } diff --git a/packages/core/src/test/lambda/utils.test.ts b/packages/core/src/test/lambda/utils.test.ts index a3eebe043a7..7a8e82043cf 100644 --- a/packages/core/src/test/lambda/utils.test.ts +++ b/packages/core/src/test/lambda/utils.test.ts @@ -18,6 +18,7 @@ import { DefaultLambdaClient } from '../../shared/clients/lambdaClient' import { fs } from '../../shared/fs/fs' import { tempDirPath } from '../../shared/filesystemUtilities' import path from 'path' +import { Runtime } from '@aws-sdk/client-lambda' describe('lambda utils', function () { const mockLambda = { @@ -67,7 +68,7 @@ describe('lambda utils', function () { }) ) // runtime that isn't present, period - assert.throws(() => getLambdaDetails({ Runtime: 'COBOL-60', Handler: 'asdf.asdf' })) + assert.throws(() => getLambdaDetails({ Runtime: 'COBOL-60' as Runtime, Handler: 'asdf.asdf' })) }) }) diff --git a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts index c560331f606..4d2aaa6c507 100644 --- a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts +++ b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambda.test.ts @@ -22,6 +22,7 @@ import * as samCliRemoteTestEvent from '../../../../shared/sam/cli/samCliRemoteT import { TestEventsOperation, SamCliRemoteTestEventsParameters } from '../../../../shared/sam/cli/samCliRemoteTestEvent' import { assertLogsContain } from '../../../globalSetup.test' import { createResponse } from '../../../testUtil' +import { InvocationResponse } from '@aws-sdk/client-lambda' describe('RemoteInvokeWebview', () => { let outputChannel: vscode.OutputChannel @@ -62,8 +63,8 @@ describe('RemoteInvokeWebview', () => { const input = '{"key": "value"}' const mockResponse = { LogResult: Buffer.from('Test log').toString('base64'), - Payload: '{"result": "success"}', - } + Payload: new TextEncoder().encode('{"result": "success"}'), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) const appendedLines: string[] = [] @@ -88,8 +89,8 @@ describe('RemoteInvokeWebview', () => { it('handles Lambda invocation with no payload', async () => { const mockResponse = { LogResult: Buffer.from('Test log').toString('base64'), - Payload: '', - } + Payload: new TextEncoder().encode(''), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) const appendedLines: string[] = [] @@ -112,8 +113,8 @@ describe('RemoteInvokeWebview', () => { }) it('handles Lambda invocation with undefined LogResult', async () => { const mockResponse = { - Payload: '{"result": "success"}', - } + Payload: new TextEncoder().encode('{"result": "success"}'), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) @@ -852,6 +853,7 @@ describe('RemoteInvokeWebview', () => { CodeSha256: 'abc123', }, } as any + data.Runtime = 'nodejs20.x' getLambdaHandlerFileStub.resolves(vscode.Uri.file(handlerPath)) fsExistsStub.resolves(true) diff --git a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts index 8e2bc15b001..79f7863cd09 100644 --- a/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts +++ b/packages/core/src/test/lambda/vue/remoteInvoke/invokeLambdaDebugging.test.ts @@ -20,6 +20,7 @@ import globals from '../../../../shared/extensionGlobals' import fs from '../../../../shared/fs/fs' import { ToolkitError } from '../../../../shared' import { createMockDebugConfig } from '../../remoteDebugging/testUtils' +import { InvocationResponse } from '@aws-sdk/client-lambda' describe('RemoteInvokeWebview - Debugging Functionality', () => { let outputChannel: vscode.OutputChannel @@ -375,8 +376,8 @@ describe('RemoteInvokeWebview - Debugging Functionality', () => { it('should invoke lambda with remote debugging enabled', async () => { const mockResponse = { LogResult: Buffer.from('Debug log').toString('base64'), - Payload: '{"result": "debug success"}', - } + Payload: new TextEncoder().encode('{"result": "debug success"}'), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) mockDebugController.isDebugging = true mockDebugController.qualifier = 'v1' @@ -392,8 +393,8 @@ describe('RemoteInvokeWebview - Debugging Functionality', () => { it('should handle timer management during debugging invocation', async () => { const mockResponse = { LogResult: Buffer.from('Debug log').toString('base64'), - Payload: '{"result": "debug success"}', - } + Payload: new TextEncoder().encode('{"result": "debug success"}'), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) mockDebugController.isDebugging = true @@ -501,8 +502,8 @@ describe('RemoteInvokeWebview - Debugging Functionality', () => { // 2. Test lambda invocation during debugging const mockResponse = { LogResult: Buffer.from('Debug invocation log').toString('base64'), - Payload: '{"debugResult": "success"}', - } + Payload: new TextEncoder().encode('{"debugResult": "success"}'), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) await remoteInvokeWebview.invokeLambda('{"debugInput": "test"}', 'integration-test', true) @@ -562,8 +563,8 @@ describe('RemoteInvokeWebview - Debugging Functionality', () => { // Test invocation with version qualifier const mockResponse = { LogResult: Buffer.from('Version debug log').toString('base64'), - Payload: '{"versionResult": "success"}', - } + Payload: new TextEncoder().encode('{"versionResult": "success"}'), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) await remoteInvokeWebview.invokeLambda('{"versionInput": "test"}', 'version-test', true) diff --git a/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts b/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts index 0fc94674c1e..852ba43d5bd 100644 --- a/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts +++ b/packages/core/src/test/lambda/vue/remoteInvoke/remoteInvoke.test.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode' import * as samCliRemoteTestEvent from '../../../../shared/sam/cli/samCliRemoteTestEvent' import { TestEventsOperation } from '../../../../shared/sam/cli/samCliRemoteTestEvent' import sinon, { SinonStubbedInstance, createStubInstance } from 'sinon' -import { Lambda } from 'aws-sdk' +import { InvocationResponse } from '@aws-sdk/client-lambda' // Tests to check that the internal integration between the functions operates correctly @@ -31,10 +31,10 @@ describe('RemoteInvokeWebview', function () { describe('Invoke Remote Lambda Function with Payload', () => { it('should invoke with a simple payload', async function () { const input = '{"key": "value"}' - const mockResponse: Lambda.InvocationResponse = { + const mockResponse = { LogResult: Buffer.from('Test log').toString('base64'), - Payload: '{"result": "success"}', - } + Payload: new TextEncoder().encode('{"result": "success"}'), + } satisfies InvocationResponse client.invoke.resolves(mockResponse) await remoteInvokeWebview.invokeLambda(input) sinon.assert.calledOnce(client.invoke) diff --git a/packages/core/src/test/setupUtil.ts b/packages/core/src/test/setupUtil.ts index d0a4cd0b594..5e00b06ff5e 100644 --- a/packages/core/src/test/setupUtil.ts +++ b/packages/core/src/test/setupUtil.ts @@ -4,7 +4,8 @@ */ import { parse } from '@aws-sdk/util-arn-parser' -import { Lambda, STS } from 'aws-sdk' +import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda' +import { STSClient, GetCallerIdentityCommand } from '@aws-sdk/client-sts' import * as vscode from 'vscode' import { getLogger } from '../shared/logger' import { hasKey } from '../shared/utilities/tsUtils' @@ -135,13 +136,13 @@ export function patchObjectDescriptor, U extends k async function createLambdaClient(functionId: string) { if (!functionId.startsWith('arn:aws:lambda')) { - return Object.assign(new Lambda(), { isCrossAccount: false }) + return Object.assign(new LambdaClient({}), { isCrossAccount: false }) } - const sts = new STS() + const sts = new STSClient({}) const { region, accountId } = parse(functionId) - const identity = await sts.getCallerIdentity().promise() - const client = new Lambda({ region }) + const identity = await sts.send(new GetCallerIdentityCommand({})) + const client = new LambdaClient({ region }) return Object.assign(client, { isCrossAccount: identity.Account !== accountId }) } @@ -149,14 +150,15 @@ async function createLambdaClient(functionId: string) { export async function invokeLambda(id: string, request: unknown): Promise { const client = await createLambdaClient(id) const response = await client - .invoke({ - FunctionName: id, - // Setting this to `Tail` with cross account calls results in - // `AccessDeniedException: Cross-account log access is not allowed` - LogType: client.isCrossAccount ? 'None' : 'Tail', - Payload: JSON.stringify(request), - }) - .promise() + .send( + new InvokeCommand({ + FunctionName: id, + // Setting this to `Tail` with cross account calls results in + // `AccessDeniedException: Cross-account log access is not allowed` + LogType: client.isCrossAccount ? 'None' : 'Tail', + Payload: JSON.stringify(request), + }) + ) .catch((err) => { if (err instanceof Error) { err.message = maskArns(err.message) @@ -168,10 +170,10 @@ export async function invokeLambda(id: string, request: unknown): Promise { const expectedStackName = 'myStack' @@ -171,7 +172,7 @@ describe('generateDeployedNode', () => { FunctionArn: 'arn:aws:lambda:us-east-1:123456789012:function:my-project-lambda-function', Runtime: 'python3.12', }, - } as AWS.Lambda.GetFunctionResponse + } as GetFunctionResponse mockDefaultLambdaClientInstance.getFunction.resolves(defaultLambdaClientGetFunctionResponse) diff --git a/packages/core/src/test/shared/applicationBuilder/explorer/nodes/resourceNode.test.ts b/packages/core/src/test/shared/applicationBuilder/explorer/nodes/resourceNode.test.ts index 8c30933dbf7..ca01168cd9a 100644 --- a/packages/core/src/test/shared/applicationBuilder/explorer/nodes/resourceNode.test.ts +++ b/packages/core/src/test/shared/applicationBuilder/explorer/nodes/resourceNode.test.ts @@ -147,7 +147,7 @@ describe('ResourceNode', () => { Method: undefined, }, ], - } + } satisfies ResourceTreeEntity const workspaceFolder = { uri: vscode.Uri.parse('myworkspace'), name: 'my-workspace', diff --git a/packages/core/src/test/shared/clients/defaultIotClient.test.ts b/packages/core/src/test/shared/clients/defaultIotClient.test.ts index a42e6a691af..01cd2740f6a 100644 --- a/packages/core/src/test/shared/clients/defaultIotClient.test.ts +++ b/packages/core/src/test/shared/clients/defaultIotClient.test.ts @@ -4,16 +4,91 @@ */ import assert from 'assert' -import { AWSError, Request, Iot, Endpoint, Config } from 'aws-sdk' +import { ServiceException } from '@smithy/smithy-client' +import { + AttachPolicyCommand, + AttachPolicyRequest, + AttachThingPrincipalCommand, + AttachThingPrincipalRequest, + CreateKeysAndCertificateCommand, + CreateKeysAndCertificateRequest, + CreateKeysAndCertificateResponse, + CreatePolicyCommand, + CreatePolicyRequest, + CreatePolicyResponse, + CreatePolicyVersionCommand, + CreatePolicyVersionRequest, + CreatePolicyVersionResponse, + CreateThingCommand, + CreateThingResponse, + DeleteCertificateCommand, + DeleteCertificateRequest, + DeletePolicyCommand, + DeletePolicyRequest, + DeletePolicyVersionCommand, + DeletePolicyVersionRequest, + DeleteThingCommand, + DeleteThingRequest, + DeleteThingResponse, + DescribeCertificateCommand, + DescribeCertificateRequest, + DescribeCertificateResponse, + DescribeEndpointCommand, + DescribeEndpointRequest, + DescribeEndpointResponse, + DetachPolicyCommand, + DetachPolicyRequest, + DetachThingPrincipalCommand, + DetachThingPrincipalRequest, + GetPolicyVersionCommand, + GetPolicyVersionRequest, + GetPolicyVersionResponse, + IoTClient, + IoTClientResolvedConfig, + ListCertificatesCommand, + ListCertificatesRequest, + ListCertificatesResponse, + ListPoliciesCommand, + ListPoliciesRequest, + ListPoliciesResponse, + ListPolicyVersionsCommand, + ListPolicyVersionsRequest, + ListPolicyVersionsResponse, + ListPrincipalPoliciesCommand, + ListPrincipalPoliciesRequest, + ListPrincipalThingsCommand, + ListPrincipalThingsRequest, + ListPrincipalThingsResponse, + ListTargetsForPolicyCommand, + ListTargetsForPolicyRequest, + ListTargetsForPolicyResponse, + ListThingPrincipalsCommand, + ListThingPrincipalsRequest, + ListThingPrincipalsResponse, + ListThingsCommand, + ListThingsRequest, + ListThingsResponse, + PolicyVersion, + ServiceInputTypes, + ServiceOutputTypes, + SetDefaultPolicyVersionCommand, + SetDefaultPolicyVersionRequest, + UpdateCertificateCommand, + UpdateCertificateRequest, +} from '@aws-sdk/client-iot' import { DefaultIotClient, ListThingCertificatesResponse } from '../../../shared/clients/iotClient' -import { Stub, stub } from '../../utilities/stubber' -import sinon from 'sinon' +import { AwsStub, mockClient } from 'aws-sdk-client-mock' -class FakeAwsError extends Error { +class FakeServiceException extends ServiceException { public region: string = 'us-west-2' public constructor(message: string) { - super(message) + super({ + name: 'FakeServiceException', + $fault: 'client', + $metadata: {}, + message, + }) } } @@ -26,55 +101,33 @@ describe('DefaultIotClient', function () { const marker = nextToken const maxResults = 10 const pageSize = maxResults - let mockIot: Stub + let mockIot: AwsStub beforeEach(function () { - mockIot = stub(Iot, { - config: stub(Config), - apiVersions: [], - endpoint: stub(Endpoint, { - host: '', - hostname: '', - href: '', - port: 0, - protocol: '', - }), - }) + mockIot = mockClient(IoTClient) }) - const error: AWSError = new FakeAwsError('Expected failure') as AWSError - - function success(output?: T): Request { - return { - promise: () => Promise.resolve(output), - } as Request - } - - function failure(): Request { - return { - promise: () => Promise.reject(error), - } as Request - } + const error: ServiceException = new FakeServiceException('Expected failure') as ServiceException function createClient({ regionCode = region }: { regionCode?: string } = {}): DefaultIotClient { - return new DefaultIotClient(regionCode, () => Promise.resolve(mockIot)) + return new DefaultIotClient(regionCode, () => new IoTClient()) } /* Functions that create or retrieve resources. */ describe('createThing', function () { - const expectedResponse: Iot.CreateThingResponse = { thingName: thingName, thingArn: 'arn' } + const expectedResponse: CreateThingResponse = { thingName: thingName, thingArn: 'arn' } it('creates a thing', async function () { - mockIot.createThing.returns(success(expectedResponse)) + mockIot.on(CreateThingCommand).resolves(expectedResponse) const response = await createClient().createThing({ thingName }) - assert(mockIot.createThing.calledOnceWithExactly) + assert.strictEqual(mockIot.commandCalls(CreateThingCommand).length, 1) assert.deepStrictEqual(response, expectedResponse) }) it('throws an Error on failure', async function () { - mockIot.createThing.returns(failure()) + mockIot.on(CreateThingCommand).rejects(error) await assert.rejects(createClient().createThing({ thingName }), error) }) @@ -82,8 +135,8 @@ describe('DefaultIotClient', function () { describe('createCertificateAndKeys', function () { const certificateId = 'cert1' - const input: Iot.CreateKeysAndCertificateRequest = { setAsActive: undefined } - const expectedResponse: Iot.CreateKeysAndCertificateResponse = { + const input: CreateKeysAndCertificateRequest = { setAsActive: undefined } + const expectedResponse: CreateKeysAndCertificateResponse = { certificateId, certificateArn: 'arn', certificatePem: 'pem', @@ -91,7 +144,7 @@ describe('DefaultIotClient', function () { } it('creates Certificate and Key Pair', async function () { - mockIot.createKeysAndCertificate.returns(success(expectedResponse)) + mockIot.on(CreateKeysAndCertificateCommand).resolves(expectedResponse) const response = await createClient().createCertificateAndKeys(input) @@ -99,36 +152,37 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.createKeysAndCertificate.returns(failure()) + mockIot.on(CreateKeysAndCertificateCommand).rejects(error) await assert.rejects(createClient().createCertificateAndKeys(input), error) }) }) describe('getEndpoint', function () { - const input: Iot.DescribeEndpointRequest = { endpointType: 'iot:Data-ATS' } + const input: DescribeEndpointRequest = { endpointType: 'iot:Data-ATS' } const endpointAddress = 'address' - const describeResponse: Iot.DescribeEndpointResponse = { endpointAddress } + const describeResponse: DescribeEndpointResponse = { endpointAddress } it('gets endpoint', async function () { - mockIot.describeEndpoint.returns(success(describeResponse)) + mockIot.on(DescribeEndpointCommand).resolves(describeResponse) const response = await createClient().getEndpoint() - mockIot.describeEndpoint.calledOnceWithExactly(sinon.match(input)) + assert.strictEqual(mockIot.commandCalls(DescribeEndpointCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DescribeEndpointCommand)[0].args[0].input, input) assert.deepStrictEqual(response, endpointAddress) }) it('throws an Error on failure', async function () { - mockIot.describeEndpoint.returns(failure()) + mockIot.on(DescribeEndpointCommand).rejects(error) await assert.rejects(createClient().getEndpoint(), error) }) }) describe('getPolicyVersion', function () { - const input: Iot.GetPolicyVersionRequest = { policyName, policyVersionId: '1' } - const expectedResponse: Iot.GetPolicyVersionResponse = { + const input: GetPolicyVersionRequest = { policyName, policyVersionId: '1' } + const expectedResponse: GetPolicyVersionResponse = { policyName, policyDocument, policyArn: 'arn1', @@ -136,7 +190,7 @@ describe('DefaultIotClient', function () { } it('gets policy document for version', async function () { - mockIot.getPolicyVersion.returns(success(expectedResponse)) + mockIot.on(GetPolicyVersionCommand).resolves(expectedResponse) const response = await createClient().getPolicyVersion(input) @@ -144,7 +198,7 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.getPolicyVersion.returns(failure()) + mockIot.on(GetPolicyVersionCommand).rejects(error) await assert.rejects(createClient().getPolicyVersion(input), error) }) @@ -153,18 +207,19 @@ describe('DefaultIotClient', function () { /* Functions that return void .*/ describe('deleteThing', function () { - const input: Iot.DeleteThingRequest = { thingName } + const input: DeleteThingRequest = { thingName } it('deletes a thing', async function () { - mockIot.deleteThing.returns(success({} as Iot.DeleteThingResponse)) + mockIot.on(DeleteThingCommand).resolves({} as DeleteThingResponse) await createClient().deleteThing({ thingName }) - assert(mockIot.deleteThing.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(DeleteThingCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DeleteThingCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.deleteThing.returns(failure()) + mockIot.on(DeleteThingCommand).rejects(error) await assert.rejects(createClient().deleteThing({ thingName }), error) }) @@ -172,18 +227,19 @@ describe('DefaultIotClient', function () { describe('deleteCertificate', function () { const certificateId = 'cert1' - const input: Iot.DeleteCertificateRequest = { certificateId, forceDelete: undefined } + const input: DeleteCertificateRequest = { certificateId, forceDelete: undefined } it('deletes a certificate', async function () { - mockIot.deleteCertificate.returns(success()) + mockIot.on(DeleteCertificateCommand).resolves({}) await createClient().deleteCertificate(input) - assert(mockIot.deleteCertificate.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(DeleteCertificateCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DeleteCertificateCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.deleteCertificate.returns(failure()) + mockIot.on(DeleteCertificateCommand).rejects(error) await assert.rejects(createClient().deleteCertificate(input), error) }) @@ -191,182 +247,192 @@ describe('DefaultIotClient', function () { describe('updateCertificate', function () { const certificateId = 'cert1' - const input: Iot.UpdateCertificateRequest = { certificateId, newStatus: 'ACTIVE' } + const input: UpdateCertificateRequest = { certificateId, newStatus: 'ACTIVE' } it('updates a certificate', async function () { - mockIot.updateCertificate.returns(success()) + mockIot.on(UpdateCertificateCommand).resolves({}) await createClient().updateCertificate(input) - assert(mockIot.updateCertificate.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(UpdateCertificateCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(UpdateCertificateCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.updateCertificate.returns(failure()) + mockIot.on(UpdateCertificateCommand).rejects(error) await assert.rejects(createClient().updateCertificate(input), error) }) }) describe('attachThingPrincipal', function () { - const input: Iot.AttachThingPrincipalRequest = { thingName, principal: 'arn1' } + const input: AttachThingPrincipalRequest = { thingName, principal: 'arn1' } it('attaches a certificate to a Thing', async function () { - mockIot.attachThingPrincipal.returns(success()) + mockIot.on(AttachThingPrincipalCommand).resolves({}) await createClient().attachThingPrincipal(input) - assert(mockIot.attachThingPrincipal.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(AttachThingPrincipalCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(AttachThingPrincipalCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.attachThingPrincipal.returns(failure()) + mockIot.on(AttachThingPrincipalCommand).rejects(error) await assert.rejects(createClient().attachThingPrincipal(input), error) }) }) describe('detachThingPrincipal', function () { - const input: Iot.DetachThingPrincipalRequest = { thingName, principal: 'arn1' } + const input: DetachThingPrincipalRequest = { thingName, principal: 'arn1' } it('detaches a certificate from a Thing', async function () { - mockIot.detachThingPrincipal.returns(success()) + mockIot.on(DetachThingPrincipalCommand).resolves({}) await createClient().detachThingPrincipal(input) - assert(mockIot.detachThingPrincipal.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(DetachThingPrincipalCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DetachThingPrincipalCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.detachThingPrincipal.returns(failure()) + mockIot.on(DetachThingPrincipalCommand).rejects(error) await assert.rejects(createClient().detachThingPrincipal(input), error) }) }) describe('attachPolicy', function () { - const input: Iot.AttachPolicyRequest = { policyName, target: 'arn1' } + const input: AttachPolicyRequest = { policyName, target: 'arn1' } it('attaches a policy to a certificate', async function () { - mockIot.attachPolicy.returns(success()) + mockIot.on(AttachPolicyCommand).resolves({}) await createClient().attachPolicy(input) - assert(mockIot.attachPolicy.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(AttachPolicyCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(AttachPolicyCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.attachPolicy.returns(failure()) + mockIot.on(AttachPolicyCommand).rejects(error) await assert.rejects(createClient().attachPolicy(input), error) }) }) describe('detachPolicy', function () { - const input: Iot.DetachPolicyRequest = { policyName, target: 'arn1' } + const input: DetachPolicyRequest = { policyName, target: 'arn1' } it('detaches a policy from a certificate', async function () { - mockIot.detachPolicy.returns(success()) + mockIot.on(DetachPolicyCommand).resolves({}) await createClient().detachPolicy(input) - assert(mockIot.detachPolicy.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(DetachPolicyCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DetachPolicyCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.detachPolicy.returns(failure()) + mockIot.on(DetachPolicyCommand).rejects(error) await assert.rejects(createClient().detachPolicy(input), error) }) }) describe('createPolicy', function () { - const input: Iot.CreatePolicyRequest = { policyName, policyDocument } - const expectedResponse: Iot.CreatePolicyResponse = { policyName, policyDocument, policyArn: 'arn1' } + const input: CreatePolicyRequest = { policyName, policyDocument } + const expectedResponse: CreatePolicyResponse = { policyName, policyDocument, policyArn: 'arn1' } it('creates a policy from a document', async function () { - mockIot.createPolicy.returns(success(expectedResponse)) + mockIot.on(CreatePolicyCommand).resolves(expectedResponse) await createClient().createPolicy(input) - assert(mockIot.createPolicy.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(CreatePolicyCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(CreatePolicyCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.createPolicy.returns(failure()) + mockIot.on(CreatePolicyCommand).rejects(error) await assert.rejects(createClient().createPolicy(input), error) }) }) describe('deletePolicy', function () { - const input: Iot.DeletePolicyRequest = { policyName } + const input: DeletePolicyRequest = { policyName } it('deletes a policy', async function () { - mockIot.deletePolicy.returns(success()) + mockIot.on(DeletePolicyCommand).resolves({}) await createClient().deletePolicy(input) - assert(mockIot.deletePolicy.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(DeletePolicyCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DeletePolicyCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.deletePolicy.returns(failure()) + mockIot.on(DeletePolicyCommand).rejects(error) await assert.rejects(createClient().deletePolicy(input), error) }) }) describe('createPolicyVersion', function () { - const input: Iot.CreatePolicyVersionRequest = { policyName, policyDocument } - const expectedResponse: Iot.CreatePolicyVersionResponse = { policyDocument, policyArn: 'arn1' } + const input: CreatePolicyVersionRequest = { policyName, policyDocument } + const expectedResponse: CreatePolicyVersionResponse = { policyDocument, policyArn: 'arn1' } it('creates a policy version from a document', async function () { - mockIot.createPolicyVersion.returns(success(expectedResponse)) + mockIot.on(CreatePolicyVersionCommand).resolves(expectedResponse) await createClient().createPolicyVersion(input) - assert(mockIot.createPolicyVersion.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(CreatePolicyVersionCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(CreatePolicyVersionCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.createPolicyVersion.returns(failure()) + mockIot.on(CreatePolicyVersionCommand).rejects(error) await assert.rejects(createClient().createPolicyVersion(input), error) }) }) describe('deletePolicyVersion', function () { - const input: Iot.DeletePolicyVersionRequest = { policyName, policyVersionId: '1' } + const input: DeletePolicyVersionRequest = { policyName, policyVersionId: '1' } it('deletes a policy version', async function () { - mockIot.deletePolicyVersion.returns(success()) + mockIot.on(DeletePolicyVersionCommand).resolves({}) await createClient().deletePolicyVersion(input) - assert(mockIot.deletePolicyVersion.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(DeletePolicyVersionCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DeletePolicyVersionCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.deletePolicyVersion.returns(failure()) + mockIot.on(DeletePolicyVersionCommand).rejects(error) await assert.rejects(createClient().deletePolicyVersion(input), error) }) }) describe('setDefaultPolicyVersion', function () { - const input: Iot.SetDefaultPolicyVersionRequest = { policyName, policyVersionId: '1' } + const input: SetDefaultPolicyVersionRequest = { policyName, policyVersionId: '1' } it('deletes a policy version', async function () { - mockIot.setDefaultPolicyVersion.returns(success()) + mockIot.on(SetDefaultPolicyVersionCommand).resolves({}) await createClient().setDefaultPolicyVersion(input) - assert(mockIot.setDefaultPolicyVersion.calledOnceWithExactly(sinon.match(input))) + assert.strictEqual(mockIot.commandCalls(SetDefaultPolicyVersionCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(SetDefaultPolicyVersionCommand)[0].args[0].input, input) }) it('throws an Error on failure', async function () { - mockIot.setDefaultPolicyVersion.returns(failure()) + mockIot.on(SetDefaultPolicyVersionCommand).rejects(error) await assert.rejects(createClient().setDefaultPolicyVersion(input), error) }) @@ -375,11 +441,11 @@ describe('DefaultIotClient', function () { // /* Functions that list resources. describe('listThings', function () { - const input: Iot.ListThingsRequest = { maxResults, nextToken } - const expectedResponse: Iot.ListThingsResponse = { things: [{ thingName: 'thing1' }], nextToken } + const input: ListThingsRequest = { maxResults, nextToken } + const expectedResponse: ListThingsResponse = { things: [{ thingName: 'thing1' }], nextToken } it('lists things', async function () { - mockIot.listThings.returns(success(expectedResponse)) + mockIot.on(ListThingsCommand).resolves(expectedResponse) const response = await createClient().listThings(input) @@ -387,21 +453,21 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.listThings.returns(failure()) + mockIot.on(ListThingsCommand).rejects(error) await assert.rejects(createClient().listThings(input), error) }) }) describe('listCertificates', function () { - const input: Iot.ListCertificatesRequest = { pageSize, marker, ascendingOrder: undefined } - const expectedResponse: Iot.ListCertificatesResponse = { + const input: ListCertificatesRequest = { pageSize, marker, ascendingOrder: undefined } + const expectedResponse: ListCertificatesResponse = { certificates: [{ certificateId: 'cert1' }], nextMarker: marker, } it('lists certificates', async function () { - mockIot.listCertificates.returns(success(expectedResponse)) + mockIot.on(ListCertificatesCommand).resolves(expectedResponse) const response = await createClient().listCertificates(input) @@ -409,7 +475,7 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.listCertificates.returns(failure()) + mockIot.on(ListCertificatesCommand).rejects(error) await assert.rejects(createClient().listCertificates(input), error) }) @@ -418,11 +484,11 @@ describe('DefaultIotClient', function () { describe('listThingCertificates', function () { const certificateId = 'cert1' const certArn = 'arn:aws:iot:us-west-2:0123456789:cert/cert1' - const input: Iot.ListThingPrincipalsRequest = { thingName, maxResults, nextToken } - const principalsResponse: Iot.ListThingPrincipalsResponse = { principals: [certArn], nextToken } + const input: ListThingPrincipalsRequest = { thingName, maxResults, nextToken } + const principalsResponse: ListThingPrincipalsResponse = { principals: [certArn], nextToken } - const describeInput: Iot.DescribeCertificateRequest = { certificateId } - const describeResponse: Iot.DescribeCertificateResponse = { + const describeInput: DescribeCertificateRequest = { certificateId } + const describeResponse: DescribeCertificateResponse = { certificateDescription: { certificateId, certificateArn: certArn }, } @@ -432,36 +498,37 @@ describe('DefaultIotClient', function () { } it('lists certificates', async function () { - mockIot.listThingPrincipals.returns(success(principalsResponse)) - mockIot.describeCertificate.returns(success(describeResponse)) + mockIot.on(ListThingPrincipalsCommand).resolves(principalsResponse) + mockIot.on(DescribeCertificateCommand).resolves(describeResponse) const response = await createClient().listThingCertificates(input) - mockIot.describeCertificate.calledOnceWithExactly(sinon.match(describeInput)) + assert.strictEqual(mockIot.commandCalls(DescribeCertificateCommand).length, 1) + assert.deepStrictEqual(mockIot.commandCalls(DescribeCertificateCommand)[0].args[0].input, describeInput) assert.deepStrictEqual(response, expectedResponse) }) it('throws an Error when certificate listing fails', async function () { - mockIot.listThingPrincipals.returns(failure()) + mockIot.on(ListThingPrincipalsCommand).rejects(error) await assert.rejects(createClient().listThingCertificates(input), error) }) it('throws an Error when certificate description fails', async function () { - mockIot.listThingPrincipals.returns(success(principalsResponse)) - mockIot.describeCertificate.returns(failure()) + mockIot.on(ListThingPrincipalsCommand).resolves(principalsResponse) + mockIot.on(DescribeCertificateCommand).rejects(error) await assert.rejects(createClient().listThingCertificates(input), error) }) }) describe('listThingsForCert', function () { - const input: Iot.ListPrincipalThingsRequest = { principal: 'arn1', maxResults, nextToken } - const listResponse: Iot.ListPrincipalThingsResponse = { things: [thingName], nextToken } + const input: ListPrincipalThingsRequest = { principal: 'arn1', maxResults, nextToken } + const listResponse: ListPrincipalThingsResponse = { things: [thingName], nextToken } const expectedResponse = [thingName] it('lists things', async function () { - mockIot.listPrincipalThings.returns(success(listResponse)) + mockIot.on(ListPrincipalThingsCommand).resolves(listResponse) const response = await createClient().listThingsForCert(input) @@ -469,18 +536,18 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.listPrincipalThings.returns(failure()) + mockIot.on(ListPrincipalThingsCommand).rejects(error) await assert.rejects(createClient().listThingsForCert(input), error) }) }) describe('listPolicies', function () { - const input: Iot.ListPoliciesRequest = { pageSize, marker, ascendingOrder: undefined } - const expectedResponse: Iot.ListPoliciesResponse = { policies: [{ policyName }], nextMarker: marker } + const input: ListPoliciesRequest = { pageSize, marker, ascendingOrder: undefined } + const expectedResponse: ListPoliciesResponse = { policies: [{ policyName }], nextMarker: marker } it('lists policies', async function () { - mockIot.listPolicies.returns(success(expectedResponse)) + mockIot.on(ListPoliciesCommand).resolves(expectedResponse) const response = await createClient().listPolicies(input) @@ -488,23 +555,23 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.listPolicies.returns(failure()) + mockIot.on(ListPoliciesCommand).rejects(error) await assert.rejects(createClient().listPolicies(input), error) }) }) describe('listPrincipalPolicies', function () { - const input: Iot.ListPrincipalPoliciesRequest = { + const input: ListPrincipalPoliciesRequest = { pageSize, marker, ascendingOrder: undefined, principal: 'arn1', } - const expectedResponse: Iot.ListPoliciesResponse = { policies: [{ policyName }], nextMarker: marker } + const expectedResponse: ListPoliciesResponse = { policies: [{ policyName }], nextMarker: marker } it('lists policies for certificate', async function () { - mockIot.listPrincipalPolicies.returns(success(expectedResponse)) + mockIot.on(ListPrincipalPoliciesCommand).resolves(expectedResponse) const response = await createClient().listPrincipalPolicies(input) @@ -512,7 +579,7 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.listPrincipalPolicies.returns(failure()) + mockIot.on(ListPrincipalPoliciesCommand).rejects(error) await assert.rejects(createClient().listPrincipalPolicies(input), error) }) @@ -520,11 +587,11 @@ describe('DefaultIotClient', function () { describe('listPolicyTargets', function () { const targets = ['arn1', 'arn2'] - const input: Iot.ListTargetsForPolicyRequest = { policyName, pageSize, marker } - const listResponse: Iot.ListTargetsForPolicyResponse = { targets, nextMarker: marker } + const input: ListTargetsForPolicyRequest = { policyName, pageSize, marker } + const listResponse: ListTargetsForPolicyResponse = { targets, nextMarker: marker } it('lists certificates', async function () { - mockIot.listTargetsForPolicy.returns(success(listResponse)) + mockIot.on(ListTargetsForPolicyCommand).resolves(listResponse) const response = await createClient().listPolicyTargets(input) @@ -532,20 +599,20 @@ describe('DefaultIotClient', function () { }) it('throws an Error on failure', async function () { - mockIot.listTargetsForPolicy.returns(failure()) + mockIot.on(ListTargetsForPolicyCommand).rejects(error) await assert.rejects(createClient().listPolicyTargets(input), error) }) }) describe('listPolicyVersions', function () { - const input: Iot.ListPolicyVersionsRequest = { policyName } - const expectedVersion1: Iot.PolicyVersion = { versionId: '1' } - const expectedVersion2: Iot.PolicyVersion = { versionId: '2' } - const listResponse: Iot.ListPolicyVersionsResponse = { policyVersions: [expectedVersion1, expectedVersion2] } + const input: ListPolicyVersionsRequest = { policyName } + const expectedVersion1: PolicyVersion = { versionId: '1' } + const expectedVersion2: PolicyVersion = { versionId: '2' } + const listResponse: ListPolicyVersionsResponse = { policyVersions: [expectedVersion1, expectedVersion2] } it('lists policy versions', async function () { - mockIot.listPolicyVersions.returns(success(listResponse)) + mockIot.on(ListPolicyVersionsCommand).resolves(listResponse) const iterable = createClient().listPolicyVersions(input) const responses = [] @@ -561,7 +628,7 @@ describe('DefaultIotClient', function () { }) it('throws an Error on iterate failure', async function () { - mockIot.listPolicyVersions.returns(failure()) + mockIot.on(ListPolicyVersionsCommand).rejects(error) const iterable = createClient().listPolicyVersions(input) await assert.rejects(iterable.next(), error) diff --git a/packages/core/src/test/shared/clients/defaultRedshiftClient.test.ts b/packages/core/src/test/shared/clients/defaultRedshiftClient.test.ts index 5a7241aefd6..77e2fced64b 100644 --- a/packages/core/src/test/shared/clients/defaultRedshiftClient.test.ts +++ b/packages/core/src/test/shared/clients/defaultRedshiftClient.test.ts @@ -3,24 +3,30 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Redshift, RedshiftData, RedshiftServerless, AWSError, Request } from 'aws-sdk' +import { ClustersMessage, RedshiftClient, DescribeClustersCommand } from '@aws-sdk/client-redshift' +import { + ListDatabasesResponse, + ListSchemasResponse, + RedshiftDataClient, + ListDatabasesCommand, + ListSchemasCommand, +} from '@aws-sdk/client-redshift-data' +import { + ListWorkgroupsResponse, + RedshiftServerlessClient, + ListWorkgroupsCommand, +} from '@aws-sdk/client-redshift-serverless' import { DefaultRedshiftClient } from '../../../shared/clients/redshiftClient' import assert = require('assert') import { ConnectionParams, ConnectionType, RedshiftWarehouseType } from '../../../awsService/redshift/models/models' -import sinon = require('sinon') - -function success(output?: T): Request { - return { - promise: () => Promise.resolve(output), - } as Request -} +import { mockClient, AwsClientStub } from 'aws-sdk-client-mock' const nextToken = 'testNextToken' describe('DefaultRedshiftClient', function () { let defaultRedshiftClient: DefaultRedshiftClient - let mockRedshift: Redshift - let mockRedshiftData: RedshiftData - let mockRedshiftServerless: RedshiftServerless + let mockRedshift: AwsClientStub + let mockRedshiftData: AwsClientStub + let mockRedshiftServerless: AwsClientStub const clusterIdentifier = 'ClusterId' const workgroupName = 'Workgroup' const dbName = 'DB' @@ -38,116 +44,127 @@ describe('DefaultRedshiftClient', function () { workgroupName, RedshiftWarehouseType.SERVERLESS ) - let sandbox: sinon.SinonSandbox - - before(function () { - sandbox = sinon.createSandbox() - }) - beforeEach(function () { - mockRedshift = {} - mockRedshiftData = {} - mockRedshiftServerless = {} + mockRedshift = mockClient(RedshiftClient) + mockRedshiftData = mockClient(RedshiftDataClient) + mockRedshiftServerless = mockClient(RedshiftServerlessClient) defaultRedshiftClient = new DefaultRedshiftClient( 'us-east-1', - async (r) => Promise.resolve(mockRedshiftData), - async (r) => Promise.resolve(mockRedshift), - async (r) => Promise.resolve(mockRedshiftServerless) + // @ts-expect-error + () => mockRedshiftData, + () => mockRedshift, + () => mockRedshiftServerless ) }) + afterEach(function () { + mockRedshift.reset() + mockRedshiftData.reset() + mockRedshiftServerless.reset() + }) + describe('describeProvisionedClusters', function () { - const expectedResponse = { Clusters: [] } as Redshift.ClustersMessage - let describeClustersStub: sinon.SinonStub + const expectedResponse = { Clusters: [] } as ClustersMessage beforeEach(function () { - describeClustersStub = sandbox.stub() - mockRedshift.describeClusters = describeClustersStub - describeClustersStub.returns(success(expectedResponse)) + mockRedshift.on(DescribeClustersCommand).resolves(expectedResponse) }) it('without nextToken should not set Marker', async () => { const response = await defaultRedshiftClient.describeProvisionedClusters() - describeClustersStub.alwaysCalledWith({ Marker: undefined, MaxRecords: 20 }) + const calls = mockRedshift.commandCalls(DescribeClustersCommand) + assert.strictEqual(calls.length, 1) + assert.deepStrictEqual(calls[0].args[0].input, { Marker: undefined, MaxRecords: 20 }) assert.deepStrictEqual(response.Clusters, []) }) it('with nextToken should set the Marker', async () => { const response = await defaultRedshiftClient.describeProvisionedClusters(nextToken) - describeClustersStub.alwaysCalledWith({ Marker: nextToken, MaxRecords: 20 }) + const calls = mockRedshift.commandCalls(DescribeClustersCommand) + assert.strictEqual(calls.length, 1) + assert.deepStrictEqual(calls[0].args[0].input, { Marker: nextToken, MaxRecords: 20 }) assert.deepStrictEqual(response.Clusters, []) }) }) describe('listServerlessWorkgroups', function () { - const expectedResponse = { workgroups: [] } as RedshiftServerless.ListWorkgroupsResponse - let listServerlessWorkgroupsStub: sinon.SinonStub + const expectedResponse = { workgroups: [] } as ListWorkgroupsResponse + beforeEach(function () { - listServerlessWorkgroupsStub = sandbox.stub() - mockRedshiftServerless.listWorkgroups = listServerlessWorkgroupsStub - listServerlessWorkgroupsStub.returns(success(expectedResponse)) + mockRedshiftServerless.on(ListWorkgroupsCommand).resolves(expectedResponse) }) it('without nextToken should not set nextToken in RedshiftServerless request', async () => { const response = await defaultRedshiftClient.listServerlessWorkgroups() - listServerlessWorkgroupsStub.alwaysCalledWith({ nextToken: undefined, maxResults: 20 }) + const calls = mockRedshiftServerless.commandCalls(ListWorkgroupsCommand) + assert.strictEqual(calls.length, 1) + assert.deepStrictEqual(calls[0].args[0].input, { nextToken: undefined, maxResults: 20 }) assert.deepStrictEqual(response.workgroups, []) }) it('with nextToken should set nextToken in RedshiftServerless request', async () => { const response = await defaultRedshiftClient.listServerlessWorkgroups(nextToken) - listServerlessWorkgroupsStub.alwaysCalledWith({ nextToken: nextToken, maxResults: 20 }) + const calls = mockRedshiftServerless.commandCalls(ListWorkgroupsCommand) + assert.strictEqual(calls.length, 1) + assert.deepStrictEqual(calls[0].args[0].input, { nextToken: nextToken, maxResults: 20 }) assert.deepStrictEqual(response.workgroups, []) }) }) describe('listDatabases', function () { - const expectedResponse = { Databases: [] } as RedshiftData.ListDatabasesResponse - let listDatabasesStub: sinon.SinonStub + const expectedResponse = { Databases: [] } as ListDatabasesResponse + beforeEach(function () { - listDatabasesStub = sandbox.stub() - mockRedshiftData.listDatabases = listDatabasesStub - listDatabasesStub.returns(success(expectedResponse)) + mockRedshiftData.on(ListDatabasesCommand).resolves(expectedResponse) }) + it('should list databases for provisioned clusters', async () => { const response = await defaultRedshiftClient.listDatabases(provisionedDbUserAndPasswordParams) - listDatabasesStub.alwaysCalledWith({ - ClusterIdentifier: clusterIdentifier, - Database: dbName, - DbUser: dbUsername, - }) + const calls = mockRedshiftData.commandCalls(ListDatabasesCommand) + assert.strictEqual(calls.length, 1) + const input = calls[0].args[0].input + assert.strictEqual(input.ClusterIdentifier, clusterIdentifier) + assert.strictEqual(input.Database, dbName) + assert.strictEqual(input.DbUser, dbUsername) assert.deepStrictEqual(response.Databases, []) }) it('should list databases for serverless workgroups', async () => { const response = await defaultRedshiftClient.listDatabases(serverlessFederatedParams) - listDatabasesStub.alwaysCalledWith({ WorkgroupName: workgroupName, Database: dbName }) + const calls = mockRedshiftData.commandCalls(ListDatabasesCommand) + assert.strictEqual(calls.length, 1) + const input = calls[0].args[0].input + assert.strictEqual(input.WorkgroupName, workgroupName) + assert.strictEqual(input.Database, dbName) assert.deepStrictEqual(response.Databases, []) }) }) describe('listSchemas', function () { - const expectedResponse = { Schemas: [] } as RedshiftData.ListSchemasResponse - let listSchemasStub: sinon.SinonStub + const expectedResponse = { Schemas: [] } as ListSchemasResponse + beforeEach(function () { - listSchemasStub = sandbox.stub() - mockRedshiftData.listSchemas = listSchemasStub - listSchemasStub.returns(success(expectedResponse)) + mockRedshiftData.on(ListSchemasCommand).resolves(expectedResponse) }) it('should list schemas for databases in provisioned clusters', async () => { const response = await defaultRedshiftClient.listSchemas(provisionedDbUserAndPasswordParams, dbName) - listSchemasStub.alwaysCalledWith({ - ClusterIdentifier: clusterIdentifier, - Database: dbName, - DbUser: dbUsername, - }) + const calls = mockRedshiftData.commandCalls(ListSchemasCommand) + assert.strictEqual(calls.length, 1) + const input = calls[0].args[0].input + assert.strictEqual(input.ClusterIdentifier, clusterIdentifier) + assert.strictEqual(input.Database, dbName) + assert.strictEqual(input.DbUser, dbUsername) assert.deepStrictEqual(response.Schemas, []) }) it('should list schemas for databases in serverless workgroups', async () => { const response = await defaultRedshiftClient.listSchemas(serverlessFederatedParams, dbName) - listSchemasStub.alwaysCalledWith({ WorkgroupName: workgroupName, Database: dbName }) + const calls = mockRedshiftData.commandCalls(ListSchemasCommand) + assert.strictEqual(calls.length, 1) + const input = calls[0].args[0].input + assert.strictEqual(input.WorkgroupName, workgroupName) + assert.strictEqual(input.Database, dbName) assert.deepStrictEqual(response.Schemas, []) }) }) diff --git a/packages/core/src/test/shared/defaultAwsContext.test.ts b/packages/core/src/test/shared/defaultAwsContext.test.ts index 8f4ade282a4..6623fa5dee7 100644 --- a/packages/core/src/test/shared/defaultAwsContext.test.ts +++ b/packages/core/src/test/shared/defaultAwsContext.test.ts @@ -4,7 +4,7 @@ */ import assert from 'assert' -import * as AWS from 'aws-sdk' +import { AwsCredentialIdentity } from '@aws-sdk/types' import { AwsContextCredentials } from '../../shared/awsContext' import { DefaultAwsContext } from '../../shared/awsContext' @@ -125,7 +125,7 @@ describe('DefaultAwsContext', function () { function makeSampleAwsContextCredentials(endpointUrl?: string): AwsContextCredentials { return { - credentials: {} as any as AWS.Credentials, + credentials: {} as AwsCredentialIdentity, credentialsId: 'qwerty', accountId: testAccountIdValue, endpointUrl, diff --git a/packages/core/src/test/shared/extensionUtilities.test.ts b/packages/core/src/test/shared/extensionUtilities.test.ts index 16d3792c63b..ce4c764d3d5 100644 --- a/packages/core/src/test/shared/extensionUtilities.test.ts +++ b/packages/core/src/test/shared/extensionUtilities.test.ts @@ -5,7 +5,7 @@ import assert from 'assert' -import { AWSError } from 'aws-sdk' +import { ServiceException } from '@smithy/smithy-client' import * as sinon from 'sinon' import { DefaultEc2MetadataClient } from '../../shared/clients/ec2MetadataClient' import * as vscode from 'vscode' @@ -98,14 +98,14 @@ describe('initializeComputeRegion, getComputeRegion', async function () { }) it('returns "unknown" if cloud9 and the MetadataService request fails', async function () { - sandbox.stub(metadataService, 'getInstanceIdentity').rejects({} as AWSError) + sandbox.stub(metadataService, 'getInstanceIdentity').rejects({} as ServiceException) await initializeComputeRegion(metadataService, true) assert.strictEqual(getComputeRegion(), 'unknown') }) it('returns "unknown" if sagemaker and the MetadataService request fails', async function () { - sandbox.stub(metadataService, 'getInstanceIdentity').rejects({} as AWSError) + sandbox.stub(metadataService, 'getInstanceIdentity').rejects({} as ServiceException) await initializeComputeRegion(metadataService, false, true) assert.strictEqual(getComputeRegion(), 'unknown') diff --git a/packages/core/src/test/shared/extensions/ssh.test.ts b/packages/core/src/test/shared/extensions/ssh.test.ts index e7a012f182d..4e9bda41217 100644 --- a/packages/core/src/test/shared/extensions/ssh.test.ts +++ b/packages/core/src/test/shared/extensions/ssh.test.ts @@ -9,7 +9,7 @@ import { createBoundProcess } from '../../../shared/remoteSession' import { createExecutableFile, createTestWorkspaceFolder } from '../../testUtil' import { WorkspaceFolder } from 'vscode' import path from 'path' -import { SSM } from 'aws-sdk' +import { StartSessionResponse } from '@aws-sdk/client-ssm' import { fs } from '../../../shared/fs/fs' import { isWin } from '../../../shared/vscode/env' @@ -74,7 +74,7 @@ describe('testSshConnection', function () { SessionId: 'testSession', StreamUrl: 'testUrl', TokenValue: 'testToken', - } as SSM.StartSessionResponse + } as StartSessionResponse await createExecutableFile(sshPath, echoEnvVarsCmd(['MY_VAR'])) const r = await testSshConnection(process, 'localhost', sshPath, 'test-user', session) @@ -86,12 +86,12 @@ describe('testSshConnection', function () { SessionId: 'testSession1', StreamUrl: 'testUrl1', TokenValue: 'testToken1', - } as SSM.StartSessionResponse + } as StartSessionResponse const newSession = { SessionId: 'testSession2', StreamUrl: 'testUrl2', TokenValue: 'testToken2', - } as SSM.StartSessionResponse + } as StartSessionResponse const envProvider = async () => ({ SESSION_ID: oldSession.SessionId, STREAM_URL: oldSession.StreamUrl, @@ -108,7 +108,7 @@ describe('testSshConnection', function () { const executableFileContent = isWin() ? `echo "%1 %2"` : `echo "$1 $2"` const process = createBoundProcess(async () => ({})) await createExecutableFile(sshPath, executableFileContent) - const r = await testSshConnection(process, 'localhost', sshPath, 'test-user', {} as SSM.StartSessionResponse) + const r = await testSshConnection(process, 'localhost', sshPath, 'test-user', {} as StartSessionResponse) assertOutputContains(r.stdout, '-T') assertOutputContains(r.stdout, 'test-user@localhost') }) diff --git a/packages/core/src/test/shared/sam/build.test.ts b/packages/core/src/test/shared/sam/build.test.ts index 8043696d772..bed4fee7e25 100644 --- a/packages/core/src/test/shared/sam/build.test.ts +++ b/packages/core/src/test/shared/sam/build.test.ts @@ -512,6 +512,9 @@ describe('SAM runBuild', () => { }) .build() + // Reset the spy before running the test to ensure clean state + spyRunInterminal.resetHistory() + // Instead of await runBuild(), prefer this to avoid flakiness due to race condition await delayedRunBuild() diff --git a/packages/core/src/test/shared/sam/debugger/samDebugConfigProvider.test.ts b/packages/core/src/test/shared/sam/debugger/samDebugConfigProvider.test.ts index 9fe7c76e842..ccdf113b580 100644 --- a/packages/core/src/test/shared/sam/debugger/samDebugConfigProvider.test.ts +++ b/packages/core/src/test/shared/sam/debugger/samDebugConfigProvider.test.ts @@ -317,7 +317,12 @@ describe('SamDebugConfigurationProvider', async function () { ) // No workspace folder: + // Stub vscode.workspace.workspaceFolders to be undefined to ensure rejection + sandbox.stub(vscode.workspace, 'workspaceFolders').value(undefined) await assert.rejects(() => debugConfigProvider.makeConfig(undefined, config.config)) + // Restore for subsequent tests + sandbox.restore() + sandbox = sinon.createSandbox() // No launch.json (vscode will pass an empty config.request): await assert.rejects(() => debugConfigProvider.makeConfig(undefined, { ...config.config, request: '' })) @@ -2906,7 +2911,7 @@ describe('ensureRelativePaths', function () { undefined, 'testName1', '/test1/project', - lambdaModel.getDefaultRuntime(lambdaModel.RuntimeFamily.NodeJS) ?? '' + lambdaModel.getDefaultRuntime(lambdaModel.RuntimeFamily.NodeJS)! ) assert.strictEqual((codeConfig.invokeTarget as CodeTargetProperties).projectRoot, '/test1/project') ensureRelativePaths(workspace, codeConfig) diff --git a/packages/core/src/test/shared/sam/sync.test.ts b/packages/core/src/test/shared/sam/sync.test.ts index 843b0e0bbcd..da7a8086f38 100644 --- a/packages/core/src/test/shared/sam/sync.test.ts +++ b/packages/core/src/test/shared/sam/sync.test.ts @@ -43,7 +43,7 @@ import sinon from 'sinon' import { getTestWindow } from '../vscode/window' import { S3Client } from '../../../shared/clients/s3' import { RequiredProps } from '../../../shared/utilities/tsUtils' -import S3 from 'aws-sdk/clients/s3' +import { Bucket } from '@aws-sdk/client-s3' import { CloudFormationClient } from '../../../shared/clients/cloudFormation' import { intoCollection } from '../../../shared/utilities/collectionUtils' import { SamConfig, Environment, parseConfig } from '../../../shared/sam/config' @@ -2174,7 +2174,7 @@ describe('SAM sync helper functions', () => { }) const s3BucketListSummary: Array< - RequiredProps & { + RequiredProps & { readonly region: string } > = [ diff --git a/packages/core/src/test/shared/sshConfig.test.ts b/packages/core/src/test/shared/sshConfig.test.ts index 03841644e24..b828859586b 100644 --- a/packages/core/src/test/shared/sshConfig.test.ts +++ b/packages/core/src/test/shared/sshConfig.test.ts @@ -17,7 +17,7 @@ import { connectScriptPrefix, getCodeCatalystSsmEnv, } from '../../codecatalyst/model' -import { StartDevEnvironmentSessionRequest } from 'aws-sdk/clients/codecatalyst' +import { StartDevEnvironmentSessionRequest } from '@aws-sdk/client-codecatalyst' import { mkdir, readFile } from 'fs/promises' import fs from '../../shared/fs/fs' import { globals } from '../../shared' diff --git a/packages/core/src/test/ssmDocument/commands/deleteDocument.test.ts b/packages/core/src/test/ssmDocument/commands/deleteDocument.test.ts index c16b76be8c7..f79d217028d 100644 --- a/packages/core/src/test/ssmDocument/commands/deleteDocument.test.ts +++ b/packages/core/src/test/ssmDocument/commands/deleteDocument.test.ts @@ -9,7 +9,7 @@ import { DocumentItemNodeWriteable } from '../../../ssmDocument/explorer/documen import { SsmDocumentClient } from '../../../shared/clients/ssmDocumentClient' import { deleteDocument } from '../../../ssmDocument/commands/deleteDocument' import { RegistryItemNode } from '../../../ssmDocument/explorer/registryItemNode' -import { SSM } from 'aws-sdk' +import { DocumentFormat, DocumentIdentifier } from '@aws-sdk/client-ssm' import { getTestWindow } from '../../shared/vscode/window' import { stub } from '../../utilities/stubber' @@ -21,9 +21,9 @@ describe('deleteDocument', async function () { let spyExecuteCommand: sinon.SinonSpy const fakeName: string = 'testDocument' - const fakeDoc: SSM.Types.DocumentIdentifier = { + const fakeDoc: DocumentIdentifier = { Name: fakeName, - DocumentFormat: 'json', + DocumentFormat: DocumentFormat.JSON, DocumentType: 'Automation', Owner: 'Amazon', } diff --git a/packages/core/src/test/ssmDocument/commands/openDocumentItem.test.ts b/packages/core/src/test/ssmDocument/commands/openDocumentItem.test.ts index 8e5bb3029d3..a02403be4dc 100644 --- a/packages/core/src/test/ssmDocument/commands/openDocumentItem.test.ts +++ b/packages/core/src/test/ssmDocument/commands/openDocumentItem.test.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SSM } from 'aws-sdk' +import { DocumentFormat, DocumentIdentifier, GetDocumentResult } from '@aws-sdk/client-ssm' import assert from 'assert' import * as sinon from 'sinon' @@ -23,8 +23,8 @@ describe('openDocumentItem', async function () { sinon.restore() }) - const rawContent: SSM.Types.GetDocumentResult = { - DocumentFormat: 'json', + const rawContent: GetDocumentResult = { + DocumentFormat: DocumentFormat.JSON, DocumentType: 'Command', Name: 'testDocument', Content: `{ @@ -35,9 +35,9 @@ describe('openDocumentItem', async function () { }`, } - const fakeDoc: SSM.Types.DocumentIdentifier = { + const fakeDoc: DocumentIdentifier = { Name: 'testDocument', - DocumentFormat: 'json', + DocumentFormat: DocumentFormat.JSON, DocumentType: 'Command', Owner: 'Amazon', } @@ -65,7 +65,7 @@ describe('openDocumentItem', async function () { const documentNode = generateDocumentItemNode() const openTextDocumentStub = sinon.stub(vscode.workspace, 'openTextDocument') - await openDocumentItem(documentNode, fakeAwsContext, 'json') + await openDocumentItem(documentNode, fakeAwsContext, DocumentFormat.JSON) assert.strictEqual(openTextDocumentStub.getCall(0).args[0]?.content, rawContent.Content) assert.strictEqual(openTextDocumentStub.getCall(0).args[0]?.language, 'ssm-json') }) diff --git a/packages/core/src/test/ssmDocument/commands/publishDocument.test.ts b/packages/core/src/test/ssmDocument/commands/publishDocument.test.ts index 1403848b9ee..c715d11ad18 100644 --- a/packages/core/src/test/ssmDocument/commands/publishDocument.test.ts +++ b/packages/core/src/test/ssmDocument/commands/publishDocument.test.ts @@ -3,7 +3,12 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SSM } from 'aws-sdk' +import { + CreateDocumentRequest, + CreateDocumentResult, + UpdateDocumentRequest, + UpdateDocumentResult, +} from '@aws-sdk/client-ssm' import assert from 'assert' import * as sinon from 'sinon' @@ -24,15 +29,15 @@ import { SeverityLevel } from '../../shared/vscode/message' describe('publishDocument', async function () { let wizardResponse: PublishSSMDocumentWizardResponse let textDocument: vscode.TextDocument - let result: SSM.CreateDocumentResult | SSM.UpdateDocumentResult + let result: CreateDocumentResult | UpdateDocumentResult - const fakeCreateRequest: SSM.CreateDocumentRequest = { + const fakeCreateRequest: CreateDocumentRequest = { Content: 'foo', DocumentFormat: 'JSON', DocumentType: 'Automation', Name: 'test', } - const fakeUpdateRequest: SSM.UpdateDocumentRequest = { + const fakeUpdateRequest: UpdateDocumentRequest = { Content: 'foo', DocumentFormat: 'JSON', DocumentVersion: '$LATEST', diff --git a/packages/core/src/test/ssmDocument/commands/updateDocumentVersion.test.ts b/packages/core/src/test/ssmDocument/commands/updateDocumentVersion.test.ts index 01a21a9ee41..da941e43d62 100644 --- a/packages/core/src/test/ssmDocument/commands/updateDocumentVersion.test.ts +++ b/packages/core/src/test/ssmDocument/commands/updateDocumentVersion.test.ts @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { SSM } from 'aws-sdk' +import { DocumentFormat, DocumentIdentifier, DocumentVersionInfo } from '@aws-sdk/client-ssm' import * as sinon from 'sinon' import assert from 'assert' @@ -21,9 +21,9 @@ describe('openDocumentItem', async function () { sinon.restore() }) - const fakeDoc: SSM.Types.DocumentIdentifier = { + const fakeDoc: DocumentIdentifier = { Name: 'testDocument', - DocumentFormat: 'json', + DocumentFormat: DocumentFormat.JSON, DocumentType: 'Command', Owner: 'Amazon', } @@ -32,7 +32,7 @@ describe('openDocumentItem', async function () { const fakeRegion = 'us-east-1' - const fakeSchemaList: SSM.DocumentVersionInfo[] = [ + const fakeSchemaList: DocumentVersionInfo[] = [ { Name: 'testDocument', DocumentVersion: '1', diff --git a/packages/core/src/test/ssmDocument/explorer/documentItemNode.test.ts b/packages/core/src/test/ssmDocument/explorer/documentItemNode.test.ts index 12c400c4cef..3fa5dedef21 100644 --- a/packages/core/src/test/ssmDocument/explorer/documentItemNode.test.ts +++ b/packages/core/src/test/ssmDocument/explorer/documentItemNode.test.ts @@ -4,14 +4,14 @@ */ import assert from 'assert' -import { SSM } from 'aws-sdk' +import { DocumentIdentifier } from '@aws-sdk/client-ssm' import { DefaultSsmDocumentClient } from '../../../shared/clients/ssmDocumentClient' import { DocumentItemNode } from '../../../ssmDocument/explorer/documentItemNode' import { stub } from '../../utilities/stubber' describe('DocumentItemNode', async function () { let testNode: DocumentItemNode - const testDoc: SSM.DocumentIdentifier = { + const testDoc: DocumentIdentifier = { Name: 'testDoc', Owner: 'Amazon', } diff --git a/packages/core/src/testE2E/codecatalyst/client.test.ts b/packages/core/src/testE2E/codecatalyst/client.test.ts index 0356e3041c1..84e9309120c 100644 --- a/packages/core/src/testE2E/codecatalyst/client.test.ts +++ b/packages/core/src/testE2E/codecatalyst/client.test.ts @@ -20,7 +20,7 @@ import globals from '../../shared/extensionGlobals' import { CodeCatalystCreateWebview, SourceResponse } from '../../codecatalyst/vue/create/backend' import { waitUntil } from '../../shared/utilities/timeoutUtils' import { AccessDeniedException } from '@aws-sdk/client-sso-oidc' -import { GetDevEnvironmentRequest } from 'aws-sdk/clients/codecatalyst' +import { GetDevEnvironmentRequest, _InstanceType } from '@aws-sdk/client-codecatalyst' import { getTestWindow } from '../../test/shared/vscode/window' import { patchObject, registerAuthHook, skipTest, using } from '../../test/setupUtil' import { isExtensionInstalled } from '../../shared/utilities/vsCodeUtils' @@ -37,7 +37,6 @@ import { SsoConnection, } from '../../auth/connection' import { hasKey } from '../../shared/utilities/tsUtils' -import { _InstanceType } from '@aws-sdk/client-codecatalyst' let spaceName: CodeCatalystOrg['name'] let projectName: CodeCatalystProject['name'] @@ -615,6 +614,9 @@ describe('Test how this codebase uses the CodeCatalyst API', function () { ): Promise { const result = await waitUntil( async function () { + if (!devEnv.spaceName || !devEnv.projectName) { + return false + } const devEnvData = await client.getDevEnvironment({ spaceName: devEnv.spaceName, projectName: devEnv.projectName, diff --git a/packages/core/src/testInteg/appBuilder/sidebar/appBuilderNode.test.ts b/packages/core/src/testInteg/appBuilder/sidebar/appBuilderNode.test.ts index bb5cdc4cc34..cd9416f0156 100644 --- a/packages/core/src/testInteg/appBuilder/sidebar/appBuilderNode.test.ts +++ b/packages/core/src/testInteg/appBuilder/sidebar/appBuilderNode.test.ts @@ -129,28 +129,28 @@ describe('Application Builder', async () => { ) assert.strictEqual(lambdaResourceNode.id, 'AppBuilderProjectLambda') const lambdaTreeItemProperties = lambdaResourceNode.getTreeItem() - assert.strictEqual(lambdaTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.None) + assert.strictEqual(lambdaTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.Collapsed) assert.strictEqual(lambdaTreeItemProperties.iconPath?.toString(), '$(aws-lambda-function)') // Validate s3 bucket const s3BucketResourceNode = getResourceNodeByType(appBuilderTestAppResourceNodes, 'AWS::S3::Bucket') assert.strictEqual(s3BucketResourceNode.id, 'AppBuilderProjectBucket') const s3BucketTreeItemProperties = s3BucketResourceNode.getTreeItem() - assert.strictEqual(s3BucketTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.None) + assert.strictEqual(s3BucketTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.Collapsed) assert.strictEqual(s3BucketTreeItemProperties.iconPath?.toString(), '$(aws-s3-bucket)') // Validate s3 policy const s3PolicyResourceNode = getResourceNodeByType(appBuilderTestAppResourceNodes, 'AWS::S3::BucketPolicy') assert.strictEqual(s3PolicyResourceNode.id, 'AppBuilderProjectBucketBucketPolicy') const s3PolicyTreeItemProperties = s3PolicyResourceNode.getTreeItem() - assert.strictEqual(s3PolicyTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.None) + assert.strictEqual(s3PolicyTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.Collapsed) assert.strictEqual(s3PolicyTreeItemProperties.iconPath?.toString(), '$(info)') // Validate api gateway resource node const apigwResourceNode = getResourceNodeByType(appBuilderTestAppResourceNodes, 'AWS::Serverless::Api') assert.strictEqual(apigwResourceNode.id, 'AppBuilderProjectAPI') const apigwTreeItemProperties = apigwResourceNode.getTreeItem() - assert.strictEqual(apigwTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.None) + assert.strictEqual(apigwTreeItemProperties.collapsibleState, vscode.TreeItemCollapsibleState.Collapsed) assert.strictEqual(apigwTreeItemProperties.iconPath?.toString(), '$(info)') }) diff --git a/packages/core/src/testInteg/sam.test.ts b/packages/core/src/testInteg/sam.test.ts index 8dd8b5cdb9b..4f80d550df8 100644 --- a/packages/core/src/testInteg/sam.test.ts +++ b/packages/core/src/testInteg/sam.test.ts @@ -4,7 +4,7 @@ */ import assert from 'assert' -import { Runtime } from 'aws-sdk/clients/lambda' +import { Runtime } from '@aws-sdk/client-lambda' import { mkdtempSync } from 'fs' // eslint-disable-line no-restricted-imports import * as path from 'path' import * as semver from 'semver' @@ -92,7 +92,7 @@ const dotnetDefaults = { vscodeMinimum: '1.80.0', } -const defaults: Record = { +const defaults: Record = { nodejs: nodeDefaults, java: javaDefaults, python: pythonDefaults, @@ -100,7 +100,7 @@ const defaults: Record = { } function generateScenario( - runtime: Runtime, + runtime: string, version: string, options: Partial = {}, fromImage: boolean = false @@ -110,7 +110,7 @@ function generateScenario( } const { sourceTag, ...defaultOverride } = options const source = `(${options.sourceTag ? `${options.sourceTag} ` : ''}${fromImage ? 'Image' : 'ZIP'})` - const fullName = `${runtime}${version}` + const fullName = `${runtime}${version}` as Runtime return { runtime: fullName, displayName: `${fullName} ${source}`, @@ -123,7 +123,6 @@ function generateScenario( const scenarios: TestScenario[] = [ // zips - generateScenario('nodejs', '18.x'), generateScenario('nodejs', '20.x'), generateScenario('nodejs', '22.x', { vscodeMinimum: '1.78.0' }), generateScenario('python', '3.10'), @@ -135,7 +134,6 @@ const scenarios: TestScenario[] = [ generateScenario('java', '11', { sourceTag: 'Gradle' }), generateScenario('java', '17', { sourceTag: 'Gradle' }), // images - generateScenario('nodejs', '18.x', { baseImage: 'amazon/nodejs18.x-base' }, true), generateScenario('nodejs', '20.x', { baseImage: 'amazon/nodejs20.x-base' }, true), generateScenario('nodejs', '22.x', { baseImage: 'amazon/nodejs22.x-base', vscodeMinimum: '1.78.0' }, true), generateScenario('python', '3.10', { baseImage: 'amazon/python3.10-base' }, true), diff --git a/packages/toolkit/.changes/3.81.0.json b/packages/toolkit/.changes/3.81.0.json new file mode 100644 index 00000000000..43f8ac55d1a --- /dev/null +++ b/packages/toolkit/.changes/3.81.0.json @@ -0,0 +1,5 @@ +{ + "date": "2025-10-22", + "version": "3.81.0", + "entries": [] +} \ No newline at end of file diff --git a/packages/toolkit/.changes/3.82.0.json b/packages/toolkit/.changes/3.82.0.json new file mode 100644 index 00000000000..a56b15acf24 --- /dev/null +++ b/packages/toolkit/.changes/3.82.0.json @@ -0,0 +1,10 @@ +{ + "date": "2025-10-30", + "version": "3.82.0", + "entries": [ + { + "type": "Feature", + "description": "Lambda AppBuilder: Now you can install Finch from the AppBuilder walkthrough" + } + ] +} \ No newline at end of file diff --git a/packages/toolkit/CHANGELOG.md b/packages/toolkit/CHANGELOG.md index 868a46a01a4..7b00826ee18 100644 --- a/packages/toolkit/CHANGELOG.md +++ b/packages/toolkit/CHANGELOG.md @@ -1,3 +1,11 @@ +## 3.82.0 20ß25-10-30 + +- **Feature** Lambda AppBuilder: Now you can install Finch from the AppBuilder walkthrough + +## 3.81.0 2025-10-22 + +- Miscellaneous non-user-facing changes + ## 3.80.0 2025-10-16 - **Bug Fix** The space is updated upon creation of a new app with the requested settings diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index 7b676c20db5..8878cc0cbc6 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -2,7 +2,7 @@ "name": "aws-toolkit-vscode", "displayName": "AWS Toolkit", "description": "Including CodeCatalyst, Infrastructure Composer, and support for Lambda, S3, CloudWatch Logs, CloudFormation, and many other services.", - "version": "3.81.0-SNAPSHOT", + "version": "3.83.0-SNAPSHOT", "extensionKind": [ "workspace" ], @@ -4570,6 +4570,16 @@ "description": "%AWS.toolkit.lambda.walkthrough.description%", "when": "workspacePlatform != webworker", "steps": [ + { + "id": "toolInstallWindows", + "title": "%AWS.toolkit.lambda.walkthrough.toolInstall.title%", + "description": "%AWS.toolkit.lambda.walkthrough.toolInstall.description.windows%", + "media": { + "image": "./resources/walkthrough/appBuilder/install.png", + "altText": "Showing GUI installer" + }, + "when": "isWindows" + }, { "id": "toolInstall", "title": "%AWS.toolkit.lambda.walkthrough.toolInstall.title%", @@ -4577,7 +4587,8 @@ "media": { "image": "./resources/walkthrough/appBuilder/install.png", "altText": "Showing GUI installer" - } + }, + "when": "!isWindows" }, { "id": "chooseTemplate", From 902047085a10e5c78b67848819ab315d9da728d0 Mon Sep 17 00:00:00 2001 From: Laxman Reddy <141967714+laileni-aws@users.noreply.github.com> Date: Wed, 5 Nov 2025 12:53:19 -0800 Subject: [PATCH 26/53] fix(smus): Fixes for duplicate refresh, user profile filtering and adding session name to auth node (#2282) (#2285) Duplicate PR: https://github.com/aws/aws-toolkit-vscode-staging/pull/2283 PR has 3 commits: 1. Adding support for local dev testing 2. Fix bugs - User Profile filtering for IAM mode, duplicate refresh buttons 3. Add session name to auth node. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --------- ## Problem ## Solution --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: Bhargav Co-authored-by: Bhargava Varadharajan --- .../src/sagemakerunifiedstudio/auth/model.ts | 20 +- .../providers/smusAuthenticationProvider.ts | 103 +++++ .../sageMakerUnifiedStudioAuthInfoNode.ts | 18 +- .../shared/client/datazoneClient.ts | 14 +- .../client/datazoneCustomClientHelper.ts | 52 ++- packages/core/src/shared/clients/sagemaker.ts | 5 +- packages/core/src/shared/settings.ts | 1 + .../sagemakerunifiedstudio/auth/model.test.ts | 99 ++++- .../auth/smusAuthenticationProvider.test.ts | 359 ++++++++++++++++++ ...sageMakerUnifiedStudioAuthInfoNode.test.ts | 116 ++++++ .../client/datazoneCustomClientHelper.test.ts | 10 +- .../devSettingsEndpointConfiguration.test.ts | 86 +++++ packages/toolkit/package.json | 5 - 13 files changed, 850 insertions(+), 38 deletions(-) create mode 100644 packages/core/src/test/sagemakerunifiedstudio/shared/devSettingsEndpointConfiguration.test.ts diff --git a/packages/core/src/sagemakerunifiedstudio/auth/model.ts b/packages/core/src/sagemakerunifiedstudio/auth/model.ts index 3dcef1c708e..adc6fd29455 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/model.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/model.ts @@ -4,12 +4,21 @@ */ import { SsoProfile, SsoConnection, Connection, IamConnection } from '../../auth/connection' +import { DevSettings } from '../../shared/settings' /** - * Scope for SageMaker Unified Studio authentication + * Default scope for SageMaker Unified Studio authentication */ export const scopeSmus = 'datazone:domain:access' +/** + * Gets the DataZone SSO scope from user settings or returns the default + */ +export function getDataZoneSsoScope(): string { + const devSettings = DevSettings.instance + return devSettings.get('datazoneScope', scopeSmus) +} + /** * SageMaker Unified Studio profile extending the base SSO profile */ @@ -54,7 +63,7 @@ export function createSmusProfile( domainId: string, startUrl: string, region: string, - scopes = [scopeSmus] + scopes = [getDataZoneSsoScope()] ): SmusSsoProfile & { readonly scopes: string[] } { return { scopes, @@ -93,8 +102,11 @@ export function isSmusSsoConnection(conn?: Connection): conn is SmusSsoConnectio if (!conn || conn.type !== 'sso') { return false } - // Check if the connection has the required SMUS scope - const hasScope = Array.isArray((conn as any).scopes) && (conn as any).scopes.includes(scopeSmus) + // Check if the connection has the required SMUS scope (check both default and custom scope) + const configuredScope = getDataZoneSsoScope() + const hasScope = + Array.isArray((conn as any).scopes) && + ((conn as any).scopes.includes(scopeSmus) || (conn as any).scopes.includes(configuredScope)) // Check if the connection has the required SMUS properties const hasSmusProps = 'domainUrl' in conn && 'domainId' in conn return !!hasScope && !!hasSmusProps diff --git a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts index 606adfd3733..918243b28b0 100644 --- a/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts +++ b/packages/core/src/sagemakerunifiedstudio/auth/providers/smusAuthenticationProvider.ts @@ -88,6 +88,7 @@ export class SmusAuthenticationProvider { private connectionCredentialProvidersCache = new Map() private cachedDomainAccountId: string | undefined private cachedProjectAccountIds = new Map() + private iamCallerIdentityCache: { arn: string; connectionId: string } | undefined public readonly secondaryAuth: ReturnType @@ -146,6 +147,8 @@ export class SmusAuthenticationProvider { this.cachedDomainAccountId = undefined // Clear cached project account IDs when connection changes this.cachedProjectAccountIds.clear() + // Clear cached IAM caller identity when connection changes + this.clearIamCallerIdentityCache() // Clear all clients in client store when connection changes ConnectionClientStore.getInstance().clearAll() await setSmusConnectedContext(this.isConnected()) @@ -800,6 +803,103 @@ export class SmusAuthenticationProvider { return provider } + /** + * Gets the cached caller identity ARN for the active IAM connection + * Fetches from STS if not cached or if connection has changed + * Only works for IAM connections - returns undefined for SSO connections + * @returns Promise resolving to the ARN, or undefined if not available or not an IAM connection + */ + private async getCachedIamCallerIdentityArn(): Promise { + const logger = getLogger() + try { + const activeConn = this.activeConnection + // Only cache for IAM connections + if (!activeConn || activeConn.type !== 'iam') { + return undefined + } + + // Check if we have a cached ARN for this connection + if (this.iamCallerIdentityCache && this.iamCallerIdentityCache.connectionId === activeConn.id) { + logger.debug('SMUS: Using cached IAM caller identity ARN') + return this.iamCallerIdentityCache.arn + } + + // Fetch fresh caller identity + logger.debug('SMUS: Fetching IAM caller identity from STS') + const smusConnections = (this.secondaryAuth.state.get('smus.connections') as any) || {} + const connectionMetadata = smusConnections[activeConn.id] + + if (!connectionMetadata?.profileName || !connectionMetadata?.region) { + logger.debug('SMUS: Missing profile name or region in connection metadata') + return undefined + } + + const credentials = await this.getCredentialsForIamProfile(connectionMetadata.profileName) + const stsClient = new DefaultStsClient(connectionMetadata.region, credentials) + const callerIdentity = await stsClient.getCallerIdentity() + + if (!callerIdentity.Arn) { + logger.debug('SMUS: No ARN found in caller identity') + return undefined + } + + // Cache the result + this.iamCallerIdentityCache = { + arn: callerIdentity.Arn, + connectionId: activeConn.id, + } + logger.debug(`SMUS: Cached IAM caller identity ARN for connection ${activeConn.id}`) + + return callerIdentity.Arn + } catch (error) { + logger.warn(`SMUS: Failed to get IAM caller identity: %s`, error) + return undefined + } + } + + /** + * Gets the session name from the cached IAM caller identity + * Only works for IAM connections - returns undefined for SSO connections + * @returns Promise resolving to the session name, or undefined if not available or not an IAM connection + */ + public async getSessionName(): Promise { + const arn = await this.getCachedIamCallerIdentityArn() + if (!arn) { + return undefined + } + + const sessionName = SmusUtils.extractSessionNameFromArn(arn) + this.logger.debug(`SMUS: Extracted session name: ${sessionName || 'none'}`) + return sessionName + } + + /** + * Gets the role ARN from the cached IAM caller identity + * Converts assumed role ARN to IAM role ARN format + * Only works for IAM connections - returns undefined for SSO connections + * @returns Promise resolving to the IAM role ARN, or undefined if not available or not an IAM connection + */ + public async getRoleArn(): Promise { + const arn = await this.getCachedIamCallerIdentityArn() + if (!arn) { + return undefined + } + + // Convert assumed role ARN to IAM role ARN + const roleArn = SmusUtils.convertAssumedRoleArnToIamRoleArn(arn) + this.logger.debug(`SMUS: Extracted role ARN: ${roleArn || 'none'}`) + return roleArn + } + + /** + * Clears the cached IAM caller identity + * Should be called when connection changes or credentials are refreshed + */ + private clearIamCallerIdentityCache(): void { + this.iamCallerIdentityCache = undefined + this.logger.debug('SMUS: Cleared IAM caller identity cache') + } + /** * Reauthenticates an existing connection * @param conn Connection to reauthenticate @@ -1382,6 +1482,9 @@ export class SmusAuthenticationProvider { // Clear cached project account IDs this.cachedProjectAccountIds.clear() + // Clear cached IAM caller identity + this.clearIamCallerIdentityCache() + DataZoneClient.dispose() DataZoneCustomClientHelper.dispose() diff --git a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts index 08ee20cff79..20f03d14914 100644 --- a/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts +++ b/packages/core/src/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.ts @@ -62,9 +62,23 @@ export class SageMakerUnifiedStudioAuthInfoNode implements TreeNode { } if (isConnected && isValid) { - label = isExpressMode ? `Connected with profile: ${profileName}` : `Domain: ${domainId}` + // Get session name and role ARN dynamically for IAM connections in express mode + let sessionName: string | undefined + let roleArn: string | undefined + if (isExpressMode) { + sessionName = await this.authProvider.getSessionName() + roleArn = await this.authProvider.getRoleArn() + } + + // Format label with session name if available + const sessionSuffix = sessionName ? ` (session: ${sessionName})` : '' + label = isExpressMode ? `Connected with profile: ${profileName}${sessionSuffix}` : `Domain: ${domainId}` iconPath = new vscode.ThemeIcon('key', new vscode.ThemeColor('charts.green')) - tooltip = `Connected to SageMaker Unified Studio\n${isExpressMode ? `Profile: ${profileName}` : `Domain ID: ${domainId}`}\nRegion: ${region}\nStatus: Connected` + + // Add role ARN and session name to tooltip if available (role ARN before session) + const roleArnTooltip = roleArn ? `\nRole ARN: ${roleArn}` : '' + const sessionTooltip = sessionName ? `\nSession: ${sessionName}` : '' + tooltip = `Connected to SageMaker Unified Studio\n${isExpressMode ? `Profile: ${profileName}` : `Domain ID: ${domainId}`}\nRegion: ${region}${roleArnTooltip}${sessionTooltip}\nStatus: Connected` description = region } else if (isConnected && !isValid) { label = isExpressMode diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts index e653662ad9a..4f09b123662 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneClient.ts @@ -22,6 +22,7 @@ import { DefaultStsClient } from '../../../shared/clients/stsClient' import { getContext } from '../../../shared/vscode/setContext' import { CredentialsProvider } from '../../../auth/providers/credentials' import { SmusUtils } from '../smusUtils' +import { DevSettings } from '../../../shared/settings' /** * Represents a DataZone domain @@ -299,11 +300,14 @@ export class DataZoneClient { credentials: awsCredentialProvider, } - // Use environment variable for endpoint if provided - const endpoint = process.env.DATAZONE_ENDPOINT - if (endpoint) { - clientConfig.endpoint = endpoint - this.logger.debug(`DataZoneClient: Using environment variable DataZone endpoint: ${endpoint}`) + // Use user setting for endpoint if provided + const devSettings = DevSettings.instance + const customEndpoint = devSettings.get('endpoints', {})['datazone'] + if (customEndpoint) { + clientConfig.endpoint = customEndpoint + this.logger.debug( + `DataZoneClient: Using custom DataZone endpoint from settings: ${customEndpoint}` + ) } this.datazoneClient = new DataZone(clientConfig) diff --git a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts index 50b94ee25c5..b6fc80855ee 100644 --- a/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts +++ b/packages/core/src/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.ts @@ -13,6 +13,7 @@ import { adaptConnectionCredentialsProvider } from './credentialsAdapter' import { CredentialsProvider } from '../../../auth/providers/credentials' import { ToolkitError } from '../../../shared/errors' import { SmusUtils } from '../smusUtils' +import { DevSettings } from '../../../shared/settings' /** * Error codes for DataZone operations @@ -92,12 +93,14 @@ export class DataZoneCustomClientHelper { try { this.logger.info('DataZoneCustomClientHelper: Creating authenticated DataZone client') - // Use environment variable for endpoint if provided, otherwise use default - const endpoint = process.env.DATAZONE_ENDPOINT || `https://datazone.${this.region}.api.aws` + // Use user setting for endpoint if provided, otherwise use default + const devSettings = DevSettings.instance + const customEndpoint = devSettings.get('endpoints', {})['datazone'] + const endpoint = customEndpoint || `https://datazone.${this.region}.api.aws` - if (process.env.DATAZONE_ENDPOINT) { + if (customEndpoint) { this.logger.debug( - `DataZoneCustomClientHelper: Using environment variable DataZone endpoint: ${endpoint}` + `DataZoneCustomClientHelper: Using custom DataZone endpoint from settings: ${endpoint}` ) } @@ -461,35 +464,50 @@ export class DataZoneCustomClientHelper { }) } - this.logger.debug(`DataZoneCustomClientHelper: Extracted session name: ${sessionName}`) + // Convert assumed role ARN to IAM role ARN for matching + // Format: arn:aws:sts::ACCOUNT:assumed-role/ROLE_NAME/SESSION_NAME -> arn:aws:iam::ACCOUNT:role/ROLE_NAME + const iamRoleArn = SmusUtils.convertAssumedRoleArnToIamRoleArn(roleArnWithSession) + if (!iamRoleArn) { + throw new ToolkitError(`Unable to convert assumed role ARN to IAM role ARN: ${roleArnWithSession}`, { + code: DataZoneErrorCode.NoUserProfileFound, + }) + } - // Paginate through all user profiles and do client-side filtering + this.logger.debug( + `DataZoneCustomClientHelper: Extracted session name: ${sessionName}, IAM role ARN: ${iamRoleArn}` + ) + + // Use searchText to filter by role ARN on server side, then filter by session name on client side let nextToken: string | undefined let totalProfilesChecked = 0 do { + this.logger.debug( + `DataZoneCustomClientHelper: Calling searchUserProfiles with searchText: ${iamRoleArn}` + ) + const response = await this.searchUserProfiles(domainIdentifier, { userType: 'DATAZONE_IAM_USER', + searchText: iamRoleArn, // Server-side filter by role ARN maxResults: 50, nextToken, }) totalProfilesChecked += response.items.length this.logger.debug( - `DataZoneCustomClientHelper: Received ${response.items.length} user profiles in current page (total checked: ${totalProfilesChecked})` + `DataZoneCustomClientHelper: Received ${response.items.length} user profiles matching role ARN in current page (total checked: ${totalProfilesChecked})` ) - // Find exact match in current page using client-side filtering + // Find exact match in current page using client-side filtering for session name + // Server-side filtering by role ARN should have already reduced the result set significantly for (const profile of response.items) { - this.logger.debug( - `DataZoneCustomClientHelper: Checking profile - ID: ${profile.id}, principalId: ${profile.details?.iam?.principalId}, status: ${profile.status}` - ) - - // Match based on principalId which contains the session name + // Match based on session name (role ARN already filtered by searchText) // principalId format: PRINCIPAL_ID:SESSION_NAME - if (profile.details?.iam?.principalId?.includes(sessionName)) { + const matchesSession = profile.details?.iam?.principalId?.includes(sessionName) + + if (matchesSession) { this.logger.info( - `DataZoneCustomClientHelper: Found matching user profile with ID: ${profile.id} after checking ${totalProfilesChecked} profiles` + `DataZoneCustomClientHelper: Found matching user profile with ID: ${profile.id} (role: ${iamRoleArn}, session: ${sessionName}) after checking ${totalProfilesChecked} profiles` ) return profile.id! } @@ -500,9 +518,9 @@ export class DataZoneCustomClientHelper { // No matching profile found after checking all pages this.logger.error( - `DataZoneCustomClientHelper: No user profile found for session: ${sessionName} after checking ${totalProfilesChecked} profiles` + `DataZoneCustomClientHelper: No user profile found for role: ${iamRoleArn} with session: ${sessionName} after checking ${totalProfilesChecked} profiles` ) - throw new ToolkitError(`No user profile found for session: ${sessionName}`, { + throw new ToolkitError(`No user profile found for role: ${iamRoleArn} with session: ${sessionName}`, { code: DataZoneErrorCode.NoUserProfileFound, }) } catch (err) { diff --git a/packages/core/src/shared/clients/sagemaker.ts b/packages/core/src/shared/clients/sagemaker.ts index 1b5ab92e7d4..c77ad8cd3fa 100644 --- a/packages/core/src/shared/clients/sagemaker.ts +++ b/packages/core/src/shared/clients/sagemaker.ts @@ -51,6 +51,7 @@ import { ToolkitError } from '../errors' import { yes, no, continueText, cancel } from '../localizedText' import { AwsCredentialIdentity } from '@aws-sdk/types' import globals from '../extensionGlobals' +import { DevSettings } from '../settings' const appTypeSettingsMap: Record = { [AppType.JupyterLab as string]: 'JupyterLabAppSettings', @@ -72,7 +73,9 @@ export class SagemakerClient extends ClientWrapper { protected override getClient(ignoreCache: boolean = false) { if (!this.client || ignoreCache) { - const endpoint = process.env.SAGEMAKER_ENDPOINT || `https://sagemaker.${this.regionCode}.amazonaws.com` + const devSettings = DevSettings.instance + const customEndpoint = devSettings.get('endpoints', {})['sagemaker'] + const endpoint = customEndpoint || `https://sagemaker.${this.regionCode}.amazonaws.com` const args = { serviceClient: SageMakerClient, region: this.regionCode, diff --git a/packages/core/src/shared/settings.ts b/packages/core/src/shared/settings.ts index 4e3e99f8207..6b5a5af145e 100644 --- a/packages/core/src/shared/settings.ts +++ b/packages/core/src/shared/settings.ts @@ -782,6 +782,7 @@ const devSettings = { autofillStartUrl: String, webAuth: Boolean, notificationsPollInterval: Number, + datazoneScope: String, } type ResolvedDevSettings = FromDescriptor type AwsDevSetting = keyof ResolvedDevSettings diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts index 98b106022b6..e1d030ea825 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/model.test.ts @@ -3,8 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -import assert from 'assert' +import * as assert from 'assert' import { Credentials } from '@aws-sdk/types' +import * as sinon from 'sinon' import { SmusSsoConnection, SmusIamConnection, @@ -13,9 +14,21 @@ import { isValidSmusConnection, createSmusProfile, scopeSmus, + getDataZoneSsoScope, } from '../../../sagemakerunifiedstudio/auth/model' +import { DevSettings } from '../../../shared/settings' describe('SMUS Connection Model', function () { + let sandbox: sinon.SinonSandbox + + beforeEach(function () { + sandbox = sinon.createSandbox() + }) + + afterEach(function () { + sandbox.restore() + }) + const mockCredentials: Credentials = { accessKeyId: 'test-access-key', secretAccessKey: 'test-secret-key', @@ -218,8 +231,33 @@ describe('SMUS Connection Model', function () { }) }) + describe('getDataZoneSsoScope', function () { + it('should return default scope when no custom setting is provided', function () { + // When get() is called with default value, it returns the default (scopeSmus) + // This simulates the behavior when aws.dev.datazoneScope is not set + sandbox.stub(DevSettings.instance, 'get').withArgs('datazoneScope', scopeSmus).returns(scopeSmus) + + const scope = getDataZoneSsoScope() + + assert.strictEqual(scope, scopeSmus) + }) + + it('should return custom scope when setting is configured', function () { + const customScope = 'custom:datazone:scope' + // When get() is called, it returns the custom value from settings + // This simulates the behavior when aws.dev.datazoneScope is set to customScope + sandbox.stub(DevSettings.instance, 'get').withArgs('datazoneScope', scopeSmus).returns(customScope) + + const scope = getDataZoneSsoScope() + + assert.strictEqual(scope, customScope) + }) + }) + describe('createSmusProfile', function () { it('should create a valid SMUS profile with default scope', function () { + sandbox.stub(DevSettings.instance, 'get').withArgs('datazoneScope', scopeSmus).returns(scopeSmus) + const domainUrl = 'https://test.sagemaker.us-east-1.on.aws/' const domainId = 'test-domain-id' const startUrl = 'https://test.awsapps.com/start' @@ -235,7 +273,21 @@ describe('SMUS Connection Model', function () { assert.deepStrictEqual(profile.scopes, [scopeSmus]) }) - it('should create a valid SMUS profile with custom scopes', function () { + it('should create a valid SMUS profile with custom scope from settings', function () { + const customScope = 'custom:datazone:scope' + sandbox.stub(DevSettings.instance, 'get').withArgs('datazoneScope', scopeSmus).returns(customScope) + + const domainUrl = 'https://test.sagemaker.us-east-1.on.aws/' + const domainId = 'test-domain-id' + const startUrl = 'https://test.awsapps.com/start' + const region = 'us-east-1' + + const profile = createSmusProfile(domainUrl, domainId, startUrl, region) + + assert.deepStrictEqual(profile.scopes, [customScope]) + }) + + it('should create a valid SMUS profile with custom scopes parameter', function () { const domainUrl = 'https://test.sagemaker.us-east-1.on.aws/' const domainId = 'test-domain-id' const startUrl = 'https://test.awsapps.com/start' @@ -247,4 +299,47 @@ describe('SMUS Connection Model', function () { assert.deepStrictEqual(profile.scopes, customScopes) }) }) + + describe('isSmusSsoConnection with custom scope', function () { + it('should return true for connection with custom scope from settings', function () { + const customScope = 'custom:datazone:scope' + sandbox.stub(DevSettings.instance, 'get').withArgs('datazoneScope', scopeSmus).returns(customScope) + + const connection = { + type: 'sso', + startUrl: 'https://test.awsapps.com/start', + ssoRegion: 'us-east-1', + scopes: [customScope], + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test SSO Connection', + getToken: mockGetToken, + getRegistration: mockGetRegistration, + } as SmusSsoConnection + + assert.strictEqual(isSmusSsoConnection(connection), true) + }) + + it('should return true for connection with default scope even when custom scope is configured', function () { + const customScope = 'custom:datazone:scope' + sandbox.stub(DevSettings.instance, 'get').withArgs('datazoneScope', scopeSmus).returns(customScope) + + const connection = { + type: 'sso', + startUrl: 'https://test.awsapps.com/start', + ssoRegion: 'us-east-1', + scopes: [scopeSmus], // Using default scope + domainUrl: 'https://test.sagemaker.us-east-1.on.aws/', + domainId: 'test-domain-id', + id: 'test-id', + label: 'Test SSO Connection', + getToken: mockGetToken, + getRegistration: mockGetRegistration, + } as SmusSsoConnection + + // Should still work for backward compatibility + assert.strictEqual(isSmusSsoConnection(connection), true) + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts index 1aecc1a146f..df4699ce3eb 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/auth/smusAuthenticationProvider.test.ts @@ -1485,4 +1485,363 @@ describe('SmusAuthenticationProvider', function () { assert.ok(setContextStubGlobal.calledWith('aws.smus.isExpressMode', false)) }) }) + + describe('getSessionName', function () { + let mockStsClient: any + let mockCredentialsProvider: any + + beforeEach(function () { + // Mock STS client + mockStsClient = { + getCallerIdentity: sinon.stub(), + } + sinon + .stub(DefaultStsClient.prototype, 'getCallerIdentity') + .callsFake(() => mockStsClient.getCallerIdentity()) + + // Mock credentials provider + mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-access-key', + secretAccessKey: 'test-secret-key', + sessionToken: 'test-session-token', + }), + } + + sinon + .stub(smusAuthProvider as any, 'getCredentialsForIamProfile') + .resolves(mockCredentialsProvider.getCredentials()) + }) + + afterEach(function () { + sinon.restore() + }) + + it('should return session name for IAM connection with assumed role', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + endpointUrl: undefined, + getCredentials: sinon.stub().resolves(), + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + // Mock STS response with assumed role ARN + const assumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/my-session-name' + mockStsClient.getCallerIdentity.resolves({ + Arn: assumedRoleArn, + Account: '123456789012', + UserId: 'AIDAI1234567890EXAMPLE:my-session-name', + }) + + // Mock connection metadata + const smusConnections = { + [iamConnection.id]: { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockSecondaryAuth.state.get.withArgs('smus.connections').returns(smusConnections) + + const sessionName = await smusAuthProvider.getSessionName() + + assert.strictEqual(sessionName, 'my-session-name') + assert.ok(mockStsClient.getCallerIdentity.calledOnce) + }) + + it('should return undefined for IAM connection without assumed role (IAM user)', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + endpointUrl: undefined, + getCredentials: sinon.stub().resolves(), + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + // Mock STS response with IAM user ARN (no session name) + const iamUserArn = 'arn:aws:iam::123456789012:user/my-user' + mockStsClient.getCallerIdentity.resolves({ + Arn: iamUserArn, + Account: '123456789012', + UserId: 'AIDAI1234567890EXAMPLE', + }) + + // Mock connection metadata + const smusConnections = { + [iamConnection.id]: { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockSecondaryAuth.state.get.withArgs('smus.connections').returns(smusConnections) + + const sessionName = await smusAuthProvider.getSessionName() + + assert.strictEqual(sessionName, undefined) + assert.ok(mockStsClient.getCallerIdentity.calledOnce) + }) + + it('should return undefined for SSO connection', async function () { + mockSecondaryAuthState.activeConnection = mockSmusConnection + + const sessionName = await smusAuthProvider.getSessionName() + + assert.strictEqual(sessionName, undefined) + assert.ok(mockStsClient.getCallerIdentity.notCalled) + }) + + it('should return undefined when not connected', async function () { + mockSecondaryAuthState.activeConnection = undefined + + const sessionName = await smusAuthProvider.getSessionName() + + assert.strictEqual(sessionName, undefined) + assert.ok(mockStsClient.getCallerIdentity.notCalled) + }) + + it('should cache and reuse caller identity ARN', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + endpointUrl: undefined, + getCredentials: sinon.stub().resolves(), + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + const assumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/my-session-name' + mockStsClient.getCallerIdentity.resolves({ + Arn: assumedRoleArn, + Account: '123456789012', + UserId: 'AIDAI1234567890EXAMPLE:my-session-name', + }) + + // Mock connection metadata + const smusConnections = { + [iamConnection.id]: { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockSecondaryAuth.state.get.withArgs('smus.connections').returns(smusConnections) + + // First call - should fetch from STS + const sessionName1 = await smusAuthProvider.getSessionName() + assert.strictEqual(sessionName1, 'my-session-name') + assert.ok(mockStsClient.getCallerIdentity.calledOnce) + + // Second call - should use cached value + const sessionName2 = await smusAuthProvider.getSessionName() + assert.strictEqual(sessionName2, 'my-session-name') + assert.ok(mockStsClient.getCallerIdentity.calledOnce) // Still only called once + }) + + it('should handle STS errors gracefully', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + endpointUrl: undefined, + getCredentials: sinon.stub().resolves(), + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + mockStsClient.getCallerIdentity.rejects(new Error('STS call failed')) + + // Mock connection metadata + const smusConnections = { + [iamConnection.id]: { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockSecondaryAuth.state.get.withArgs('smus.connections').returns(smusConnections) + + const sessionName = await smusAuthProvider.getSessionName() + + assert.strictEqual(sessionName, undefined) + }) + + it('should return undefined when connection metadata is missing', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + endpointUrl: undefined, + getCredentials: sinon.stub().resolves(), + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + // No connection metadata + mockSecondaryAuth.state.get.withArgs('smus.connections').returns({}) + + const sessionName = await smusAuthProvider.getSessionName() + + assert.strictEqual(sessionName, undefined) + assert.ok(mockStsClient.getCallerIdentity.notCalled) + }) + }) + + describe('getRoleArn', function () { + let mockStsClient: any + let mockCredentialsProvider: any + + beforeEach(function () { + // Mock STS client + mockStsClient = { + getCallerIdentity: sinon.stub(), + } + sinon + .stub(DefaultStsClient.prototype, 'getCallerIdentity') + .callsFake(() => mockStsClient.getCallerIdentity()) + + // Mock credentials provider + mockCredentialsProvider = { + getCredentials: sinon.stub().resolves({ + accessKeyId: 'test-access-key', + secretAccessKey: 'test-secret-key', + sessionToken: 'test-session-token', + }), + } + + sinon + .stub(smusAuthProvider as any, 'getCredentialsForIamProfile') + .resolves(mockCredentialsProvider.getCredentials()) + }) + + afterEach(function () { + sinon.restore() + }) + + it('should return IAM role ARN for IAM connection with assumed role', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + endpointUrl: undefined, + getCredentials: sinon.stub().resolves(), + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + // Mock STS response with assumed role ARN + const assumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/my-session-name' + mockStsClient.getCallerIdentity.resolves({ + Arn: assumedRoleArn, + Account: '123456789012', + UserId: 'AIDAI1234567890EXAMPLE:my-session-name', + }) + + // Mock connection metadata + const smusConnections = { + [iamConnection.id]: { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockSecondaryAuth.state.get.withArgs('smus.connections').returns(smusConnections) + + const roleArn = await smusAuthProvider.getRoleArn() + + // Should convert assumed role ARN to IAM role ARN + assert.strictEqual(roleArn, 'arn:aws:iam::123456789012:role/MyRole') + assert.ok(mockStsClient.getCallerIdentity.calledOnce) + }) + + it('should return undefined for SSO connection', async function () { + mockSecondaryAuthState.activeConnection = mockSmusConnection + + const roleArn = await smusAuthProvider.getRoleArn() + + assert.strictEqual(roleArn, undefined) + assert.ok(mockStsClient.getCallerIdentity.notCalled) + }) + + it('should return undefined when not connected', async function () { + mockSecondaryAuthState.activeConnection = undefined + + const roleArn = await smusAuthProvider.getRoleArn() + + assert.strictEqual(roleArn, undefined) + assert.ok(mockStsClient.getCallerIdentity.notCalled) + }) + + it('should use cached caller identity ARN', async function () { + const iamConnection = { + id: 'profile:test-profile', + type: 'iam' as const, + label: 'Test IAM Profile', + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + endpointUrl: undefined, + getCredentials: sinon.stub().resolves(), + } + mockSecondaryAuthState.activeConnection = iamConnection as any + + const assumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/MyRole/my-session-name' + mockStsClient.getCallerIdentity.resolves({ + Arn: assumedRoleArn, + Account: '123456789012', + UserId: 'AIDAI1234567890EXAMPLE:my-session-name', + }) + + // Mock connection metadata + const smusConnections = { + [iamConnection.id]: { + profileName: 'test-profile', + region: testRegion, + domainUrl: testDomainUrl, + domainId: testDomainId, + }, + } + mockSecondaryAuth.state.get.withArgs('smus.connections').returns(smusConnections) + + // First call - should fetch from STS + const roleArn1 = await smusAuthProvider.getRoleArn() + assert.strictEqual(roleArn1, 'arn:aws:iam::123456789012:role/MyRole') + assert.ok(mockStsClient.getCallerIdentity.calledOnce) + + // Second call - should use cached value + const roleArn2 = await smusAuthProvider.getRoleArn() + assert.strictEqual(roleArn2, 'arn:aws:iam::123456789012:role/MyRole') + assert.ok(mockStsClient.getCallerIdentity.calledOnce) // Still only called once + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts index f1350ef9cec..a0177aebb60 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/explorer/nodes/sageMakerUnifiedStudioAuthInfoNode.test.ts @@ -50,6 +50,8 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { } return undefined }), + getSessionName: sinon.stub().resolves(undefined), + getRoleArn: sinon.stub().resolves(undefined), get activeConnection() { return currentActiveConnection }, @@ -58,6 +60,9 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { }, } + // Stub getContext to return false for express mode by default (SSO connections) + sinon.stub(require('../../../../shared/vscode/setContext'), 'getContext').returns(false) + // Stub SmusAuthenticationProvider.fromContext sinon.stub(SmusAuthenticationProvider, 'fromContext').returns(mockAuthProvider as any) @@ -299,4 +304,115 @@ describe('SageMakerUnifiedStudioAuthInfoNode', function () { assert.ok(tooltip.includes('Please sign in to access your projects')) }) }) + + describe('IAM connections in express mode', function () { + let mockIamConnection: any + + beforeEach(function () { + mockIamConnection = { + id: 'profile:test-profile', + type: 'iam', + label: 'Test IAM Profile', + profileName: 'test-profile', + region: 'us-west-2', + domainUrl: 'https://dzd_domainId.sagemaker.us-west-2.on.aws', + domainId: 'dzd_domainId', + getCredentials: sinon.stub().resolves(), + } + + currentActiveConnection = mockIamConnection + + // Override getContext stub to return true for express mode + const getContextModule = require('../../../../shared/vscode/setContext') + const existingStub = getContextModule.getContext as sinon.SinonStub + existingStub.withArgs('aws.smus.isExpressMode').returns(true) + }) + + it('should display profile name with session name for IAM connection', async function () { + mockAuthProvider.isConnected.returns(true) + mockAuthProvider.isConnectionValid.returns(true) + mockAuthProvider.getSessionName = sinon.stub().resolves('my-session-name') + + const treeItem = await authInfoNode.getTreeItem() + + assert.strictEqual(treeItem.label, 'Connected with profile: test-profile (session: my-session-name)') + assert.strictEqual(treeItem.description, 'us-west-2') + }) + + it('should display profile name without session name when unavailable', async function () { + mockAuthProvider.isConnected.returns(true) + mockAuthProvider.isConnectionValid.returns(true) + mockAuthProvider.getSessionName = sinon.stub().resolves(undefined) + + const treeItem = await authInfoNode.getTreeItem() + + assert.strictEqual(treeItem.label, 'Connected with profile: test-profile') + assert.strictEqual(treeItem.description, 'us-west-2') + }) + + it('should include session name and role ARN in tooltip when available', async function () { + mockAuthProvider.isConnected.returns(true) + mockAuthProvider.isConnectionValid.returns(true) + mockAuthProvider.getSessionName = sinon.stub().resolves('my-session-name') + mockAuthProvider.getRoleArn = sinon.stub().resolves('arn:aws:iam::123456789012:role/MyRole') + + const treeItem = await authInfoNode.getTreeItem() + const tooltip = treeItem.tooltip as string + + assert.ok(tooltip.includes('Connected to SageMaker Unified Studio')) + assert.ok(tooltip.includes('Profile: test-profile')) + assert.ok(tooltip.includes('Region: us-west-2')) + assert.ok(tooltip.includes('Session: my-session-name')) + assert.ok(tooltip.includes('Role ARN: arn:aws:iam::123456789012:role/MyRole')) + assert.ok(tooltip.includes('Status: Connected')) + }) + + it('should not include session name or role ARN in tooltip when unavailable', async function () { + mockAuthProvider.isConnected.returns(true) + mockAuthProvider.isConnectionValid.returns(true) + mockAuthProvider.getSessionName = sinon.stub().resolves(undefined) + mockAuthProvider.getRoleArn = sinon.stub().resolves(undefined) + + const treeItem = await authInfoNode.getTreeItem() + const tooltip = treeItem.tooltip as string + + assert.ok(tooltip.includes('Connected to SageMaker Unified Studio')) + assert.ok(tooltip.includes('Profile: test-profile')) + assert.ok(tooltip.includes('Region: us-west-2')) + assert.ok(!tooltip.includes('Session:')) + assert.ok(!tooltip.includes('Role ARN:')) + assert.ok(tooltip.includes('Status: Connected')) + }) + + it('should handle getSessionName errors gracefully', async function () { + mockAuthProvider.isConnected.returns(true) + mockAuthProvider.isConnectionValid.returns(true) + mockAuthProvider.getSessionName = sinon.stub().resolves(undefined) // Return undefined instead of rejecting + + // Should not throw, just display without session name + const treeItem = await authInfoNode.getTreeItem() + + assert.strictEqual(treeItem.label, 'Connected with profile: test-profile') + assert.strictEqual(treeItem.description, 'us-west-2') + }) + + it('should display expired IAM connection with profile name', async function () { + mockAuthProvider.isConnected.returns(true) + mockAuthProvider.isConnectionValid.returns(false) + mockAuthProvider.getSessionName = sinon.stub().resolves('my-session-name') + + const treeItem = await authInfoNode.getTreeItem() + + assert.strictEqual(treeItem.label, 'Profile: test-profile (Expired) - Click to reauthenticate') + assert.strictEqual(treeItem.description, 'us-west-2') + + // Check icon + assert.ok(treeItem.iconPath instanceof vscode.ThemeIcon) + assert.strictEqual((treeItem.iconPath as vscode.ThemeIcon).id, 'warning') + + // Should have reauthenticate command + assert.ok(treeItem.command) + assert.strictEqual(treeItem.command.command, 'aws.smus.reauthenticate') + }) + }) }) diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts index 655165e4c3d..bf007331f69 100644 --- a/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/client/datazoneCustomClientHelper.test.ts @@ -799,7 +799,7 @@ describe('DataZoneCustomClientHelper', () => { const mockDomainId = 'dzd_test123' const mockAssumedRoleArn = 'arn:aws:sts::123456789012:assumed-role/AdminRole/my-session' - it('should find matching user profile by session name', async () => { + it('should find matching user profile by role ARN and session name', async () => { const searchStub = sinon.stub(client, 'searchUserProfiles') searchStub.onFirstCall().resolves({ items: [ @@ -808,6 +808,7 @@ describe('DataZoneCustomClientHelper', () => { status: 'ACTIVATED', details: { iam: { + arn: 'arn:aws:iam::123456789012:role/AdminRole', principalId: 'AIDAI123456789EXAMPLE:my-session', }, }, @@ -822,12 +823,13 @@ describe('DataZoneCustomClientHelper', () => { assert.ok(searchStub.calledOnce) assert.strictEqual(searchStub.firstCall.args[0], mockDomainId) assert.strictEqual(searchStub.firstCall.args[1].userType, 'DATAZONE_IAM_USER') + assert.strictEqual(searchStub.firstCall.args[1].searchText, 'arn:aws:iam::123456789012:role/AdminRole') }) it('should find matching user profile across multiple pages', async () => { const searchStub = sinon.stub(client, 'searchUserProfiles') - // First page - no match + // First page - no match (different session name) searchStub.onFirstCall().resolves({ items: [ { @@ -835,6 +837,7 @@ describe('DataZoneCustomClientHelper', () => { status: 'ACTIVATED', details: { iam: { + arn: 'arn:aws:iam::123456789012:role/AdminRole', principalId: 'AIDAI123456789EXAMPLE:other-session', }, }, @@ -851,6 +854,7 @@ describe('DataZoneCustomClientHelper', () => { status: 'ACTIVATED', details: { iam: { + arn: 'arn:aws:iam::123456789012:role/AdminRole', principalId: 'AIDAI987654321EXAMPLE:my-session', }, }, @@ -887,6 +891,7 @@ describe('DataZoneCustomClientHelper', () => { status: 'ACTIVATED', details: { iam: { + arn: 'arn:aws:iam::123456789012:role/AdminRole', principalId: 'AIDAI123456789EXAMPLE:other-session', }, }, @@ -1074,6 +1079,7 @@ describe('DataZoneCustomClientHelper', () => { status: 'ACTIVATED', details: { iam: { + arn: 'arn:aws:iam::123456789012:role/AdminRole', principalId: 'AIDAI123456789EXAMPLE:my-session', }, }, diff --git a/packages/core/src/test/sagemakerunifiedstudio/shared/devSettingsEndpointConfiguration.test.ts b/packages/core/src/test/sagemakerunifiedstudio/shared/devSettingsEndpointConfiguration.test.ts new file mode 100644 index 00000000000..c5321283017 --- /dev/null +++ b/packages/core/src/test/sagemakerunifiedstudio/shared/devSettingsEndpointConfiguration.test.ts @@ -0,0 +1,86 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as assert from 'assert' +import * as sinon from 'sinon' +import { DevSettings } from '../../../shared/settings' + +describe('Endpoint Configuration from Settings', () => { + let sandbox: sinon.SinonSandbox + + beforeEach(() => { + sandbox = sinon.createSandbox() + }) + + afterEach(() => { + sandbox.restore() + }) + + describe('DataZone endpoint configuration', () => { + it('should return custom DataZone endpoint when configured', () => { + const customEndpoint = 'https://custom-datazone.example.com' + const getStub = sandbox.stub(DevSettings.instance, 'get') + getStub.withArgs('endpoints', {}).returns({ datazone: customEndpoint }) + + const endpoints = DevSettings.instance.get('endpoints', {}) + const datazoneEndpoint = endpoints['datazone'] + + assert.strictEqual(datazoneEndpoint, customEndpoint) + }) + }) + + describe('SageMaker endpoint configuration', () => { + it('should return custom SageMaker endpoint when configured', () => { + const customEndpoint = 'https://custom-sagemaker.example.com' + const getStub = sandbox.stub(DevSettings.instance, 'get') + getStub.withArgs('endpoints', {}).returns({ sagemaker: customEndpoint }) + + const endpoints = DevSettings.instance.get('endpoints', {}) + const sagemakerEndpoint = endpoints['sagemaker'] + + assert.strictEqual(sagemakerEndpoint, customEndpoint) + }) + }) + + describe('Endpoint fallback behavior', () => { + it('should construct default DataZone endpoint when custom endpoint is not set', () => { + const getStub = sandbox.stub(DevSettings.instance, 'get') + getStub.withArgs('endpoints', {}).returns({}) + + const region = 'us-west-2' + const endpoints = DevSettings.instance.get('endpoints', {}) + const customEndpoint = endpoints['datazone'] + const endpoint = customEndpoint || `https://datazone.${region}.api.aws` + + assert.strictEqual(endpoint, 'https://datazone.us-west-2.api.aws') + }) + + it('should construct default SageMaker endpoint when custom endpoint is not set', () => { + const getStub = sandbox.stub(DevSettings.instance, 'get') + getStub.withArgs('endpoints', {}).returns({}) + + const region = 'us-east-1' + const endpoints = DevSettings.instance.get('endpoints', {}) + const customEndpoint = endpoints['sagemaker'] + const endpoint = customEndpoint || `https://sagemaker.${region}.amazonaws.com` + + assert.strictEqual(endpoint, 'https://sagemaker.us-east-1.amazonaws.com') + }) + + it('should handle multiple endpoints in configuration', () => { + const customEndpoints = { + datazone: 'https://custom-datazone.example.com', + sagemaker: 'https://custom-sagemaker.example.com', + } + const getStub = sandbox.stub(DevSettings.instance, 'get') + getStub.withArgs('endpoints', {}).returns(customEndpoints) + + const endpoints = DevSettings.instance.get('endpoints', {}) + + assert.strictEqual(endpoints['datazone'], customEndpoints.datazone) + assert.strictEqual(endpoints['sagemaker'], customEndpoints.sagemaker) + }) + }) +}) diff --git a/packages/toolkit/package.json b/packages/toolkit/package.json index bd4f7b866ad..9c9ac9b2a43 100644 --- a/packages/toolkit/package.json +++ b/packages/toolkit/package.json @@ -1347,11 +1347,6 @@ "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected", "group": "smus@1" }, - { - "command": "aws.smus.refresh", - "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && aws.smus.isExpressMode", - "group": "smus@1" - }, { "command": "aws.smus.signOut", "when": "view == aws.smus.rootView && !aws.isWebExtHost && aws.smus.connected && !aws.smus.inSmusSpaceEnvironment", From 5a20bcc8edbe8ce25576b7c037d6512284c2d07f Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Tue, 13 Jan 2026 16:42:08 -0800 Subject: [PATCH 27/53] fix(sagemaker): Update Kiro version requirement for SSH to 0.8.0 (#2323) ## Problem Prior to Kiro v0.8.0, when a user attempted to connect to a SageMaker Space, we would install the required sagemaker-ssh-kiro extension, but it would fail to activate unless the user configured the IDE to permit that extension to use specific proposed APIs (resolvers, contribViewsRemote). ## Solution Kiro v0.8.0 has allow listed the sagemaker-ssh-kiro extension to use the required proposed APIs, so we are updating the minimum required version to be v0.8.0 to streamline the user experience. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. --- .../sagemaker/sagemakerSshKiroUtils.ts | 2 +- .../sagemaker/sagemakerSshKiroUtils.test.ts | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts index bdf8df71f83..f06c11780f8 100644 --- a/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts +++ b/packages/core/src/awsService/sagemaker/sagemakerSshKiroUtils.ts @@ -18,7 +18,7 @@ const logger = getLogger('sagemaker') const pluginTechnicalName = 'sagemaker-ssh-kiro' const pluginDisplayName = 'Amazon SageMaker SSH Plugin for Kiro' -const minKiroVersion = '0.3.0' +const minKiroVersion = '0.8.0' let updatedExtensionToVersion: string let vscodeProductJson: any diff --git a/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts index 7a9e5d7f114..7e90c466b70 100644 --- a/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts +++ b/packages/core/src/test/awsService/sagemaker/sagemakerSshKiroUtils.test.ts @@ -38,7 +38,7 @@ describe('SageMaker SSH Kiro Utils', () => { // Mock product.json reading readFileTextStub = sandbox.stub(fs, 'readFileText') - readFileTextStub.resolves(JSON.stringify({ version: '0.3.0' })) + readFileTextStub.resolves(JSON.stringify({ version: '0.8.0' })) // Mock vscode.env.appRoot sandbox.stub(vscode.env, 'appRoot').value('/mock/vscode/app') @@ -105,16 +105,16 @@ describe('SageMaker SSH Kiro Utils', () => { describe('getKiroVersion', () => { it('reads version from product.json', async () => { - readFileTextStub.resolves(JSON.stringify({ version: '0.4.0' })) + readFileTextStub.resolves(JSON.stringify({ version: '0.8.1' })) const version = await getKiroVersion() - assert.strictEqual(version, '0.4.0') + assert.strictEqual(version, '0.8.1') sinon.assert.calledWith(readFileTextStub, path.join('/mock', 'vscode', 'app', 'product.json')) }) it('caches product.json after first read', async () => { - readFileTextStub.resolves(JSON.stringify({ version: '0.4.0' })) + readFileTextStub.resolves(JSON.stringify({ version: '0.8.1' })) await getKiroVersion() await getKiroVersion() @@ -136,16 +136,16 @@ describe('SageMaker SSH Kiro Utils', () => { }) it('throws error when Kiro version is too old', async () => { - readFileTextStub.resolves(JSON.stringify({ version: '0.2.9' })) + readFileTextStub.resolves(JSON.stringify({ version: '0.7.9' })) await assert.rejects( () => ensureSageMakerSshKiroExtension(mockContext), - /requires.+version 0\.3\.0 or higher \(current: 0\.2\.9\)/i + /requires.+version 0\.8\.0 or higher \(current: 0\.7\.9\)/i ) }) it('succeeds when Kiro version meets minimum requirement', async () => { - readFileTextStub.resolves(JSON.stringify({ version: '0.3.0' })) + readFileTextStub.resolves(JSON.stringify({ version: '0.8.0' })) getExtensionStub .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) .returns({ packageJSON: { version: '0.1.0' } }) @@ -156,7 +156,7 @@ describe('SageMaker SSH Kiro Utils', () => { }) it('succeeds when Kiro version exceeds minimum requirement', async () => { - readFileTextStub.resolves(JSON.stringify({ version: '0.4.0' })) + readFileTextStub.resolves(JSON.stringify({ version: '0.9.0' })) getExtensionStub .withArgs(VSCODE_EXTENSION_ID.sagemakerSshKiro) .returns({ packageJSON: { version: '0.1.0' } }) From 4bfb1d37bc2b5a41294d7511d4d216afc25df177 Mon Sep 17 00:00:00 2001 From: Dylan Ross <90357952+dylanraws@users.noreply.github.com> Date: Thu, 15 Jan 2026 16:02:31 -0800 Subject: [PATCH 28/53] fix(sagemaker): Check for SSH Kiro extension in deep link case (#2324) ## Problem When customers connect to a SageMaker Space in the Kiro IDE via deep link from the SageMaker web portal, the connection fails with an error message if the SageMaker SSH Kiro extension is not installed. This creates a poor user experience as the remote workspace window opens but cannot establish the connection. ## Solution Updated the deep link URI handler (`deeplinkConnect`) to ensure the SageMaker SSH Kiro extension is installed before attempting the remote connection. This brings the deep link flow in line with the existing AWS Toolkit UI flow, which already includes this validation step. --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license. Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> --- .../core/src/awsService/sagemaker/commands.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index c6ac69b7253..64449eaf971 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -19,12 +19,12 @@ import { tryRemoteConnection, useSageMakerSshKiroExtension, } from './model' +import { ensureSageMakerSshKiroExtension } from './sagemakerSshKiroUtils' import { ExtContext } from '../../shared/extensions' import { SagemakerClient } from '../../shared/clients/sagemaker' import { AccessDeniedException } from '@amzn/sagemaker-client' -import { ToolkitError } from '../../shared/errors' +import { ToolkitError, isUserCancelledError } from '../../shared/errors' import { showConfirmationMessage } from '../../shared/utilities/messages' -import { RemoteSessionError } from '../../shared/remoteSession' import { ConnectFromRemoteWorkspaceMessage, InstanceTypeError, @@ -118,11 +118,11 @@ export async function deeplinkConnect( ) getLogger().info( - `sm:deeplinkConnect: - domain: ${domain}, - appType: ${appType}, - workspaceName: ${workspaceName}, - namespace: ${namespace}, + `sm:deeplinkConnect: + domain: ${domain}, + appType: ${appType}, + workspaceName: ${workspaceName}, + namespace: ${namespace}, eksClusterArn: ${eksClusterArn}` ) @@ -158,6 +158,7 @@ export async function deeplinkConnect( const username = 'sagemaker-user' if (useSageMakerSshKiroExtension()) { + await ensureSageMakerSshKiroExtension(ctx.extensionContext) await startRemoteViaSageMakerSshKiro( remoteEnv.SessionProcess, remoteEnv.hostname, @@ -182,9 +183,9 @@ export async function deeplinkConnect( isSMUS ) - if (![RemoteSessionError.MissingExtension, RemoteSessionError.ExtensionVersionTooLow].includes(err.code)) { + if (!isUserCancelledError(err)) { void vscode.window.showErrorMessage( - `Remote connection failed: ${err.message || 'Unknown error'}. Check Output > Log (Window) for details.` + `Remote connection failed: ${err?.message || 'Unknown error'}. Check Output > Log (Window) for details.` ) throw err } From 35cf42c25cbb42a8e408eef0eebfd1394e575b53 Mon Sep 17 00:00:00 2001 From: aws-toolkit-automation <43144436+aws-toolkit-automation@users.noreply.github.com> Date: Fri, 16 Jan 2026 15:15:03 -0800 Subject: [PATCH 29/53] Merge staging into feature/smus-m2-kiro (#2321) ## Automatic merge failed - Resolve conflicts and push to this PR branch. - **Do not squash-merge** this PR. Use the "Create a merge commit" option to do a regular merge. ## Command line hint To perform the merge from the command line, you could do something like the following (where "origin" is the name of the remote in your local git repo): ``` git stash git fetch --all git checkout origin/feature/smus-m2-kiro git merge origin/staging git commit git push origin HEAD:refs/heads/autoMerge/feature/smus-m2-kiro ``` --------- Co-authored-by: Keen Wilson <40321520+keenwilson@users.noreply.github.com> Co-authored-by: Bhavya Sharma Co-authored-by: satyaki <208557303+satyakigh@users.noreply.github.com> Co-authored-by: Chris Mendoza Co-authored-by: Kevin DeJong Co-authored-by: Akila Tennakoon Co-authored-by: Akila Tennakoon Co-authored-by: Deep Furiya <79759607+deepfuriya@users.noreply.github.com> Co-authored-by: Deep Furiya Co-authored-by: Roger Zhang Co-authored-by: vicheey <181402101+vicheey@users.noreply.github.com> Co-authored-by: chungjac Co-authored-by: Bhargav Co-authored-by: Bhargava Varadharajan Co-authored-by: Keyu Wu Co-authored-by: Renato Valenzuela <37676028+valerena@users.noreply.github.com> Co-authored-by: Aseem sharma <198968351+aseemxs@users.noreply.github.com> Co-authored-by: invictus <149003065+ashishrp-aws@users.noreply.github.com> Co-authored-by: Reed Hamilton Co-authored-by: Zeeshan Ahmed <37942674+Zee2413@users.noreply.github.com> Co-authored-by: Will Lo <96078566+Will-ShaoHua@users.noreply.github.com> Co-authored-by: aws-toolkit-automation <> Co-authored-by: Shruti Sinha <44882001+shruti0085@users.noreply.github.com> Co-authored-by: kzr Co-authored-by: kzr-at-amazon Co-authored-by: David <60020664+dhasani23@users.noreply.github.com> Co-authored-by: David Hasani Co-authored-by: Dylan Ross <90357952+dylanraws@users.noreply.github.com> --- .github/workflows/node.js.yml | 61 + package-lock.json | 13707 +++++++++------- package.json | 2 +- packages/amazonq/src/app/inline/completion.ts | 2 +- .../src/app/inline/recommendationService.ts | 41 +- packages/core/package.json | 3 +- packages/core/package.nls.json | 1 + .../scripts/build/generateServiceClient.ts | 4 - packages/core/src/auth/consoleSessionUtils.ts | 353 + packages/core/src/auth/credentials/types.ts | 1 + .../providers/sharedCredentialsProvider.ts | 84 + .../appBuilder/explorer/nodes/deployedNode.ts | 12 +- .../appBuilder/explorer/nodes/propertyNode.ts | 19 +- .../appBuilder/explorer/nodes/resourceNode.ts | 11 +- .../appBuilder/explorer/samProject.ts | 81 +- .../core/src/awsService/appBuilder/utils.ts | 21 +- .../cloudformation/commands/cfnCommands.ts | 43 +- .../cloudformation/consoleLinksUtils.ts | 12 + .../awsService/cloudformation/extension.ts | 8 +- .../cloudformation/lsp-server/CLibCheck.ts | 141 + .../lsp-server/githubManifestAdapter.ts | 133 +- .../cloudformation/lsp-server/lspInstaller.ts | 6 +- .../lsp-server/lspServerProvider.ts | 2 +- .../cloudformation/lsp-server/utils.ts | 120 +- .../stacks/actions/validationWorkflow.ts | 5 +- .../cloudformation/ui/diffWebviewProvider.ts | 62 +- .../awsService/cloudformation/ui/inputBox.ts | 8 +- .../ui/stackEventsWebviewProvider.ts | 458 +- .../ui/stackOutputsWebviewProvider.ts | 6 + .../ui/stackOverviewWebviewProvider.ts | 1 + .../ui/stackResourcesWebviewProvider.ts | 1 + .../core/src/awsService/sagemaker/commands.ts | 45 +- .../src/awsService/sagemaker/constants.ts | 5 + .../core/src/awsService/sagemaker/model.ts | 24 +- .../transformByQ/transformApiHandler.ts | 29 +- packages/core/src/commands.ts | 10 + packages/core/src/lambda/activation.ts | 1 - .../explorer/lambdaCapacityProviderNode.ts | 46 + .../vue/configEditor/samInvokeBackend.ts | 5 + .../lambda/vue/remoteInvoke/invokeLambda.ts | 16 +- .../lambda/vue/remoteInvoke/remoteInvoke.vue | 10 +- .../webview/vue/amazonq/backend_amazonq.ts | 4 + .../core/src/login/webview/vue/backend.ts | 2 + packages/core/src/login/webview/vue/login.vue | 139 +- .../src/login/webview/vue/selectableItem.vue | 26 +- .../webview/vue/toolkit/backend_toolkit.ts | 30 + packages/core/src/login/webview/vue/types.ts | 2 + .../providers/smusAuthenticationProvider.ts | 12 +- .../explorer/nodes/lakehouseStrategy.ts | 11 +- .../explorer/nodes/redshiftStrategy.ts | 6 +- .../nodes/sageMakerUnifiedStudioRootNode.ts | 3 + .../explorer/nodes/utils.ts | 6 +- .../client/datazoneCustomClientHelper.ts | 47 +- .../shared/client/glueCatalogClient.ts | 70 +- .../shared/client/gluecatalogapi.json | 2695 --- .../shared/smusUtils.ts | 64 + .../shared/telemetry.ts | 91 +- .../core/src/shared/clients/lambdaClient.ts | 1 - .../shared/cloudformation/cloudformation.ts | 2 + packages/core/src/shared/logger/logger.ts | 1 + .../core/src/shared/lsp/baseLspInstaller.ts | 6 +- packages/core/src/shared/lsp/lspResolver.ts | 9 +- .../shared/sam/cli/samCliFeatureRegistry.ts | 179 + .../src/shared/sam/cli/samCliListResources.ts | 13 + .../core/src/shared/settings-toolkit.gen.ts | 12 + packages/core/src/shared/sshConfig.ts | 15 +- .../src/shared/telemetry/telemetryService.ts | 2 +- .../src/shared/telemetry/vscodeTelemetry.json | 19 + .../core/src/shared/utilities/cliUtils.ts | 22 + .../sharedCredentialsProvider.test.ts | 29 + .../appBuilder/explorer/samProject.test.ts | 46 +- .../appBuilder/serverlessLand/wizard.test.ts | 5 +- .../test/awsService/appBuilder/utils.test.ts | 7 +- .../commands/cfnCommands.test.ts | 77 +- .../cloudformation/consoleLinksUtils.test.ts | 76 + .../cloudformation/lsp-server/utils.test.ts | 270 +- .../ui/diffWebviewProvider.test.ts | 243 + .../ui/stackEventsWebviewProvider.test.ts | 154 + .../ui/stackOutputsWebviewProvider.test.ts | 2 + .../lambdaCapacityProviderNode.test.ts | 27 + .../lambda/remoteDebugging/ldkClient.test.ts | 105 + .../vue/remoteInvoke/remoteInvoke.test.ts | 153 +- .../auth/smusAuthenticationProvider.test.ts | 24 +- .../explorer/nodes/lakehouseStrategy.test.ts | 15 +- .../sageMakerUnifiedStudioRootNode.test.ts | 59 + .../client/datazoneCustomClientHelper.test.ts | 63 +- .../shared/client/gluePrivateClient.test.ts | 89 +- .../shared/smusUtils.test.ts | 55 + .../test/sagemakerunifiedstudio/testUtils.ts | 25 +- .../explorer/nodes/deployedNode.test.ts | 51 + .../explorer/nodes/resourceNode.test.ts | 2 + .../sam/cli/samCliFeatureRegistry.test.ts | 179 + .../sam/cli/samCliListResources.test.ts | 52 + .../core/src/test/shared/sam/samTestUtils.ts | 21 + .../core/src/test/shared/sshConfig.test.ts | 18 +- .../testE2E/cloudformation/setup-local-lsp.sh | 42 +- .../appBuilder/serverlessLand/main.test.ts | 6 +- packages/toolkit/.changes/3.90.0.json | 26 + packages/toolkit/.changes/3.91.0.json | 30 + ...-490ee89b-01ae-4e60-a2fe-ec26e7dae6fe.json | 4 - packages/toolkit/CHANGELOG.md | 17 + packages/toolkit/package.json | 88 +- src.gen/@amzn/glue-catalog-client/0.0.1.tgz | Bin 0 -> 52286 bytes 103 files changed, 12054 insertions(+), 9095 deletions(-) create mode 100644 packages/core/src/auth/consoleSessionUtils.ts create mode 100644 packages/core/src/awsService/cloudformation/lsp-server/CLibCheck.ts create mode 100644 packages/core/src/lambda/explorer/lambdaCapacityProviderNode.ts delete mode 100644 packages/core/src/sagemakerunifiedstudio/shared/client/gluecatalogapi.json create mode 100644 packages/core/src/shared/sam/cli/samCliFeatureRegistry.ts create mode 100644 packages/core/src/test/awsService/cloudformation/consoleLinksUtils.test.ts create mode 100644 packages/core/src/test/lambda/explorer/lambdaCapacityProviderNode.test.ts create mode 100644 packages/core/src/test/shared/sam/cli/samCliFeatureRegistry.test.ts create mode 100644 packages/toolkit/.changes/3.90.0.json create mode 100644 packages/toolkit/.changes/3.91.0.json delete mode 100644 packages/toolkit/.changes/next-release/Bug Fix-490ee89b-01ae-4e60-a2fe-ec26e7dae6fe.json create mode 100644 src.gen/@amzn/glue-catalog-client/0.0.1.tgz diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index da8d0c6ea54..97cb46fd71f 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -181,6 +181,67 @@ jobs: with: run: npm run testWeb + cloudformation-integ: + needs: lint-commits + name: CloudFormation LSP E2E Tests + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + node-version: [18.x] + vscode-version: [stable] + env: + VSCODE_TEST_VERSION: ${{ matrix.vscode-version }} + NODE_OPTIONS: '--max-old-space-size=8192' + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - name: Setup CloudFormation LSP + shell: bash + run: bash packages/core/src/testE2E/cloudformation/setup-local-lsp.sh + - run: npm ci + - name: Run CloudFormation E2E Tests (Unix) + if: runner.os != 'Windows' + uses: coactions/setup-xvfb@v1 + with: + run: npm run testE2ECfn -w packages/toolkit + - name: Run CloudFormation E2E Tests (Windows) + if: runner.os == 'Windows' + run: npm run testE2ECfn -w packages/toolkit + - name: Print Extension Logs + if: failure() + shell: bash + run: | + echo "=== AWS Toolkit Extension Logs ===" + find packages/toolkit/.vscode-test/user-data/logs -name "*.log" -type f 2>/dev/null | while read logfile; do + echo "--- $logfile ---" + cat "$logfile" || echo "Could not read log file" + done || echo "No extension logs found" + + echo "" + echo "=== CloudFormation LSP Server Logs ===" + echo "LSP Path: $__CLOUDFORMATIONLSP_PATH" + if [ -n "$__CLOUDFORMATIONLSP_PATH" ]; then + LSP_LOG_DIR="$__CLOUDFORMATIONLSP_PATH/.aws-cfn-storage/logs" + echo "Checking directory: $LSP_LOG_DIR" + if [ -d "$LSP_LOG_DIR" ]; then + find "$LSP_LOG_DIR" -name "*.log" -type f 2>/dev/null | while read logfile; do + echo "--- $logfile ---" + cat "$logfile" || echo "Could not read log file" + done + else + echo "LSP logs directory does not exist: $LSP_LOG_DIR" + echo "Contents of LSP path:" + ls -la "$__CLOUDFORMATIONLSP_PATH" 2>/dev/null || echo "Cannot list LSP path" + fi + else + echo "Environment variable __CLOUDFORMATIONLSP_PATH is not set" + fi + windows: needs: lint-commits name: test Windows diff --git a/package-lock.json b/package-lock.json index 7477eb628a7..3e293956c9f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,7 +22,7 @@ "vscode-nls-dev": "^4.0.4" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.338", + "@aws-toolkits/telemetry": "^1.0.341", "@playwright/browser-chromium": "^1.43.1", "@stylistic/eslint-plugin": "^2.11.0", "@types/he": "^1.2.3", @@ -71,467 +71,467 @@ "resolved": "src.gen/@amzn/codewhisperer-streaming", "link": true }, - "node_modules/@amzn/sagemaker-client": { - "version": "1.0.0", - "resolved": "file:src.gen/@amzn/sagemaker-client/1.0.0.tgz", - "integrity": "sha512-rNMUzeACaCiIqR8aQo3G99xR+Qy6zhbGi9+6XRG5proUKetO3584dclmSnIUvDvzLWosFcl4GyP8tFqiahc6Jg==", + "node_modules/@amzn/glue-catalog-client": { + "version": "0.0.1", + "resolved": "file:src.gen/@amzn/glue-catalog-client/0.0.1.tgz", + "integrity": "sha512-DXE1bTaWlo32obkW0/PR0E7twmNa/3fkvBTL899lpLP4pGdzQ94Ci2io+3mb1CGC/KoyINdERC0HrA2HrqYavw==", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.363.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-retry": "^1.0.3", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.3", - "@smithy/util-utf8": "^1.0.1", - "@smithy/util-waiter": "^1.0.1", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/credential-provider-node": "3.922.0", + "@aws-sdk/middleware-host-header": "3.922.0", + "@aws-sdk/middleware-logger": "3.922.0", + "@aws-sdk/middleware-recursion-detection": "3.922.0", + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/region-config-resolver": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@aws-sdk/util-user-agent-browser": "3.922.0", + "@aws-sdk/util-user-agent-node": "3.922.0", + "@smithy/config-resolver": "^4.4.2", + "@smithy/core": "^3.17.2", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/hash-node": "^4.2.4", + "@smithy/invalid-dependency": "^4.2.4", + "@smithy/middleware-content-length": "^4.2.4", + "@smithy/middleware-endpoint": "^4.3.6", + "@smithy/middleware-retry": "^4.4.6", + "@smithy/middleware-serde": "^4.2.4", + "@smithy/middleware-stack": "^4.2.4", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.5", + "@smithy/util-defaults-mode-node": "^4.2.8", + "@smithy/util-endpoints": "^3.2.4", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-retry": "^4.2.4", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", - "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", - "dependencies": { - "@aws-crypto/ie11-detection": "^3.0.0", - "@aws-crypto/sha256-js": "^3.0.0", - "@aws-crypto/supports-web-crypto": "^3.0.0", - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" - } - }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", - "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", - "dependencies": { - "@aws-crypto/util": "^3.0.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^1.11.1" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-js/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/supports-web-crypto": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", - "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/client-sso": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.922.0.tgz", + "integrity": "sha512-jdHs7uy7cSpiMvrxhYmqHyJxgK7hyqw4plG8OQ4YTBpq0SbfAxdoOuOkwJ1IVUUQho4otR1xYYjiX/8e8J8qwQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^1.11.1" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/middleware-host-header": "3.922.0", + "@aws-sdk/middleware-logger": "3.922.0", + "@aws-sdk/middleware-recursion-detection": "3.922.0", + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/region-config-resolver": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@aws-sdk/util-user-agent-browser": "3.922.0", + "@aws-sdk/util-user-agent-node": "3.922.0", + "@smithy/config-resolver": "^4.4.1", + "@smithy/core": "^3.17.2", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/hash-node": "^4.2.4", + "@smithy/invalid-dependency": "^4.2.4", + "@smithy/middleware-content-length": "^4.2.4", + "@smithy/middleware-endpoint": "^4.3.6", + "@smithy/middleware-retry": "^4.4.6", + "@smithy/middleware-serde": "^4.2.4", + "@smithy/middleware-stack": "^4.2.4", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.5", + "@smithy/util-defaults-mode-node": "^4.2.7", + "@smithy/util-endpoints": "^3.2.4", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-retry": "^4.2.4", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/util": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", - "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/core": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.922.0.tgz", + "integrity": "sha512-EvfP4cqJfpO3L2v5vkIlTkMesPtRwWlMfsaW6Tpfm7iYfBOuTi6jx60pMDMTyJNVfh6cGmXwh/kj1jQdR+w99Q==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-utf8-browser": "^3.0.0", - "tslib": "^1.11.1" + "@aws-sdk/types": "3.922.0", + "@aws-sdk/xml-builder": "3.921.0", + "@smithy/core": "^3.17.2", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/signature-v4": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/util/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/client-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.363.0.tgz", - "integrity": "sha512-PZ+HfKSgS4hlMnJzG+Ev8/mgHd/b/ETlJWPSWjC/f2NwVoBQkBnqHjdyEx7QjF6nksJozcVh5Q+kkYLKc/QwBQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.922.0.tgz", + "integrity": "sha512-WikGQpKkROJSK3D3E7odPjZ8tU7WJp5/TgGdRuZw3izsHUeH48xMv6IznafpRTmvHcjAbDQj4U3CJZNAzOK/OQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.363.0.tgz", - "integrity": "sha512-V3Ebiq/zNtDS/O92HUWGBa7MY59RYSsqWd+E0XrXv6VYTA00RlMTbNcseivNgp2UghOgB9a20Nkz6EqAeIN+RQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.922.0.tgz", + "integrity": "sha512-i72DgHMK7ydAEqdzU0Duqh60Q8W59EZmRJ73y0Y5oFmNOqnYsAI+UXyOoCsubp+Dkr6+yOwAn1gPt1XGE9Aowg==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.2", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.2", - "@smithy/protocol-http": "^1.0.1", - "@smithy/smithy-client": "^1.0.3", - "@smithy/types": "^1.0.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.2", - "@smithy/util-utf8": "^1.0.1", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/util-stream": "^4.5.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/client-sts": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.363.0.tgz", - "integrity": "sha512-0jj14WvBPJQ8xr72cL0mhlmQ90tF0O0wqXwSbtog6PsC8+KDE6Yf+WsxsumyI8E5O8u3eYijBL+KdqG07F/y/w==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.922.0.tgz", + "integrity": "sha512-bVF+pI5UCLNkvbiZr/t2fgTtv84s8FCdOGAPxQiQcw5qOZywNuuCCY3wIIchmQr6GJr8YFkEp5LgDCac5EC5aQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "3.0.0", - "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/credential-provider-node": "3.363.0", - "@aws-sdk/middleware-host-header": "3.363.0", - "@aws-sdk/middleware-logger": "3.363.0", - "@aws-sdk/middleware-recursion-detection": "3.363.0", - "@aws-sdk/middleware-sdk-sts": "3.363.0", - "@aws-sdk/middleware-signing": "3.363.0", - "@aws-sdk/middleware-user-agent": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@aws-sdk/util-user-agent-browser": "3.363.0", - "@aws-sdk/util-user-agent-node": "3.363.0", - "@smithy/config-resolver": "^1.0.1", - "@smithy/fetch-http-handler": "^1.0.1", - "@smithy/hash-node": "^1.0.1", - "@smithy/invalid-dependency": "^1.0.1", - "@smithy/middleware-content-length": "^1.0.1", - "@smithy/middleware-endpoint": "^1.0.1", - "@smithy/middleware-retry": "^1.0.1", - "@smithy/middleware-serde": "^1.0.1", - "@smithy/middleware-stack": "^1.0.1", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/node-http-handler": "^1.0.1", - "@smithy/protocol-http": "^1.1.0", - "@smithy/smithy-client": "^1.0.2", - "@smithy/types": "^1.1.0", - "@smithy/url-parser": "^1.0.1", - "@smithy/util-base64": "^1.0.1", - "@smithy/util-body-length-browser": "^1.0.1", - "@smithy/util-body-length-node": "^1.0.1", - "@smithy/util-defaults-mode-browser": "^1.0.1", - "@smithy/util-defaults-mode-node": "^1.0.1", - "@smithy/util-retry": "^1.0.1", - "@smithy/util-utf8": "^1.0.1", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.922.0", + "@aws-sdk/credential-provider-env": "3.922.0", + "@aws-sdk/credential-provider-http": "3.922.0", + "@aws-sdk/credential-provider-process": "3.922.0", + "@aws-sdk/credential-provider-sso": "3.922.0", + "@aws-sdk/credential-provider-web-identity": "3.922.0", + "@aws-sdk/nested-clients": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/credential-provider-imds": "^4.2.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.363.0.tgz", - "integrity": "sha512-VAQ3zITT2Q0acht0HezouYnMFKZ2vIOa20X4zQA3WI0HfaP4D6ga6KaenbDcb/4VFiqfqiRHfdyXHP0ThcDRMA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.922.0.tgz", + "integrity": "sha512-agCwaD6mBihToHkjycL8ObIS2XOnWypWZZWhJSoWyHwFrhEKz1zGvgylK9Dc711oUfU+zU6J8e0JPKNJMNb3BQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/credential-provider-env": "3.922.0", + "@aws-sdk/credential-provider-http": "3.922.0", + "@aws-sdk/credential-provider-ini": "3.922.0", + "@aws-sdk/credential-provider-process": "3.922.0", + "@aws-sdk/credential-provider-sso": "3.922.0", + "@aws-sdk/credential-provider-web-identity": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/credential-provider-imds": "^4.2.4", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.363.0.tgz", - "integrity": "sha512-ZYN+INoqyX5FVC3rqUxB6O8nOWkr0gHRRBm1suoOlmuFJ/WSlW/uUGthRBY5x1AQQnBF8cpdlxZzGHd41lFVNw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.922.0.tgz", + "integrity": "sha512-1DZOYezT6okslpvMW7oA2q+y17CJd4fxjNFH0jtThfswdh9CtG62+wxenqO+NExttq0UMaKisrkZiVrYQBTShw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.363.0.tgz", - "integrity": "sha512-C1qXFIN2yMxD6pGgug0vR1UhScOki6VqdzuBHzXZAGu7MOjvgHNdscEcb3CpWnITHaPL2ztkiw75T1sZ7oIgQg==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.922.0.tgz", + "integrity": "sha512-nbD3G3hShTYxLCkKMqLkLPtKwAAfxdY/k9jHtZmVBFXek2T6tQrqZHKxlAu+fd23Ga4/Aik7DLQQx1RA1a5ipg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.363.0", - "@aws-sdk/credential-provider-ini": "3.363.0", - "@aws-sdk/credential-provider-process": "3.363.0", - "@aws-sdk/credential-provider-sso": "3.363.0", - "@aws-sdk/credential-provider-web-identity": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/credential-provider-imds": "^1.0.1", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/client-sso": "3.922.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/token-providers": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.363.0.tgz", - "integrity": "sha512-fOKAINU7Rtj2T8pP13GdCt+u0Ml3gYynp8ki+1jMZIQ+Ju/MdDOqZpKMFKicMn3Z1ttUOgqr+grUdus6z8ceBQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.922.0.tgz", + "integrity": "sha512-wjGIhgMHGGQfQTdFaJphNOKyAL8wZs6znJdHADPVURmgR+EWLyN/0fDO1u7wx8xaLMZpbHIFWBEvf9TritR/cQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.922.0", + "@aws-sdk/nested-clients": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.363.0.tgz", - "integrity": "sha512-5RUZ5oM0lwZSo3EehT0dXggOjgtxFogpT3cZvoLGtIwrPBvm8jOQPXQUlaqCj10ThF1sYltEyukz/ovtDwYGew==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.922.0.tgz", + "integrity": "sha512-HPquFgBnq/KqKRVkiuCt97PmWbKtxQ5iUNLEc6FIviqOoZTmaYG3EDsIbuFBz9C4RHJU4FKLmHL2bL3FEId6AA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.363.0", - "@aws-sdk/token-providers": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.922.0", + "@smithy/protocol-http": "^5.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.363.0.tgz", - "integrity": "sha512-Z6w7fjgy79pAax580wdixbStQw10xfyZ+hOYLcPudoYFKjoNx0NQBejg5SwBzCF/HQL23Ksm9kDfbXDX9fkPhA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/middleware-logger": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.922.0.tgz", + "integrity": "sha512-AkvYO6b80FBm5/kk2E636zNNcNgjztNNUxpqVx+huyGn9ZqGTzS4kLqW2hO6CBe5APzVtPCtiQsXL24nzuOlAg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.922.0", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.363.0.tgz", - "integrity": "sha512-FobpclDCf5Y1ueyJDmb9MqguAdPssNMlnqWQpujhYVABq69KHu73fSCWSauFPUrw7YOpV8kG1uagDF0POSxHzA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.922.0.tgz", + "integrity": "sha512-TtSCEDonV/9R0VhVlCpxZbp/9sxQvTTRKzIf8LxW3uXpby6Wl8IxEciBJlxmSkoqxh542WRcko7NYODlvL/gDA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.922.0", + "@aws/lambda-invoke-store": "^0.1.1", + "@smithy/protocol-http": "^5.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-logger": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.363.0.tgz", - "integrity": "sha512-SSGgthScYnFGTOw8EzbkvquqweFmvn7uJihkpFekbtBNGC/jGOGO+8ziHjTQ8t/iI/YKubEwv+LMi0f77HKSEg==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.922.0.tgz", + "integrity": "sha512-N4Qx/9KP3oVQBJOrSghhz8iZFtUC2NNeSZt88hpPhbqAEAtuX8aD8OzVcpnAtrwWqy82Yd2YTxlkqMGkgqnBsQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@smithy/core": "^3.17.2", + "@smithy/protocol-http": "^5.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.363.0.tgz", - "integrity": "sha512-MWD/57QgI/N7fG8rtzDTUdSqNpYohQfgj9XCFAoVeI/bU4usrkOrew43L4smJG4XrDxlNT8lSJlDtd64tuiUZA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/nested-clients": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.922.0.tgz", + "integrity": "sha512-uYvKCF1TGh/MuJ4TMqmUM0Csuao02HawcseG4LUDyxdUsd/EFuxalWq1Cx4fKZQ2K8F504efZBjctMAMNY+l7A==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.922.0", + "@aws-sdk/middleware-host-header": "3.922.0", + "@aws-sdk/middleware-logger": "3.922.0", + "@aws-sdk/middleware-recursion-detection": "3.922.0", + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/region-config-resolver": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@aws-sdk/util-endpoints": "3.922.0", + "@aws-sdk/util-user-agent-browser": "3.922.0", + "@aws-sdk/util-user-agent-node": "3.922.0", + "@smithy/config-resolver": "^4.4.1", + "@smithy/core": "^3.17.2", + "@smithy/fetch-http-handler": "^5.3.5", + "@smithy/hash-node": "^4.2.4", + "@smithy/invalid-dependency": "^4.2.4", + "@smithy/middleware-content-length": "^4.2.4", + "@smithy/middleware-endpoint": "^4.3.6", + "@smithy/middleware-retry": "^4.4.6", + "@smithy/middleware-serde": "^4.2.4", + "@smithy/middleware-stack": "^4.2.4", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/node-http-handler": "^4.4.4", + "@smithy/protocol-http": "^5.3.4", + "@smithy/smithy-client": "^4.9.2", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.5", + "@smithy/util-defaults-mode-node": "^4.2.7", + "@smithy/util-endpoints": "^3.2.4", + "@smithy/util-middleware": "^4.2.4", + "@smithy/util-retry": "^4.2.4", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.363.0.tgz", - "integrity": "sha512-ri8YaQvXP6odteVTMfxPqFR26Q0h9ejtqhUDv47P34FaKXedEM4nC6ix6o+5FEYj6l8syGyktftZ5O70NoEhug==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.922.0.tgz", + "integrity": "sha512-44Y/rNNwhngR2KHp6gkx//TOr56/hx6s4l+XLjOqH7EBCHL7XhnrT1y92L+DLiroVr1tCSmO8eHQwBv0Y2+mvw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@aws-sdk/util-endpoints": "3.357.0", - "@smithy/protocol-http": "^1.1.0", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.922.0", + "@smithy/config-resolver": "^4.4.1", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/token-providers": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.363.0.tgz", - "integrity": "sha512-6+0aJ1zugNgsMmhTtW2LBWxOVSaXCUk2q3xyTchSXkNzallYaRiZMRkieW+pKNntnu0g5H1T0zyfCO0tbXwxEA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/token-providers": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.922.0.tgz", + "integrity": "sha512-/inmPnjZE0ZBE16zaCowAvouSx05FJ7p6BQYuzlJ8vxEU0sS0Hf8fvhuiRnN9V9eDUPIBY+/5EjbMWygXL4wlQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso-oidc": "3.363.0", - "@aws-sdk/types": "3.357.0", - "@smithy/property-provider": "^1.0.1", - "@smithy/shared-ini-file-loader": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.922.0", + "@aws-sdk/nested-clients": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/property-provider": "^4.2.4", + "@smithy/shared-ini-file-loader": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/types": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", - "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/types": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.922.0.tgz", + "integrity": "sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/util-endpoints": { - "version": "3.357.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz", - "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/util-endpoints": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.922.0.tgz", + "integrity": "sha512-4ZdQCSuNMY8HMlR1YN4MRDdXuKd+uQTeKIr5/pIM+g3TjInZoj8imvXudjcrFGA63UF3t92YVTkBq88mg58RXQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.922.0", + "@smithy/types": "^4.8.1", + "@smithy/url-parser": "^4.2.4", + "@smithy/util-endpoints": "^3.2.4", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.363.0.tgz", - "integrity": "sha512-fk9ymBUIYbxiGm99Cn+kAAXmvMCWTf/cHAcB79oCXV4ELXdPa9lN5xQhZRFNxLUeXG4OAMEuCAUUuZEj8Fnc1Q==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.922.0.tgz", + "integrity": "sha512-qOJAERZ3Plj1st7M4Q5henl5FRpE30uLm6L9edZqZXGR6c7ry9jzexWamWVpQ4H4xVAVmiO9dIEBAfbq4mduOA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/types": "^1.1.0", + "@aws-sdk/types": "3.922.0", + "@smithy/types": "^4.8.1", "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.363.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.363.0.tgz", - "integrity": "sha512-Fli/dvgGA9hdnQUrYb1//wNSFlK2jAfdJcfNXA6SeBYzSeH5pVGYF4kXF0FCdnMA3Fef+Zn1zAP/hw9v8VJHWQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.922.0.tgz", + "integrity": "sha512-NrPe/Rsr5kcGunkog0eBV+bY0inkRELsD2SacC4lQZvZiXf8VJ2Y7j+Yq1tB+h+FPLsdt3v9wItIvDf/laAm0Q==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.357.0", - "@smithy/node-config-provider": "^1.0.1", - "@smithy/types": "^1.1.0", - "tslib": "^2.5.0" + "@aws-sdk/middleware-user-agent": "3.922.0", + "@aws-sdk/types": "3.922.0", + "@smithy/node-config-provider": "^4.3.4", + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "aws-crt": ">=1.0.0" @@ -542,454 +542,1546 @@ } } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/abort-controller": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.1.0.tgz", - "integrity": "sha512-5imgGUlZL4dW4YWdMYAKLmal9ny/tlenM81QZY7xYyb76z9Z/QOg7oM5Ak9HQl8QfFTlGVWwcMXl+54jroRgEQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws-sdk/xml-builder": { + "version": "3.921.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.921.0.tgz", + "integrity": "sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.8.1", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/config-resolver": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.1.0.tgz", - "integrity": "sha512-7WD9eZHp46BxAjNGHJLmxhhyeiNWkBdVStd7SUJPUZqQGeIO/REtIrcIfKUfdiHTQ9jyu2SYoqvzqqaFc6987w==", + "node_modules/@amzn/glue-catalog-client/node_modules/@aws/lambda-invoke-store": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.1.tgz", + "integrity": "sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "@smithy/util-config-provider": "^1.1.0", - "@smithy/util-middleware": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/credential-provider-imds": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.1.0.tgz", - "integrity": "sha512-kUMOdEu3RP6ozH0Ga8OeMP8gSkBsK1UqZZKyPLFnpZHrtZuHSSt7M7gsHYB/bYQBZAo3o7qrGmRty3BubYtYxQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^1.1.0", - "@smithy/property-provider": "^1.2.0", - "@smithy/types": "^1.2.0", - "@smithy/url-parser": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/fetch-http-handler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.1.0.tgz", - "integrity": "sha512-N22C9R44u5WGlcY+Wuv8EXmCAq62wWwriRAuoczMEwAIjPbvHSthyPSLqI4S7kAST1j6niWg8kwpeJ3ReAv3xg==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/core": { + "version": "3.18.6", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.6.tgz", + "integrity": "sha512-8Q/ugWqfDUEU1Exw71+DoOzlONJ2Cn9QA8VeeDzLLjzO/qruh9UKFzbszy4jXcIYgGofxYiT0t1TT6+CT/GupQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^1.2.0", - "@smithy/querystring-builder": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-base64": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/hash-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.1.0.tgz", - "integrity": "sha512-yiNKDGMzrQjnpnbLfkYKo+HwIxmBAsv0AI++QIJwvhfkLpUTBylelkv6oo78/YqZZS6h+bGfl0gILJsKE2wAKQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "@smithy/util-buffer-from": "^1.1.0", - "@smithy/util-utf8": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/invalid-dependency": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.1.0.tgz", - "integrity": "sha512-h2rXn68ClTwzPXYzEUNkz+0B/A0Hz8YdFNTiEwlxkwzkETGKMxmsrQGFXwYm3jd736R5vkXcClXz1ddKrsaBEQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/is-array-buffer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", - "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-content-length": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.1.0.tgz", - "integrity": "sha512-iNxwhZ7Xc5+LjeDElEOi/Nh8fFsc9Dw9+5w7h7/GLFIU0RgAwBJuJtcP1vNTOwzW4B3hG+gRu8sQLqA9OEaTwA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^1.2.0", - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-endpoint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.1.0.tgz", - "integrity": "sha512-PvpazNjVpxX2ICrzoFYCpFnjB39DKCpZds8lRpAB3p6HGrx6QHBaNvOzVhJGBf0jcAbfCdc5/W0n9z8VWaSSww==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/url-parser": "^1.1.0", - "@smithy/util-middleware": "^1.1.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-retry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.1.0.tgz", - "integrity": "sha512-lINKYxIvT+W20YFOtHBKeGm7npuJg0/YCoShttU7fVpsmU+a2rdb9zrJn1MHqWfUL6DhTAWGa0tH2O7l4XrDcw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^1.2.0", - "@smithy/service-error-classification": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-middleware": "^1.1.0", - "@smithy/util-retry": "^1.1.0", - "tslib": "^2.5.0", - "uuid": "^8.3.2" + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-serde": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.1.0.tgz", - "integrity": "sha512-RiBMxhxuO9VTjHsjJvhzViyceoLhU6gtrnJGpAXY43wE49IstXIGEQz8MT50/hOq5EumX16FCpup0r5DVyfqNQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.13.tgz", + "integrity": "sha512-X4za1qCdyx1hEVVXuAWlZuK6wzLDv1uw1OY9VtaYy1lULl661+frY7FeuHdYdl7qAARUxH2yvNExU2/SmRFfcg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/core": "^3.18.6", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-stack": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.1.0.tgz", - "integrity": "sha512-XynYiIvXNea2BbLcppvpNK0zu8o2woJqgnmxqYTn4FWagH/Hr2QIk8LOsUz7BIJ4tooFhmx8urHKCdlPbbPDCA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/middleware-retry": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.13.tgz", + "integrity": "sha512-RzIDF9OrSviXX7MQeKOm8r/372KTyY8Jmp6HNKOOYlrguHADuM3ED/f4aCyNhZZFLG55lv5beBin7nL0Nzy1Dw==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.9", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/node-config-provider": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.1.0.tgz", - "integrity": "sha512-2G4TlzUnmTrUY26VKTonQqydwb+gtM/mcl+TqDP8CnWtJKVL8ElPpKgLGScP04bPIRY9x2/10lDdoaRXDqPuCw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^1.2.0", - "@smithy/shared-ini-file-loader": "^1.1.0", - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/node-http-handler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.1.0.tgz", - "integrity": "sha512-d3kRriEgaIiGXLziAM8bjnaLn1fthCJeTLZIwEIpzQqe6yPX0a+yQoLCTyjb2fvdLwkMoG4p7THIIB5cj5lkbg==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^1.1.0", - "@smithy/protocol-http": "^1.2.0", - "@smithy/querystring-builder": "^1.1.0", - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/property-provider": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.2.0.tgz", - "integrity": "sha512-qlJd9gT751i4T0t/hJAyNGfESfi08Fek8QiLcysoKPgR05qHhG0OYhlaCJHhpXy4ECW0lHyjvFM1smrCLIXVfw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/protocol-http": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", - "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/querystring-builder": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.1.0.tgz", - "integrity": "sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "@smithy/util-uri-escape": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/querystring-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.1.0.tgz", - "integrity": "sha512-Lm/FZu2qW3XX+kZ4WPwr+7aAeHf1Lm84UjNkKyBu16XbmEV7ukfhXni2aIwS2rcVf8Yv5E7wchGGpOFldj9V4Q==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/service-error-classification": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.1.0.tgz", - "integrity": "sha512-OCTEeJ1igatd5kFrS2VDlYbainNNpf7Lj1siFOxnRWqYOP9oNvC5HOJBd3t+Z8MbrmehBtuDJ2QqeBsfeiNkww==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/shared-ini-file-loader": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.1.0.tgz", - "integrity": "sha512-S/v33zvCWzFyGZGlsEF0XsZtNNR281UhR7byk3nRfsgw5lGpg51rK/zjMgulM+h6NSuXaFILaYrw1I1v4kMcuA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/smithy-client": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.1.0.tgz", - "integrity": "sha512-j32SGgVhv2G9nBTmel9u3OXux8KG20ssxuFakJrEeDug3kqbl1qrGzVLCe+Eib402UDtA0Sp1a4NZ2SEXDBxag==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-stack": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-stream": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", - "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/url-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.1.0.tgz", - "integrity": "sha512-tpvi761kzboiLNGEWczuybMPCJh6WHB3cz9gWAG95mSyaKXmmX8ZcMxoV+irZfxDqLwZVJ22XTumu32S7Ow8aQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^1.1.0", - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-base64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.1.0.tgz", - "integrity": "sha512-FpYmDmVbOXAxqvoVCwqehUN0zXS+lN8V7VS9O7I8MKeVHdSTsZzlwiMEvGoyTNOXWn8luF4CTDYgNHnZViR30g==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/smithy-client": { + "version": "4.9.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.9.tgz", + "integrity": "sha512-SUnZJMMo5yCmgjopJbiNeo1vlr8KvdnEfIHV9rlD77QuOGdRotIVBcOrBuMr+sI9zrnhtDtLP054bZVbpZpiQA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/core": "^3.18.6", + "@smithy/middleware-endpoint": "^4.3.13", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-body-length-browser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.1.0.tgz", - "integrity": "sha512-cep3ioRxzRZ2Jbp3Kly7gy6iNVefYXiT6ETt8W01RQr3uwi1YMkrbU1p3lMR4KhX/91Nrk6UOgX1RH+oIt48RQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-body-length-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.1.0.tgz", - "integrity": "sha512-fRHRjkUuT5em4HZoshySXmB1n3HAU7IS232s+qU4TicexhyGJpXMK/2+c56ePOIa1FOK2tV1Q3J/7Mae35QVSw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", - "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-config-provider": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.1.0.tgz", - "integrity": "sha512-rQ47YpNmF6Is4I9GiE3T3+0xQ+r7RKRKbmHYyGSbyep/0cSf9kteKcI0ssJTvveJ1K4QvwrxXj1tEFp/G2UqxQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-defaults-mode-browser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.1.0.tgz", - "integrity": "sha512-0bWhs1e412bfC5gwPCMe8Zbz0J8UoZ/meEQdo6MYj8Ne+c+QZ+KxVjx0a1dFYOclvM33SslL9dP0odn8kfblkg==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^1.2.0", - "@smithy/types": "^1.2.0", - "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-defaults-mode-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.1.0.tgz", - "integrity": "sha512-440e25TUH2b+TeK5CwsjYFrI9ShVOgA31CoxCKiv4ncSK4ZM68XW5opYxQmzMbRWARGEMu2XEUeBmOgMU2RLsw==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^1.1.0", - "@smithy/credential-provider-imds": "^1.1.0", - "@smithy/node-config-provider": "^1.1.0", - "@smithy/property-provider": "^1.2.0", - "@smithy/types": "^1.2.0", - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 10.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-hex-encoding": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", - "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-middleware": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", - "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.12.tgz", + "integrity": "sha512-TKc6FnOxFULKxLgTNHYjcFqdOYzXVPFFVm5JhI30F3RdhT7nYOtOsjgaOwfDRmA/3U66O9KaBQ3UHoXwayRhAg==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.9", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-retry": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.1.0.tgz", - "integrity": "sha512-ygQW5HBqYXpR3ua09UciS0sL7UGJzGiktrKkOuEJwARoUuzz40yaEGU6xd9Gs7KBmAaFC8gMfnghHtwZ2nyBCQ==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.15.tgz", + "integrity": "sha512-94NqfQVo+vGc5gsQ9SROZqOvBkGNMQu6pjXbnn8aQvBUhc31kx49gxlkBEqgmaZQHUUfdRUin5gK/HlHKmbAwg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.9", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">= 14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.1.0.tgz", - "integrity": "sha512-w3lsdGsntaLQIrwDWJkIFKrFscgZXwU/oxsse09aSTNv5TckPhDeYea3LhsDrU5MGAG3vprhVZAKr33S45coVA==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^1.1.0", - "@smithy/node-http-handler": "^1.1.0", - "@smithy/types": "^1.2.0", - "@smithy/util-base64": "^1.1.0", - "@smithy/util-buffer-from": "^1.1.0", - "@smithy/util-hex-encoding": "^1.1.0", - "@smithy/util-utf8": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-uri-escape": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", - "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", - "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^1.1.0", - "tslib": "^2.5.0" + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.0.0" } }, - "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-waiter": { + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/glue-catalog-client/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@amzn/glue-catalog-client/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@amzn/glue-catalog-client/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@amzn/sagemaker-client": { + "version": "1.0.0", + "resolved": "file:src.gen/@amzn/sagemaker-client/1.0.0.tgz", + "integrity": "sha512-rNMUzeACaCiIqR8aQo3G99xR+Qy6zhbGi9+6XRG5proUKetO3584dclmSnIUvDvzLWosFcl4GyP8tFqiahc6Jg==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.363.0", + "@aws-sdk/credential-provider-node": "3.363.0", + "@aws-sdk/middleware-host-header": "3.363.0", + "@aws-sdk/middleware-logger": "3.363.0", + "@aws-sdk/middleware-recursion-detection": "3.363.0", + "@aws-sdk/middleware-signing": "3.363.0", + "@aws-sdk/middleware-user-agent": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.363.0", + "@aws-sdk/util-user-agent-node": "3.363.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-retry": "^1.0.3", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.3", + "@smithy/util-utf8": "^1.0.1", + "@smithy/util-waiter": "^1.0.1", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/client-sso": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.363.0.tgz", + "integrity": "sha512-PZ+HfKSgS4hlMnJzG+Ev8/mgHd/b/ETlJWPSWjC/f2NwVoBQkBnqHjdyEx7QjF6nksJozcVh5Q+kkYLKc/QwBQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.363.0", + "@aws-sdk/middleware-logger": "3.363.0", + "@aws-sdk/middleware-recursion-detection": "3.363.0", + "@aws-sdk/middleware-user-agent": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.363.0", + "@aws-sdk/util-user-agent-node": "3.363.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.1", + "@smithy/middleware-retry": "^1.0.2", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.0.1", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.0.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.2", + "@smithy/util-utf8": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.363.0.tgz", + "integrity": "sha512-V3Ebiq/zNtDS/O92HUWGBa7MY59RYSsqWd+E0XrXv6VYTA00RlMTbNcseivNgp2UghOgB9a20Nkz6EqAeIN+RQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.363.0", + "@aws-sdk/middleware-logger": "3.363.0", + "@aws-sdk/middleware-recursion-detection": "3.363.0", + "@aws-sdk/middleware-user-agent": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.363.0", + "@aws-sdk/util-user-agent-node": "3.363.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.1", + "@smithy/middleware-retry": "^1.0.2", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.2", + "@smithy/protocol-http": "^1.0.1", + "@smithy/smithy-client": "^1.0.3", + "@smithy/types": "^1.0.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.2", + "@smithy/util-utf8": "^1.0.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/client-sts": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.363.0.tgz", + "integrity": "sha512-0jj14WvBPJQ8xr72cL0mhlmQ90tF0O0wqXwSbtog6PsC8+KDE6Yf+WsxsumyI8E5O8u3eYijBL+KdqG07F/y/w==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.363.0", + "@aws-sdk/middleware-host-header": "3.363.0", + "@aws-sdk/middleware-logger": "3.363.0", + "@aws-sdk/middleware-recursion-detection": "3.363.0", + "@aws-sdk/middleware-sdk-sts": "3.363.0", + "@aws-sdk/middleware-signing": "3.363.0", + "@aws-sdk/middleware-user-agent": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.363.0", + "@aws-sdk/util-user-agent-node": "3.363.0", + "@smithy/config-resolver": "^1.0.1", + "@smithy/fetch-http-handler": "^1.0.1", + "@smithy/hash-node": "^1.0.1", + "@smithy/invalid-dependency": "^1.0.1", + "@smithy/middleware-content-length": "^1.0.1", + "@smithy/middleware-endpoint": "^1.0.1", + "@smithy/middleware-retry": "^1.0.1", + "@smithy/middleware-serde": "^1.0.1", + "@smithy/middleware-stack": "^1.0.1", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/node-http-handler": "^1.0.1", + "@smithy/protocol-http": "^1.1.0", + "@smithy/smithy-client": "^1.0.2", + "@smithy/types": "^1.1.0", + "@smithy/url-parser": "^1.0.1", + "@smithy/util-base64": "^1.0.1", + "@smithy/util-body-length-browser": "^1.0.1", + "@smithy/util-body-length-node": "^1.0.1", + "@smithy/util-defaults-mode-browser": "^1.0.1", + "@smithy/util-defaults-mode-node": "^1.0.1", + "@smithy/util-retry": "^1.0.1", + "@smithy/util-utf8": "^1.0.1", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.363.0.tgz", + "integrity": "sha512-VAQ3zITT2Q0acht0HezouYnMFKZ2vIOa20X4zQA3WI0HfaP4D6ga6KaenbDcb/4VFiqfqiRHfdyXHP0ThcDRMA==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.363.0.tgz", + "integrity": "sha512-ZYN+INoqyX5FVC3rqUxB6O8nOWkr0gHRRBm1suoOlmuFJ/WSlW/uUGthRBY5x1AQQnBF8cpdlxZzGHd41lFVNw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.363.0", + "@aws-sdk/credential-provider-process": "3.363.0", + "@aws-sdk/credential-provider-sso": "3.363.0", + "@aws-sdk/credential-provider-web-identity": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@smithy/credential-provider-imds": "^1.0.1", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.363.0.tgz", + "integrity": "sha512-C1qXFIN2yMxD6pGgug0vR1UhScOki6VqdzuBHzXZAGu7MOjvgHNdscEcb3CpWnITHaPL2ztkiw75T1sZ7oIgQg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.363.0", + "@aws-sdk/credential-provider-ini": "3.363.0", + "@aws-sdk/credential-provider-process": "3.363.0", + "@aws-sdk/credential-provider-sso": "3.363.0", + "@aws-sdk/credential-provider-web-identity": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@smithy/credential-provider-imds": "^1.0.1", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.363.0.tgz", + "integrity": "sha512-fOKAINU7Rtj2T8pP13GdCt+u0Ml3gYynp8ki+1jMZIQ+Ju/MdDOqZpKMFKicMn3Z1ttUOgqr+grUdus6z8ceBQ==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.363.0.tgz", + "integrity": "sha512-5RUZ5oM0lwZSo3EehT0dXggOjgtxFogpT3cZvoLGtIwrPBvm8jOQPXQUlaqCj10ThF1sYltEyukz/ovtDwYGew==", + "dependencies": { + "@aws-sdk/client-sso": "3.363.0", + "@aws-sdk/token-providers": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.363.0.tgz", + "integrity": "sha512-Z6w7fjgy79pAax580wdixbStQw10xfyZ+hOYLcPudoYFKjoNx0NQBejg5SwBzCF/HQL23Ksm9kDfbXDX9fkPhA==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.363.0.tgz", + "integrity": "sha512-FobpclDCf5Y1ueyJDmb9MqguAdPssNMlnqWQpujhYVABq69KHu73fSCWSauFPUrw7YOpV8kG1uagDF0POSxHzA==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-logger": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.363.0.tgz", + "integrity": "sha512-SSGgthScYnFGTOw8EzbkvquqweFmvn7uJihkpFekbtBNGC/jGOGO+8ziHjTQ8t/iI/YKubEwv+LMi0f77HKSEg==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.363.0.tgz", + "integrity": "sha512-MWD/57QgI/N7fG8rtzDTUdSqNpYohQfgj9XCFAoVeI/bU4usrkOrew43L4smJG4XrDxlNT8lSJlDtd64tuiUZA==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.363.0.tgz", + "integrity": "sha512-ri8YaQvXP6odteVTMfxPqFR26Q0h9ejtqhUDv47P34FaKXedEM4nC6ix6o+5FEYj6l8syGyktftZ5O70NoEhug==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@smithy/protocol-http": "^1.1.0", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/token-providers": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.363.0.tgz", + "integrity": "sha512-6+0aJ1zugNgsMmhTtW2LBWxOVSaXCUk2q3xyTchSXkNzallYaRiZMRkieW+pKNntnu0g5H1T0zyfCO0tbXwxEA==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.363.0", + "@aws-sdk/types": "3.357.0", + "@smithy/property-provider": "^1.0.1", + "@smithy/shared-ini-file-loader": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/types": { + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", + "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/util-endpoints": { + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz", + "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.363.0.tgz", + "integrity": "sha512-fk9ymBUIYbxiGm99Cn+kAAXmvMCWTf/cHAcB79oCXV4ELXdPa9lN5xQhZRFNxLUeXG4OAMEuCAUUuZEj8Fnc1Q==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/types": "^1.1.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.363.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.363.0.tgz", + "integrity": "sha512-Fli/dvgGA9hdnQUrYb1//wNSFlK2jAfdJcfNXA6SeBYzSeH5pVGYF4kXF0FCdnMA3Fef+Zn1zAP/hw9v8VJHWQ==", + "dependencies": { + "@aws-sdk/types": "3.357.0", + "@smithy/node-config-provider": "^1.0.1", + "@smithy/types": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/abort-controller": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.1.0.tgz", + "integrity": "sha512-5imgGUlZL4dW4YWdMYAKLmal9ny/tlenM81QZY7xYyb76z9Z/QOg7oM5Ak9HQl8QfFTlGVWwcMXl+54jroRgEQ==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/config-resolver": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.1.0.tgz", + "integrity": "sha512-7WD9eZHp46BxAjNGHJLmxhhyeiNWkBdVStd7SUJPUZqQGeIO/REtIrcIfKUfdiHTQ9jyu2SYoqvzqqaFc6987w==", + "dependencies": { + "@smithy/types": "^1.2.0", + "@smithy/util-config-provider": "^1.1.0", + "@smithy/util-middleware": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/credential-provider-imds": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.1.0.tgz", + "integrity": "sha512-kUMOdEu3RP6ozH0Ga8OeMP8gSkBsK1UqZZKyPLFnpZHrtZuHSSt7M7gsHYB/bYQBZAo3o7qrGmRty3BubYtYxQ==", + "dependencies": { + "@smithy/node-config-provider": "^1.1.0", + "@smithy/property-provider": "^1.2.0", + "@smithy/types": "^1.2.0", + "@smithy/url-parser": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/fetch-http-handler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.1.0.tgz", + "integrity": "sha512-N22C9R44u5WGlcY+Wuv8EXmCAq62wWwriRAuoczMEwAIjPbvHSthyPSLqI4S7kAST1j6niWg8kwpeJ3ReAv3xg==", + "dependencies": { + "@smithy/protocol-http": "^1.2.0", + "@smithy/querystring-builder": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-base64": "^1.1.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/hash-node": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.1.0.tgz", + "integrity": "sha512-yiNKDGMzrQjnpnbLfkYKo+HwIxmBAsv0AI++QIJwvhfkLpUTBylelkv6oo78/YqZZS6h+bGfl0gILJsKE2wAKQ==", + "dependencies": { + "@smithy/types": "^1.2.0", + "@smithy/util-buffer-from": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/invalid-dependency": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.1.0.tgz", + "integrity": "sha512-h2rXn68ClTwzPXYzEUNkz+0B/A0Hz8YdFNTiEwlxkwzkETGKMxmsrQGFXwYm3jd736R5vkXcClXz1ddKrsaBEQ==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/is-array-buffer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.1.0.tgz", + "integrity": "sha512-twpQ/n+3OWZJ7Z+xu43MJErmhB/WO/mMTnqR6PwWQShvSJ/emx5d1N59LQZk6ZpTAeuRWrc+eHhkzTp9NFjNRQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-content-length": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.1.0.tgz", + "integrity": "sha512-iNxwhZ7Xc5+LjeDElEOi/Nh8fFsc9Dw9+5w7h7/GLFIU0RgAwBJuJtcP1vNTOwzW4B3hG+gRu8sQLqA9OEaTwA==", + "dependencies": { + "@smithy/protocol-http": "^1.2.0", + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-endpoint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.1.0.tgz", + "integrity": "sha512-PvpazNjVpxX2ICrzoFYCpFnjB39DKCpZds8lRpAB3p6HGrx6QHBaNvOzVhJGBf0jcAbfCdc5/W0n9z8VWaSSww==", + "dependencies": { + "@smithy/middleware-serde": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/url-parser": "^1.1.0", + "@smithy/util-middleware": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-retry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.1.0.tgz", + "integrity": "sha512-lINKYxIvT+W20YFOtHBKeGm7npuJg0/YCoShttU7fVpsmU+a2rdb9zrJn1MHqWfUL6DhTAWGa0tH2O7l4XrDcw==", + "dependencies": { + "@smithy/protocol-http": "^1.2.0", + "@smithy/service-error-classification": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-middleware": "^1.1.0", + "@smithy/util-retry": "^1.1.0", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-serde": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.1.0.tgz", + "integrity": "sha512-RiBMxhxuO9VTjHsjJvhzViyceoLhU6gtrnJGpAXY43wE49IstXIGEQz8MT50/hOq5EumX16FCpup0r5DVyfqNQ==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/middleware-stack": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.1.0.tgz", + "integrity": "sha512-XynYiIvXNea2BbLcppvpNK0zu8o2woJqgnmxqYTn4FWagH/Hr2QIk8LOsUz7BIJ4tooFhmx8urHKCdlPbbPDCA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/node-config-provider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.1.0.tgz", + "integrity": "sha512-2G4TlzUnmTrUY26VKTonQqydwb+gtM/mcl+TqDP8CnWtJKVL8ElPpKgLGScP04bPIRY9x2/10lDdoaRXDqPuCw==", + "dependencies": { + "@smithy/property-provider": "^1.2.0", + "@smithy/shared-ini-file-loader": "^1.1.0", + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/node-http-handler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.1.0.tgz", + "integrity": "sha512-d3kRriEgaIiGXLziAM8bjnaLn1fthCJeTLZIwEIpzQqe6yPX0a+yQoLCTyjb2fvdLwkMoG4p7THIIB5cj5lkbg==", + "dependencies": { + "@smithy/abort-controller": "^1.1.0", + "@smithy/protocol-http": "^1.2.0", + "@smithy/querystring-builder": "^1.1.0", + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/property-provider": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.2.0.tgz", + "integrity": "sha512-qlJd9gT751i4T0t/hJAyNGfESfi08Fek8QiLcysoKPgR05qHhG0OYhlaCJHhpXy4ECW0lHyjvFM1smrCLIXVfw==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/protocol-http": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.2.0.tgz", + "integrity": "sha512-GfGfruksi3nXdFok5RhgtOnWe5f6BndzYfmEXISD+5gAGdayFGpjWu5pIqIweTudMtse20bGbc+7MFZXT1Tb8Q==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/querystring-builder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.1.0.tgz", + "integrity": "sha512-gDEi4LxIGLbdfjrjiY45QNbuDmpkwh9DX4xzrR2AzjjXpxwGyfSpbJaYhXARw9p17VH0h9UewnNQXNwaQyYMDA==", + "dependencies": { + "@smithy/types": "^1.2.0", + "@smithy/util-uri-escape": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/querystring-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.1.0.tgz", + "integrity": "sha512-Lm/FZu2qW3XX+kZ4WPwr+7aAeHf1Lm84UjNkKyBu16XbmEV7ukfhXni2aIwS2rcVf8Yv5E7wchGGpOFldj9V4Q==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/service-error-classification": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.1.0.tgz", + "integrity": "sha512-OCTEeJ1igatd5kFrS2VDlYbainNNpf7Lj1siFOxnRWqYOP9oNvC5HOJBd3t+Z8MbrmehBtuDJ2QqeBsfeiNkww==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/shared-ini-file-loader": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.1.0.tgz", + "integrity": "sha512-S/v33zvCWzFyGZGlsEF0XsZtNNR281UhR7byk3nRfsgw5lGpg51rK/zjMgulM+h6NSuXaFILaYrw1I1v4kMcuA==", + "dependencies": { + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/smithy-client": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.1.0.tgz", + "integrity": "sha512-j32SGgVhv2G9nBTmel9u3OXux8KG20ssxuFakJrEeDug3kqbl1qrGzVLCe+Eib402UDtA0Sp1a4NZ2SEXDBxag==", + "dependencies": { + "@smithy/middleware-stack": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-stream": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-1.2.0.tgz", + "integrity": "sha512-z1r00TvBqF3dh4aHhya7nz1HhvCg4TRmw51fjMrh5do3h+ngSstt/yKlNbHeb9QxJmFbmN8KEVSWgb1bRvfEoA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/url-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.1.0.tgz", + "integrity": "sha512-tpvi761kzboiLNGEWczuybMPCJh6WHB3cz9gWAG95mSyaKXmmX8ZcMxoV+irZfxDqLwZVJ22XTumu32S7Ow8aQ==", + "dependencies": { + "@smithy/querystring-parser": "^1.1.0", + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-base64": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.1.0.tgz", + "integrity": "sha512-FpYmDmVbOXAxqvoVCwqehUN0zXS+lN8V7VS9O7I8MKeVHdSTsZzlwiMEvGoyTNOXWn8luF4CTDYgNHnZViR30g==", + "dependencies": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-body-length-browser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.1.0.tgz", + "integrity": "sha512-cep3ioRxzRZ2Jbp3Kly7gy6iNVefYXiT6ETt8W01RQr3uwi1YMkrbU1p3lMR4KhX/91Nrk6UOgX1RH+oIt48RQ==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-body-length-node": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.1.0.tgz", + "integrity": "sha512-fRHRjkUuT5em4HZoshySXmB1n3HAU7IS232s+qU4TicexhyGJpXMK/2+c56ePOIa1FOK2tV1Q3J/7Mae35QVSw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-buffer-from": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.1.0.tgz", + "integrity": "sha512-9m6NXE0ww+ra5HKHCHig20T+FAwxBAm7DIdwc/767uGWbRcY720ybgPacQNB96JMOI7xVr/CDa3oMzKmW4a+kw==", + "dependencies": { + "@smithy/is-array-buffer": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-config-provider": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.1.0.tgz", + "integrity": "sha512-rQ47YpNmF6Is4I9GiE3T3+0xQ+r7RKRKbmHYyGSbyep/0cSf9kteKcI0ssJTvveJ1K4QvwrxXj1tEFp/G2UqxQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-defaults-mode-browser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.1.0.tgz", + "integrity": "sha512-0bWhs1e412bfC5gwPCMe8Zbz0J8UoZ/meEQdo6MYj8Ne+c+QZ+KxVjx0a1dFYOclvM33SslL9dP0odn8kfblkg==", + "dependencies": { + "@smithy/property-provider": "^1.2.0", + "@smithy/types": "^1.2.0", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-defaults-mode-node": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.1.0.tgz", + "integrity": "sha512-440e25TUH2b+TeK5CwsjYFrI9ShVOgA31CoxCKiv4ncSK4ZM68XW5opYxQmzMbRWARGEMu2XEUeBmOgMU2RLsw==", + "dependencies": { + "@smithy/config-resolver": "^1.1.0", + "@smithy/credential-provider-imds": "^1.1.0", + "@smithy/node-config-provider": "^1.1.0", + "@smithy/property-provider": "^1.2.0", + "@smithy/types": "^1.2.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-hex-encoding": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.1.0.tgz", + "integrity": "sha512-7UtIE9eH0u41zpB60Jzr0oNCQ3hMJUabMcKRUVjmyHTXiWDE4vjSqN6qlih7rCNeKGbioS7f/y2Jgym4QZcKFg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-middleware": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.1.0.tgz", + "integrity": "sha512-6hhckcBqVgjWAqLy2vqlPZ3rfxLDhFWEmM7oLh2POGvsi7j0tHkbN7w4DFhuBExVJAbJ/qqxqZdRY6Fu7/OezQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-retry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.1.0.tgz", + "integrity": "sha512-ygQW5HBqYXpR3ua09UciS0sL7UGJzGiktrKkOuEJwARoUuzz40yaEGU6xd9Gs7KBmAaFC8gMfnghHtwZ2nyBCQ==", + "dependencies": { + "@smithy/service-error-classification": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.1.0.tgz", + "integrity": "sha512-w3lsdGsntaLQIrwDWJkIFKrFscgZXwU/oxsse09aSTNv5TckPhDeYea3LhsDrU5MGAG3vprhVZAKr33S45coVA==", + "dependencies": { + "@smithy/fetch-http-handler": "^1.1.0", + "@smithy/node-http-handler": "^1.1.0", + "@smithy/types": "^1.2.0", + "@smithy/util-base64": "^1.1.0", + "@smithy/util-buffer-from": "^1.1.0", + "@smithy/util-hex-encoding": "^1.1.0", + "@smithy/util-utf8": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-uri-escape": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.1.0.tgz", + "integrity": "sha512-/jL/V1xdVRt5XppwiaEU8Etp5WHZj609n0xMTuehmCqdoOFbId1M+aEeDWZsQ+8JbEB/BJ6ynY2SlYmOaKtt8w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.1.0.tgz", + "integrity": "sha512-p/MYV+JmqmPyjdgyN2UxAeYDj9cBqCjp0C/NsTWnnjoZUVqoeZ6IrW915L9CAKWVECgv9lVQGc4u/yz26/bI1A==", + "dependencies": { + "@smithy/util-buffer-from": "^1.1.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@amzn/sagemaker-client/node_modules/@smithy/util-waiter": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-1.1.0.tgz", "integrity": "sha512-S6FNIB3UJT+5Efd/0DeziO5Rs82QAMODHW4v2V3oNRrwaBigY/7Yx3SiLudZuF9WpVsV08Ih3BjIH34nzZiinQ==", @@ -9550,63 +10642,546 @@ "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "dependencies": { + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-datazone/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] + }, + "node_modules/@aws-sdk/client-ec2": { + "version": "3.695.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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-sdk-ec2": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sts": { + "version": "3.693.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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-datazone/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "node_modules/@aws-sdk/client-ec2/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "node_modules/@aws-sdk/client-ec2/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], + "node_modules/@aws-sdk/client-ec2/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "strnum": "^2.1.0" + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "bin": { - "fxparser": "src/cli/cli.js" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-datazone/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ] - }, - "node_modules/@aws-sdk/client-ec2": { - "version": "3.695.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-ecr": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.693.0.tgz", + "integrity": "sha512-qBI06wo2VaQI/+Pb4GmZRVQMnXFr9B983nWWNhM6xzcYmfJKXbCW29syDVojiwp8/HPMOSqcKJzqIOqCWtN1Ug==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -9617,7 +11192,6 @@ "@aws-sdk/middleware-host-header": "3.693.0", "@aws-sdk/middleware-logger": "3.693.0", "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-sdk-ec2": "3.693.0", "@aws-sdk/middleware-user-agent": "3.693.0", "@aws-sdk/region-config-resolver": "3.693.0", "@aws-sdk/types": "3.692.0", @@ -9650,17 +11224,16 @@ "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", "@smithy/util-waiter": "^3.1.8", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -9705,9 +11278,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -9756,9 +11330,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -9805,9 +11380,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/core": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", "dependencies": { "@aws-sdk/types": "3.692.0", "@smithy/core": "^2.5.2", @@ -9825,9 +11401,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", "dependencies": { "@aws-sdk/core": "3.693.0", "@aws-sdk/types": "3.692.0", @@ -9844,9 +11421,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", "dependencies": { "@aws-sdk/core": "3.693.0", "@aws-sdk/credential-provider-env": "3.693.0", @@ -9868,9 +11446,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.693.0", "@aws-sdk/credential-provider-http": "3.693.0", @@ -9889,9 +11468,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", "dependencies": { "@aws-sdk/client-sso": "3.693.0", "@aws-sdk/core": "3.693.0", @@ -9906,9 +11486,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", "dependencies": { "@aws-sdk/core": "3.693.0", "@aws-sdk/types": "3.692.0", @@ -9923,9 +11504,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", "dependencies": { "@aws-sdk/types": "3.692.0", "@smithy/protocol-http": "^4.1.6", @@ -9936,9 +11518,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", "dependencies": { "@aws-sdk/types": "3.692.0", "@smithy/types": "^3.7.0", @@ -9948,778 +11531,956 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", "dependencies": { + "@aws-sdk/core": "3.693.0", "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", "@smithy/protocol-http": "^4.1.6", "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.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-ecr/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", + "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", + "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-ecr/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-eks": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-eks/-/client-eks-3.936.0.tgz", + "integrity": "sha512-bdKxO/nj6VRiqHxgWBa/4fGdZOU5xyhRAZ4CB7Rn/oJy+PTYXZFNAQBQ3+aBZMvi5juNodKOBFInnOozZ+Hl1A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-node": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/client-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", + "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/core": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", + "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", + "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", + "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", + "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-login": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", + "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-ini": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", + "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", + "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.936.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/token-providers": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", + "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", + "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-logger": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", + "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", + "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@aws-sdk/types": "3.936.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", + "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/nested-clients": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", + "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", + "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/token-providers": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", + "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ec2/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/types": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", + "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.693.0.tgz", - "integrity": "sha512-qBI06wo2VaQI/+Pb4GmZRVQMnXFr9B983nWWNhM6xzcYmfJKXbCW29syDVojiwp8/HPMOSqcKJzqIOqCWtN1Ug==", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/util-endpoints": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", + "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", + "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.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", - "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", + "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", - "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", + "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", + "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", - "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "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.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", - "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, + "node_modules/@aws-sdk/client-eks/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.0.tgz", + "integrity": "sha512-D1jAmAZQYMoPiacfgNf7AWhg3DFN3Wq/vQv3WINt9znwjzHp2x+WzdJFxxj7xZL7V1U79As6G8f7PorMYWBKsQ==", + "license": "Apache-2.0", "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", - "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", - "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", - "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/core": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", + "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", - "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", - "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", - "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", - "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", - "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", - "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", - "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", + "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/core": "^3.18.5", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", - "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-retry": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", + "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", - "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", - "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", - "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/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==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/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==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ecr/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==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-eks/-/client-eks-3.936.0.tgz", - "integrity": "sha512-bdKxO/nj6VRiqHxgWBa/4fGdZOU5xyhRAZ4CB7Rn/oJy+PTYXZFNAQBQ3+aBZMvi5juNodKOBFInnOozZ+Hl1A==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/credential-provider-node": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/client-sso": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", - "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/core": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", - "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws-sdk/xml-builder": "3.930.0", - "@smithy/core": "^3.18.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/signature-v4": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.9.0" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", - "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -10727,85 +12488,62 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", - "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/property-provider": "^4.2.5", + "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", - "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/smithy-client": { + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", + "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/credential-provider-env": "3.936.0", - "@aws-sdk/credential-provider-http": "3.936.0", - "@aws-sdk/credential-provider-login": "3.936.0", - "@aws-sdk/credential-provider-process": "3.936.0", - "@aws-sdk/credential-provider-sso": "3.936.0", - "@aws-sdk/credential-provider-web-identity": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/core": "^3.18.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", - "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.936.0", - "@aws-sdk/credential-provider-http": "3.936.0", - "@aws-sdk/credential-provider-ini": "3.936.0", - "@aws-sdk/credential-provider-process": "3.936.0", - "@aws-sdk/credential-provider-sso": "3.936.0", - "@aws-sdk/credential-provider-web-identity": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", - "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/querystring-parser": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -10813,81 +12551,77 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", - "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.936.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/token-providers": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", - "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", - "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-logger": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", - "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", - "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", + "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@aws/lambda-invoke-store": "^0.2.0", - "@smithy/protocol-http": "^5.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -10895,17 +12629,17 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", - "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", + "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@smithy/core": "^3.18.5", - "@smithy/protocol-http": "^5.3.5", + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -10913,82 +12647,38 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/nested-clients": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", - "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.936.0", - "@aws-sdk/middleware-host-header": "3.936.0", - "@aws-sdk/middleware-logger": "3.936.0", - "@aws-sdk/middleware-recursion-detection": "3.936.0", - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/region-config-resolver": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@aws-sdk/util-endpoints": "3.936.0", - "@aws-sdk/util-user-agent-browser": "3.936.0", - "@aws-sdk/util-user-agent-node": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/core": "^3.18.5", - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/hash-node": "^4.2.5", - "@smithy/invalid-dependency": "^4.2.5", - "@smithy/middleware-content-length": "^4.2.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-retry": "^4.4.12", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/middleware-stack": "^4.2.5", "@smithy/node-config-provider": "^4.3.5", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/smithy-client": "^4.9.8", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.11", - "@smithy/util-defaults-mode-node": "^4.2.14", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", - "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/config-resolver": "^4.4.3", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/token-providers": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", - "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.936.0", - "@aws-sdk/nested-clients": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -10996,12 +12686,13 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/types": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", - "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", "license": "Apache-2.0", "dependencies": { + "@smithy/service-error-classification": "^4.2.5", "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, @@ -11009,487 +12700,664 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/util-endpoints": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", - "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", - "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.936.0", - "@smithy/types": "^4.9.0", - "bowser": "^2.11.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.936.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", - "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.936.0", - "@aws-sdk/types": "3.936.0", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws-sdk/xml-builder": { - "version": "3.930.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", - "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-waiter": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", + "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", "license": "Apache-2.0", "dependencies": { + "@smithy/abort-controller": "^4.2.5", "@smithy/types": "^4.9.0", - "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@aws/lambda-invoke-store": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.0.tgz", - "integrity": "sha512-D1jAmAZQYMoPiacfgNf7AWhg3DFN3Wq/vQv3WINt9znwjzHp2x+WzdJFxxj7xZL7V1U79As6G8f7PorMYWBKsQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-eks/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-eks/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/@aws-sdk/client-glue": { + "version": "3.852.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-glue/-/client-glue-3.852.0.tgz", + "integrity": "sha512-5IyZt/gKr0NoUHWGM112ikXrZs+VsA/09bwKDmp4/j250tfaZqgC1zhfBNFkyNisj1JQ0XYjwfzkLnYWlT3Pyw==", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/credential-provider-node": "3.848.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "tslib": "^2.6.2" + }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/abort-controller": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", - "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/client-sso": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", + "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", "dependencies": { - "@smithy/types": "^4.9.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/config-resolver": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", - "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/core": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz", + "integrity": "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.5", - "@smithy/util-middleware": "^4.2.5", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/core": "^3.7.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/core": { - "version": "3.18.5", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", - "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz", + "integrity": "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==", "dependencies": { - "@smithy/middleware-serde": "^4.2.6", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-stream": "^4.5.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/uuid": "^1.1.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/credential-provider-imds": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", - "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz", + "integrity": "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/fetch-http-handler": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", - "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz", + "integrity": "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==", "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/credential-provider-env": "3.846.0", + "@aws-sdk/credential-provider-http": "3.846.0", + "@aws-sdk/credential-provider-process": "3.846.0", + "@aws-sdk/credential-provider-sso": "3.848.0", + "@aws-sdk/credential-provider-web-identity": "3.848.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/hash-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", - "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz", + "integrity": "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==", "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@aws-sdk/credential-provider-env": "3.846.0", + "@aws-sdk/credential-provider-http": "3.846.0", + "@aws-sdk/credential-provider-ini": "3.848.0", + "@aws-sdk/credential-provider-process": "3.846.0", + "@aws-sdk/credential-provider-sso": "3.848.0", + "@aws-sdk/credential-provider-web-identity": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/invalid-dependency": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", - "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.846.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz", + "integrity": "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==", "dependencies": { - "@smithy/types": "^4.9.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/is-array-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", - "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz", + "integrity": "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==", "dependencies": { + "@aws-sdk/client-sso": "3.848.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/token-providers": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-content-length": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", - "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz", + "integrity": "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==", "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-endpoint": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", - "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", + "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", "dependencies": { - "@smithy/core": "^3.18.5", - "@smithy/middleware-serde": "^4.2.6", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", - "@smithy/url-parser": "^4.2.5", - "@smithy/util-middleware": "^4.2.5", + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-retry": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", - "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/service-error-classification": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-retry": "^4.2.5", - "@smithy/uuid": "^1.1.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-logger": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", + "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "dependencies": { + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-serde": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", - "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", + "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", "dependencies": { - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/middleware-stack": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", - "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz", + "integrity": "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==", "dependencies": { - "@smithy/types": "^4.9.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@smithy/core": "^3.7.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/node-config-provider": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", - "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/nested-clients": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz", + "integrity": "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==", "dependencies": { - "@smithy/property-provider": "^4.2.5", - "@smithy/shared-ini-file-loader": "^4.4.0", - "@smithy/types": "^4.9.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.848.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.15", + "@smithy/middleware-retry": "^4.1.16", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.7", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.23", + "@smithy/util-defaults-mode-node": "^4.0.23", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/node-http-handler": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", - "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", + "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", "dependencies": { - "@smithy/abort-controller": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/querystring-builder": "^4.2.5", - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/property-provider": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", - "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/token-providers": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz", + "integrity": "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==", "dependencies": { - "@smithy/types": "^4.9.0", + "@aws-sdk/core": "3.846.0", + "@aws-sdk/nested-clients": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/protocol-http": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", - "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/querystring-builder": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", - "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-endpoints": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", + "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", "dependencies": { - "@smithy/types": "^4.9.0", - "@smithy/util-uri-escape": "^4.2.0", + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/querystring-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", - "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", + "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", "dependencies": { - "@smithy/types": "^4.9.0", + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz", + "integrity": "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.848.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/service-error-classification": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", - "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/xml-builder": { + "version": "3.821.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", + "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", "dependencies": { - "@smithy/types": "^4.9.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", - "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/abort-controller": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", + "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/signature-v4": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", - "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/config-resolver": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", + "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.5", - "@smithy/util-uri-escape": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/smithy-client": { - "version": "4.9.8", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", - "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/core": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", + "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", "dependencies": { - "@smithy/core": "^3.18.5", - "@smithy/middleware-endpoint": "^4.3.12", - "@smithy/middleware-stack": "^4.2.5", - "@smithy/protocol-http": "^5.3.5", - "@smithy/types": "^4.9.0", - "@smithy/util-stream": "^4.5.6", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-stream": "^4.2.3", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/types": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", - "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", + "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", "dependencies": { + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/url-parser": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", - "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", + "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", "dependencies": { - "@smithy/querystring-parser": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-base64": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", - "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/hash-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", + "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-body-length-browser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", - "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/invalid-dependency": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", + "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", "dependencies": { + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-body-length-node": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", - "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "dependencies": { "tslib": "^2.6.2" }, @@ -11497,247 +13365,193 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-buffer-from": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", - "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-content-length": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", + "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", "dependencies": { - "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-config-provider": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", - "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", + "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", "dependencies": { + "@smithy/core": "^3.7.2", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", - "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-retry": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", + "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", "dependencies": { - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", + "@smithy/service-error-classification": "^4.0.6", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", - "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-serde": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", + "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", "dependencies": { - "@smithy/config-resolver": "^4.4.3", - "@smithy/credential-provider-imds": "^4.2.5", - "@smithy/node-config-provider": "^4.3.5", - "@smithy/property-provider": "^4.2.5", - "@smithy/smithy-client": "^4.9.8", - "@smithy/types": "^4.9.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-endpoints": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", - "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-stack": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", + "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", "dependencies": { - "@smithy/node-config-provider": "^4.3.5", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-hex-encoding": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", - "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-config-provider": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", + "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", "dependencies": { + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-middleware": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", - "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-http-handler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", + "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", "dependencies": { - "@smithy/types": "^4.9.0", + "@smithy/abort-controller": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-retry": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", - "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/property-provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", + "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", "dependencies": { - "@smithy/service-error-classification": "^4.2.5", - "@smithy/types": "^4.9.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-stream": { - "version": "4.5.6", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", - "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/protocol-http": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", + "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.6", - "@smithy/node-http-handler": "^4.4.5", - "@smithy/types": "^4.9.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-buffer-from": "^4.2.0", - "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-utf8": "^4.2.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-uri-escape": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", - "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-builder": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", + "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", "dependencies": { + "@smithy/types": "^4.3.1", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-utf8": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", - "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", + "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", "dependencies": { - "@smithy/util-buffer-from": "^4.2.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/@smithy/util-waiter": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", - "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/service-error-classification": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", + "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", "dependencies": { - "@smithy/abort-controller": "^4.2.5", - "@smithy/types": "^4.9.0", - "tslib": "^2.6.2" + "@smithy/types": "^4.3.1" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", + "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", "dependencies": { - "strnum": "^2.1.0" + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" }, - "bin": { - "fxparser": "src/cli/cli.js" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-eks/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/@aws-sdk/client-glue": { - "version": "3.852.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-glue/-/client-glue-3.852.0.tgz", - "integrity": "sha512-5IyZt/gKr0NoUHWGM112ikXrZs+VsA/09bwKDmp4/j250tfaZqgC1zhfBNFkyNisj1JQ0XYjwfzkLnYWlT3Pyw==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/signature-v4": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", + "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/credential-provider-node": "3.848.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", + "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -11745,87 +13559,40 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/client-sso": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz", - "integrity": "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/smithy-client": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", + "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", + "@smithy/core": "^3.7.2", + "@smithy/middleware-endpoint": "^4.1.17", "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/core": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz", - "integrity": "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", + "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz", - "integrity": "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/url-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", + "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", + "@smithy/querystring-parser": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -11833,114 +13600,89 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz", - "integrity": "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz", - "integrity": "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/credential-provider-env": "3.846.0", - "@aws-sdk/credential-provider-http": "3.846.0", - "@aws-sdk/credential-provider-process": "3.846.0", - "@aws-sdk/credential-provider-sso": "3.848.0", - "@aws-sdk/credential-provider-web-identity": "3.848.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz", - "integrity": "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.846.0", - "@aws-sdk/credential-provider-http": "3.846.0", - "@aws-sdk/credential-provider-ini": "3.848.0", - "@aws-sdk/credential-provider-process": "3.846.0", - "@aws-sdk/credential-provider-sso": "3.848.0", - "@aws-sdk/credential-provider-web-identity": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.846.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz", - "integrity": "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz", - "integrity": "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", + "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", "dependencies": { - "@aws-sdk/client-sso": "3.848.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/token-providers": "3.848.0", - "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz", - "integrity": "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", + "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -11948,13 +13690,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", + "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -11962,26 +13703,22 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-middleware": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", + "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -11989,16 +13726,12 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz", - "integrity": "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", + "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@smithy/core": "^3.7.0", - "@smithy/protocol-http": "^5.1.2", + "@smithy/service-error-classification": "^4.0.6", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -12006,47 +13739,17 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/nested-clients": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz", - "integrity": "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-stream": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", + "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.846.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.848.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.15", - "@smithy/middleware-retry": "^4.1.16", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.23", - "@smithy/util-defaults-mode-node": "^4.0.23", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -12054,670 +13757,1064 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/token-providers": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz", - "integrity": "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg==", + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "dependencies": { - "@aws-sdk/core": "3.846.0", - "@aws-sdk/nested-clients": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-glue/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ] + }, + "node_modules/@aws-sdk/client-iam": { + "version": "3.693.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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-endpoints": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", - "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz", - "integrity": "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.848.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" }, "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/core": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", - "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", - "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", - "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", - "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-retry": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", - "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "node_modules/@aws-sdk/client-iam/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "node_modules/@aws-sdk/client-iam/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "node_modules/@aws-sdk/client-iam/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "node_modules/@aws-sdk/client-iot": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot/-/client-iot-3.693.0.tgz", + "integrity": "sha512-0EOKH6CjDHMdE1NSDdtZ8/zov+Xf1MovWvAeQGs76ec4mL2VWP5HvePjjdkGoOo0KC9k/AqOVVc0UOZjK0iCQw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", - "dependencies": { - "@smithy/types": "^4.3.1" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/smithy-client": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", - "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", - "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", - "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "node_modules/@aws-sdk/client-iot/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/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "node_modules/@aws-sdk/client-iot/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": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "node_modules/@aws-sdk/client-iot/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": "^4.0.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-glue/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ] - }, - "node_modules/@aws-sdk/client-iam": { + "node_modules/@aws-sdk/client-iotsecuretunneling": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iotsecuretunneling/-/client-iotsecuretunneling-3.693.0.tgz", + "integrity": "sha512-f9p5/TgVQsko0FlYIj9UKAVSfgPF4GgoKGVOI3Gx6XpynYwideGxItq3v0ExoAzpaohq6zRKleqA68o/T1TqXQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -12760,15 +14857,16 @@ "@smithy/util-middleware": "^3.0.9", "@smithy/util-retry": "^3.0.9", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -12814,8 +14912,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -12865,8 +14965,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -12914,8 +15016,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/core": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -12934,8 +15038,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -12953,8 +15059,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -12977,8 +15085,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.693.0", @@ -12998,8 +15108,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.693.0", @@ -13015,8 +15127,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -13032,8 +15146,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -13045,8 +15161,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -13057,8 +15175,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -13070,8 +15190,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -13086,8 +15208,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -13101,8 +15225,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -13118,8 +15244,10 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -13131,8 +15259,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -13141,8 +15271,10 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "3.693.0", @@ -13163,8 +15295,10 @@ } } }, - "node_modules/@aws-sdk/client-iam/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-iotsecuretunneling/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" @@ -13173,8 +15307,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-iotsecuretunneling/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", @@ -13184,8 +15320,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iam/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-iotsecuretunneling/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", @@ -13195,10 +15333,172 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot": { + "node_modules/@aws-sdk/client-lambda": { + "version": "3.637.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/eventstream-serde-browser": "^3.0.6", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.5", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-lambda/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-lambda/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iot/-/client-iot-3.693.0.tgz", - "integrity": "sha512-0EOKH6CjDHMdE1NSDdtZ8/zov+Xf1MovWvAeQGs76ec4mL2VWP5HvePjjdkGoOo0KC9k/AqOVVc0UOZjK0iCQw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift/-/client-redshift-3.693.0.tgz", + "integrity": "sha512-k+4emXXK7iOOYjTAU+Erj5RVxu68Hi6iI48h5r8iNMhWRUMqUq346tK5qkD4C4x9SzJu5j0WgPWpVUiHu8ufDw==", + "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.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-redshift-data": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-data/-/client-redshift-data-3.693.0.tgz", + "integrity": "sha512-uG5LdlXz80KcauRIucMdiRSQJ2WutewQRHpcTQW4vFUf/kEhUha5fD9FMn+/eJ1NFA2N8hv64vhpzGvu7EiP6Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -13249,7 +15549,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", @@ -13298,7 +15598,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", @@ -13351,7 +15651,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", @@ -13402,7 +15702,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/core": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", @@ -13424,7 +15724,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", @@ -13445,7 +15745,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", @@ -13471,7 +15771,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", @@ -13494,7 +15794,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", @@ -13513,7 +15813,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", @@ -13532,7 +15832,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", @@ -13547,7 +15847,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", @@ -13561,7 +15861,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", @@ -13576,7 +15876,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", @@ -13594,7 +15894,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", @@ -13611,7 +15911,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", @@ -13630,7 +15930,7 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", @@ -13645,7 +15945,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", @@ -13657,7 +15957,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", @@ -13681,7 +15981,7 @@ } } }, - "node_modules/@aws-sdk/client-iot/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-redshift-data/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==", @@ -13693,7 +15993,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-redshift-data/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==", @@ -13706,7 +16006,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iot/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-redshift-data/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==", @@ -13719,10 +16019,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling": { + "node_modules/@aws-sdk/client-redshift-serverless": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iotsecuretunneling/-/client-iotsecuretunneling-3.693.0.tgz", - "integrity": "sha512-f9p5/TgVQsko0FlYIj9UKAVSfgPF4GgoKGVOI3Gx6XpynYwideGxItq3v0ExoAzpaohq6zRKleqA68o/T1TqXQ==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-serverless/-/client-redshift-serverless-3.693.0.tgz", + "integrity": "sha512-m6Bhw0Xx/x0KGKP9N7c+Jqs5VT6nkZbfwO+QTxllggsuNfAzGwluCw1hoY++/MQ9oFtioEu+ud7xWOlTIK8w/A==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -13771,7 +16071,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", @@ -13820,7 +16120,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", @@ -13873,7 +16173,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", @@ -13924,7 +16224,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/core": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", @@ -13946,7 +16246,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", @@ -13967,7 +16267,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", @@ -13993,7 +16293,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", @@ -14016,7 +16316,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", @@ -14035,7 +16335,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", @@ -14054,7 +16354,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", @@ -14069,7 +16369,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", @@ -14083,7 +16383,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", @@ -14098,7 +16398,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", @@ -14116,7 +16416,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", @@ -14133,7 +16433,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", @@ -14152,7 +16452,7 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", @@ -14167,7 +16467,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", @@ -14179,7 +16479,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", @@ -14203,261 +16503,45 @@ } } }, - "node_modules/@aws-sdk/client-iotsecuretunneling/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/@aws-sdk/client-iotsecuretunneling/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/@aws-sdk/client-iotsecuretunneling/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/@aws-sdk/client-lambda": { - "version": "3.637.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/types": { - "version": "3.609.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/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-lambda/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-redshift": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift/-/client-redshift-3.693.0.tgz", - "integrity": "sha512-k+4emXXK7iOOYjTAU+Erj5RVxu68Hi6iI48h5r8iNMhWRUMqUq346tK5qkD4C4x9SzJu5j0WgPWpVUiHu8ufDw==", - "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.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", + "node_modules/@aws-sdk/client-redshift-serverless/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/@aws-sdk/client-redshift-data": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-data/-/client-redshift-data-3.693.0.tgz", - "integrity": "sha512-uG5LdlXz80KcauRIucMdiRSQJ2WutewQRHpcTQW4vFUf/kEhUha5fD9FMn+/eJ1NFA2N8hv64vhpzGvu7EiP6Q==", + "node_modules/@aws-sdk/client-redshift-serverless/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": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-redshift-serverless/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/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", @@ -14506,7 +16590,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", @@ -14559,7 +16643,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", @@ -14610,7 +16694,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/core": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", @@ -14632,7 +16716,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", @@ -14653,7 +16737,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", @@ -14679,7 +16763,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", @@ -14702,7 +16786,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", @@ -14721,7 +16805,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", @@ -14740,7 +16824,7 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", @@ -14755,7 +16839,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", @@ -14769,7 +16853,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", @@ -14784,7 +16868,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", @@ -14802,7 +16886,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", @@ -14819,7 +16903,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", @@ -14838,7 +16922,7 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", @@ -14853,7 +16937,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", @@ -14865,7 +16949,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", @@ -14889,7 +16973,7 @@ } } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-redshift/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==", @@ -14901,7 +16985,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-redshift/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==", @@ -14914,7 +16998,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-data/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-redshift/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==", @@ -14927,32 +17011,45 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless": { + "node_modules/@aws-sdk/client-s3": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-redshift-serverless/-/client-redshift-serverless-3.693.0.tgz", - "integrity": "sha512-m6Bhw0Xx/x0KGKP9N7c+Jqs5VT6nkZbfwO+QTxllggsuNfAzGwluCw1hoY++/MQ9oFtioEu+ud7xWOlTIK8w/A==", "license": "Apache-2.0", "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.693.0", "@aws-sdk/client-sts": "3.693.0", "@aws-sdk/core": "3.693.0", "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-bucket-endpoint": "3.693.0", + "@aws-sdk/middleware-expect-continue": "3.693.0", + "@aws-sdk/middleware-flexible-checksums": "3.693.0", "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-location-constraint": "3.693.0", "@aws-sdk/middleware-logger": "3.693.0", "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-sdk-s3": "3.693.0", + "@aws-sdk/middleware-ssec": "3.693.0", "@aws-sdk/middleware-user-agent": "3.693.0", "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/signature-v4-multi-region": "3.693.0", "@aws-sdk/types": "3.692.0", "@aws-sdk/util-endpoints": "3.693.0", "@aws-sdk/util-user-agent-browser": "3.693.0", "@aws-sdk/util-user-agent-node": "3.693.0", + "@aws-sdk/xml-builder": "3.693.0", "@smithy/config-resolver": "^3.0.11", "@smithy/core": "^2.5.2", + "@smithy/eventstream-serde-browser": "^3.0.12", + "@smithy/eventstream-serde-config-resolver": "^3.0.9", + "@smithy/eventstream-serde-node": "^3.0.11", "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-blob-browser": "^3.1.8", "@smithy/hash-node": "^3.0.9", + "@smithy/hash-stream-node": "^3.1.8", "@smithy/invalid-dependency": "^3.0.9", + "@smithy/md5-js": "^3.0.9", "@smithy/middleware-content-length": "^3.0.11", "@smithy/middleware-endpoint": "^3.2.2", "@smithy/middleware-retry": "^3.0.26", @@ -14972,1071 +17069,735 @@ "@smithy/util-endpoints": "^2.1.5", "@smithy/util-middleware": "^3.0.9", "@smithy/util-retry": "^3.0.9", + "@smithy/util-stream": "^3.3.0", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", - "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", - "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3-control/-/client-s3-control-3.859.0.tgz", + "integrity": "sha512-vzhOtDH4BCdn30+Crg1QxGXbhZIh4Ia84/qNx2EtupkM2UrO6uaZ91qGl175QWU4TcG+mlf/yA/bvrwenhbF6w==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@aws-sdk/core": "3.858.0", + "@aws-sdk/credential-provider-node": "3.859.0", + "@aws-sdk/middleware-bucket-endpoint": "3.840.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-sdk-s3-control": "3.848.0", + "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.858.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.2", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-blob-browser": "^4.0.4", + "@smithy/hash-node": "^4.0.4", + "@smithy/hash-stream-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/md5-js": "^4.0.4", + "@smithy/middleware-apply-body-checksum": "^4.1.2", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-retry": "^4.1.18", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.25", + "@smithy/util-defaults-mode-node": "^4.0.25", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", - "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/client-sso": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.858.0.tgz", + "integrity": "sha512-iXuZQs4KH6a3Pwnt0uORalzAZ5EXRPr3lBYAsdNwkP8OYyoUz5/TE3BLyw7ceEh0rj4QKGNnNALYo1cDm0EV8w==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", - "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", - "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", - "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.858.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.2", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-retry": "^4.1.18", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.25", + "@smithy/util-defaults-mode-node": "^4.0.25", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", - "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/core": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.858.0.tgz", + "integrity": "sha512-iWm4QLAS+/XMlnecIU1Y33qbBr1Ju+pmWam3xVCPlY4CSptKpVY+2hXOnmg9SbHAX9C005fWhrIn51oDd00c9A==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/core": "^3.7.2", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", - "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.858.0.tgz", + "integrity": "sha512-kZsGyh2BoSRguzlcGtzdLhw/l/n3KYAC+/l/H0SlsOq3RLHF6tO/cRdsLnwoix2bObChHUp03cex63o1gzdx/Q==", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", - "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.858.0.tgz", + "integrity": "sha512-GDnfYl3+NPJQ7WQQYOXEA489B212NinpcIDD7rpsB6IWUPo8yDjT5NceK4uUkIR3MFpNCGt9zd/z6NNLdB2fuQ==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", - "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", + "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/credential-provider-env": "3.858.0", + "@aws-sdk/credential-provider-http": "3.858.0", + "@aws-sdk/credential-provider-process": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", + "@aws-sdk/credential-provider-web-identity": "3.858.0", + "@aws-sdk/nested-clients": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", - "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", + "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@aws-sdk/credential-provider-env": "3.858.0", + "@aws-sdk/credential-provider-http": "3.858.0", + "@aws-sdk/credential-provider-ini": "3.859.0", + "@aws-sdk/credential-provider-process": "3.858.0", + "@aws-sdk/credential-provider-sso": "3.859.0", + "@aws-sdk/credential-provider-web-identity": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/credential-provider-imds": "^4.0.6", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", - "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.858.0.tgz", + "integrity": "sha512-l5LJWZJMRaZ+LhDjtupFUKEC5hAjgvCRrOvV5T60NCUBOy0Ozxa7Sgx3x+EOwiruuoh3Cn9O+RlbQlJX6IfZIw==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", - "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", + "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/client-sso": "3.858.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/token-providers": "3.859.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", - "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.858.0.tgz", + "integrity": "sha512-8iULWsH83iZDdUuiDsRb83M0NqIlXjlDbJUIddVsIrfWp4NmanKw77SV6yOZ66nuJjPsn9j7RDb9bfEPCy5SWA==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/nested-clients": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", - "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", + "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-arn-parser": "3.804.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", - "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", + "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", - "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-logger": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", + "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", - "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", + "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.840.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/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", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.858.0.tgz", + "integrity": "sha512-pC3FT/sRZ6n5NyXiTVu9dpf1D9j3YbJz3XmeOOwJqO/Mib2PZyIQktvNMPgwaC5KMVB1zWqS5bmCwxpMOnq0UQ==", "dependencies": { + "@aws-sdk/core": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@smithy/core": "^3.7.2", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/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", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/nested-clients": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.858.0.tgz", + "integrity": "sha512-ChdIj80T2whoWbovmO7o8ICmhEB2S9q4Jes9MBnKAPm69PexcJAK2dQC8yI4/iUP8b3+BHZoUPrYLWjBxIProQ==", "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.858.0", + "@aws-sdk/middleware-host-header": "3.840.0", + "@aws-sdk/middleware-logger": "3.840.0", + "@aws-sdk/middleware-recursion-detection": "3.840.0", + "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/region-config-resolver": "3.840.0", + "@aws-sdk/types": "3.840.0", + "@aws-sdk/util-endpoints": "3.848.0", + "@aws-sdk/util-user-agent-browser": "3.840.0", + "@aws-sdk/util-user-agent-node": "3.858.0", + "@smithy/config-resolver": "^4.1.4", + "@smithy/core": "^3.7.2", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/hash-node": "^4.0.4", + "@smithy/invalid-dependency": "^4.0.4", + "@smithy/middleware-content-length": "^4.0.4", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-retry": "^4.1.18", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/node-http-handler": "^4.1.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/smithy-client": "^4.4.9", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-body-length-node": "^4.0.0", + "@smithy/util-defaults-mode-browser": "^4.0.25", + "@smithy/util-defaults-mode-node": "^4.0.25", + "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-retry": "^4.0.6", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift-serverless/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", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", + "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", - "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/token-providers": { + "version": "3.859.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", + "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/core": "3.858.0", + "@aws-sdk/nested-clients": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", - "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", - "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-arn-parser": { + "version": "3.804.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", + "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", - "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-endpoints": { + "version": "3.848.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", + "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", - "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", + "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@aws-sdk/types": "3.840.0", + "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", - "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.858.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.858.0.tgz", + "integrity": "sha512-T1m05QlN8hFpx5/5duMjS8uFSK5e6EXP45HQRkZULVkL3DK+jMaxsnh3KLl5LjUoHn/19M4HM0wNUBhYp4Y2Yw==", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.858.0", + "@aws-sdk/types": "3.840.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", - "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/xml-builder": { + "version": "3.821.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", + "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", - "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/abort-controller": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", + "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", - "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", + "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", - "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader-native": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", + "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", - "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/config-resolver": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", + "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/types": "^4.3.1", + "@smithy/util-config-provider": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", - "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/core": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", + "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-stream": "^4.2.3", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", - "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/credential-provider-imds": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", + "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", - "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/fetch-http-handler": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", + "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", - "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-blob-browser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", + "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/chunked-blob-reader": "^5.0.0", + "@smithy/chunked-blob-reader-native": "^4.0.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", - "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", + "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", - "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-stream-node": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", + "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@smithy/types": "^4.3.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", - "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/invalid-dependency": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", + "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/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", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/is-array-buffer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", + "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", "dependencies": { "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/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", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/md5-js": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", + "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/types": "^4.3.1", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-redshift/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", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-content-length": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", + "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/protocol-http": "^5.1.2", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.693.0", - "license": "Apache-2.0", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-endpoint": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", + "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-bucket-endpoint": "3.693.0", - "@aws-sdk/middleware-expect-continue": "3.693.0", - "@aws-sdk/middleware-flexible-checksums": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-location-constraint": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-sdk-s3": "3.693.0", - "@aws-sdk/middleware-ssec": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/signature-v4-multi-region": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@aws-sdk/xml-builder": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/eventstream-serde-browser": "^3.0.12", - "@smithy/eventstream-serde-config-resolver": "^3.0.9", - "@smithy/eventstream-serde-node": "^3.0.11", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-blob-browser": "^3.1.8", - "@smithy/hash-node": "^3.0.9", - "@smithy/hash-stream-node": "^3.1.8", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/md5-js": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-stream": "^3.3.0", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", + "@smithy/core": "^3.7.2", + "@smithy/middleware-serde": "^4.0.8", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "@smithy/url-parser": "^4.0.4", + "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3-control/-/client-s3-control-3.859.0.tgz", - "integrity": "sha512-vzhOtDH4BCdn30+Crg1QxGXbhZIh4Ia84/qNx2EtupkM2UrO6uaZ91qGl175QWU4TcG+mlf/yA/bvrwenhbF6w==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-retry": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", + "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-node": "3.859.0", - "@aws-sdk/middleware-bucket-endpoint": "3.840.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-sdk-s3-control": "3.848.0", - "@aws-sdk/middleware-user-agent": "3.858.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.858.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.2", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-blob-browser": "^4.0.4", - "@smithy/hash-node": "^4.0.4", - "@smithy/hash-stream-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/md5-js": "^4.0.4", - "@smithy/middleware-apply-body-checksum": "^4.1.2", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-retry": "^4.1.18", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", + "@smithy/service-error-classification": "^4.0.6", "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.25", - "@smithy/util-defaults-mode-node": "^4.0.25", - "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", - "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" }, @@ -16044,87 +17805,102 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/client-sso": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.858.0.tgz", - "integrity": "sha512-iXuZQs4KH6a3Pwnt0uORalzAZ5EXRPr3lBYAsdNwkP8OYyoUz5/TE3BLyw7ceEh0rj4QKGNnNALYo1cDm0EV8w==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-serde": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", + "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.858.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.858.0", - "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.2", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-retry": "^4.1.18", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.25", - "@smithy/util-defaults-mode-node": "^4.0.25", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/core": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.858.0.tgz", - "integrity": "sha512-iWm4QLAS+/XMlnecIU1Y33qbBr1Ju+pmWam3xVCPlY4CSptKpVY+2hXOnmg9SbHAX9C005fWhrIn51oDd00c9A==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-stack": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", + "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-config-provider": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", + "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "dependencies": { + "@smithy/property-provider": "^4.0.4", + "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-http-handler": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", + "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "dependencies": { + "@smithy/abort-controller": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/querystring-builder": "^4.0.4", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/property-provider": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", + "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/protocol-http": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", + "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-builder": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", + "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.2", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", + "@smithy/util-uri-escape": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.858.0.tgz", - "integrity": "sha512-kZsGyh2BoSRguzlcGtzdLhw/l/n3KYAC+/l/H0SlsOq3RLHF6tO/cRdsLnwoix2bObChHUp03cex63o1gzdx/Q==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", + "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -16132,98 +17908,81 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.858.0.tgz", - "integrity": "sha512-GDnfYl3+NPJQ7WQQYOXEA489B212NinpcIDD7rpsB6IWUPo8yDjT5NceK4uUkIR3MFpNCGt9zd/z6NNLdB2fuQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/service-error-classification": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", + "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", + "dependencies": { + "@smithy/types": "^4.3.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", + "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.859.0.tgz", - "integrity": "sha512-KsccE1T88ZDNhsABnqbQj014n5JMDilAroUErFbGqu5/B3sXqUsYmG54C/BjvGTRUFfzyttK9lB9P9h6ddQ8Cw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/signature-v4": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", + "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/credential-provider-env": "3.858.0", - "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.859.0", - "@aws-sdk/credential-provider-web-identity": "3.858.0", - "@aws-sdk/nested-clients": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/is-array-buffer": "^4.0.0", + "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-uri-escape": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.859.0.tgz", - "integrity": "sha512-ZRDB2xU5aSyTR/jDcli30tlycu6RFvQngkZhBs9Zoh2BiYXrfh2MMuoYuZk+7uD6D53Q2RIEldDHR9A/TPlRuA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/smithy-client": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", + "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.858.0", - "@aws-sdk/credential-provider-http": "3.858.0", - "@aws-sdk/credential-provider-ini": "3.859.0", - "@aws-sdk/credential-provider-process": "3.858.0", - "@aws-sdk/credential-provider-sso": "3.859.0", - "@aws-sdk/credential-provider-web-identity": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/core": "^3.7.2", + "@smithy/middleware-endpoint": "^4.1.17", + "@smithy/middleware-stack": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", + "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.858.0.tgz", - "integrity": "sha512-l5LJWZJMRaZ+LhDjtupFUKEC5hAjgvCRrOvV5T60NCUBOy0Ozxa7Sgx3x+EOwiruuoh3Cn9O+RlbQlJX6IfZIw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/types": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", + "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.859.0.tgz", - "integrity": "sha512-BwAqmWIivhox5YlFRjManFF8GoTvEySPk6vsJNxDsmGsabY+OQovYxFIYxRCYiHzH7SFjd4Lcd+riJOiXNsvRw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/url-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", + "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", "dependencies": { - "@aws-sdk/client-sso": "3.858.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/token-providers": "3.859.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", + "@smithy/querystring-parser": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, @@ -16231,182 +17990,124 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.858.0.tgz", - "integrity": "sha512-8iULWsH83iZDdUuiDsRb83M0NqIlXjlDbJUIddVsIrfWp4NmanKw77SV6yOZ66nuJjPsn9j7RDb9bfEPCy5SWA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-base64": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", + "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/nested-clients": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz", - "integrity": "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", + "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz", - "integrity": "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", + "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-logger": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz", - "integrity": "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-buffer-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", + "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", + "@smithy/is-array-buffer": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz", - "integrity": "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-config-provider": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", + "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.858.0.tgz", - "integrity": "sha512-pC3FT/sRZ6n5NyXiTVu9dpf1D9j3YbJz3XmeOOwJqO/Mib2PZyIQktvNMPgwaC5KMVB1zWqS5bmCwxpMOnq0UQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", + "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@smithy/core": "^3.7.2", - "@smithy/protocol-http": "^5.1.2", + "@smithy/property-provider": "^4.0.4", + "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", + "bowser": "^2.11.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/nested-clients": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.858.0.tgz", - "integrity": "sha512-ChdIj80T2whoWbovmO7o8ICmhEB2S9q4Jes9MBnKAPm69PexcJAK2dQC8yI4/iUP8b3+BHZoUPrYLWjBxIProQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.0.25", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", + "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.858.0", - "@aws-sdk/middleware-host-header": "3.840.0", - "@aws-sdk/middleware-logger": "3.840.0", - "@aws-sdk/middleware-recursion-detection": "3.840.0", - "@aws-sdk/middleware-user-agent": "3.858.0", - "@aws-sdk/region-config-resolver": "3.840.0", - "@aws-sdk/types": "3.840.0", - "@aws-sdk/util-endpoints": "3.848.0", - "@aws-sdk/util-user-agent-browser": "3.840.0", - "@aws-sdk/util-user-agent-node": "3.858.0", "@smithy/config-resolver": "^4.1.4", - "@smithy/core": "^3.7.2", - "@smithy/fetch-http-handler": "^5.1.0", - "@smithy/hash-node": "^4.0.4", - "@smithy/invalid-dependency": "^4.0.4", - "@smithy/middleware-content-length": "^4.0.4", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-retry": "^4.1.18", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/middleware-stack": "^4.0.4", + "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/protocol-http": "^5.1.2", + "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.9", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.25", - "@smithy/util-defaults-mode-node": "^4.0.25", - "@smithy/util-endpoints": "^3.0.6", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz", - "integrity": "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-endpoints": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", + "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", "dependencies": { - "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/token-providers": { - "version": "3.859.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.859.0.tgz", - "integrity": "sha512-6P2wlvm9KBWOvRNn0Pt8RntnXg8fzOb5kEShvWsOsAocZeqKNaYbihum5/Onq1ZPoVtkdb++8eWDocDnM4k85Q==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-hex-encoding": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", + "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", "dependencies": { - "@aws-sdk/core": "3.858.0", - "@aws-sdk/nested-clients": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-middleware": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", + "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" @@ -16415,699 +18116,1099 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-retry": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", + "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", "dependencies": { + "@smithy/service-error-classification": "^4.0.6", + "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-endpoints": { - "version": "3.848.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz", - "integrity": "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-stream": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", + "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", "dependencies": { - "@aws-sdk/types": "3.840.0", + "@smithy/fetch-http-handler": "^5.1.0", + "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-endpoints": "^3.0.6", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-hex-encoding": "^4.0.0", + "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz", - "integrity": "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-uri-escape": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", + "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.858.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.858.0.tgz", - "integrity": "sha512-T1m05QlN8hFpx5/5duMjS8uFSK5e6EXP45HQRkZULVkL3DK+jMaxsnh3KLl5LjUoHn/19M4HM0wNUBhYp4Y2Yw==", + "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-utf8": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", + "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.858.0", - "@aws-sdk/types": "3.840.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^4.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "dependencies": { + "strnum": "^2.1.0" }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/client-s3-control/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" } + ] + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { + "version": "3.693.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.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz", - "integrity": "sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/chunked-blob-reader-native": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz", - "integrity": "sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-base64": "^4.0.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", - "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/core": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.7.2.tgz", - "integrity": "sha512-JoLw59sT5Bm8SAjFCYZyuCGxK8y3vovmoVbZWLDPTH5XpPEIwpFd9m90jjVMwoypDuB/SdVgje5Y4T7w50lJaw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.3", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/fetch-http-handler": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz", - "integrity": "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-blob-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz", - "integrity": "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ==", - "dependencies": { - "@smithy/chunked-blob-reader": "^5.0.0", - "@smithy/chunked-blob-reader-native": "^4.0.0", - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/hash-stream-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-stream-node/-/hash-stream-node-4.0.4.tgz", - "integrity": "sha512-wHo0d8GXyVmpmMh/qOR0R7Y46/G1y6OR8U+bSTB4ppEzRxd1xVAQ9xOE9hOc0bSjhz0ujCPAbfNLkLrpa6cevg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/md5-js": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-4.0.4.tgz", - "integrity": "sha512-uGLBVqcOwrLvGh/v/jw423yWHq/ofUGK1W31M2TNspLQbUV1Va0F5kTxtirkoHawODAZcjXTSGi7JwbnPcDPJg==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.17.tgz", - "integrity": "sha512-S3hSGLKmHG1m35p/MObQCBCdRsrpbPU8B129BVzRqRfDvQqPMQ14iO4LyRw+7LNizYc605COYAcjqgawqi+6jA==", - "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", - "tslib": "^2.6.2" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-retry": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.18.tgz", - "integrity": "sha512-bYLZ4DkoxSsPxpdmeapvAKy7rM5+25gR7PGxq2iMiecmbrRGBHj9s75N74Ylg+aBiw9i5jIowC/cLU2NR0qH8w==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.6", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.6", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/node-http-handler": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz", - "integrity": "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "node_modules/@aws-sdk/client-sagemaker": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.693.0.tgz", + "integrity": "sha512-iInrrb7V9f0CRBiVCaaxCbpoBRQ5BqxX4elRYI6gE/pSDD2tPqmRfm4reahMtTUcKg1jaSGuvqJLfOpp0HTozQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "tslib": "^2.6.2" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.8", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso-oidc": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/service-error-classification": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.6.tgz", - "integrity": "sha512-RRoTDL//7xi4tn5FrN2NzH17jbgmnKidUqd4KvquT0954/i6CXXkh1884jBiunq24g9cGtPBEXlU40W6EpNOOg==", - "dependencies": { - "@smithy/types": "^4.3.1" + "node": ">=16.0.0" }, - "engines": { - "node": ">=18.0.0" + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sts": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/core": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/core": "^2.5.2", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/signature-v4": "^4.2.2", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-middleware": "^3.0.9", + "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/smithy-client": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.9.tgz", - "integrity": "sha512-mbMg8mIUAWwMmb74LoYiArP04zWElPzDoA1jVOp3or0cjlDMgoS6WTC3QXK0Vxoc9I4zdrX0tq6qsOmaIoTWEQ==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.7.2", - "@smithy/middleware-endpoint": "^4.1.17", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.3", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/util-stream": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@aws-sdk/credential-provider-env": "3.693.0", + "@aws-sdk/credential-provider-http": "3.693.0", + "@aws-sdk/credential-provider-ini": "3.693.0", + "@aws-sdk/credential-provider-process": "3.693.0", + "@aws-sdk/credential-provider-sso": "3.693.0", + "@aws-sdk/credential-provider-web-identity": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/credential-provider-imds": "^3.2.6", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/client-sso": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/token-providers": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-logger": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.25.tgz", - "integrity": "sha512-pxEWsxIsOPLfKNXvpgFHBGFC3pKYKUFhrud1kyooO9CJai6aaKDHfT10Mi5iiipPXN/JhKAu3qX9o75+X85OdQ==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@smithy/core": "^2.5.2", + "@smithy/protocol-http": "^4.1.6", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.25", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.25.tgz", - "integrity": "sha512-+w4n4hKFayeCyELZLfsSQG5mCC3TwSkmRHv4+el5CzFU8ToQpYGhpV7mrRzqlwKkntlPilT1HJy1TVeEvEjWOQ==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.9", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", + "@smithy/util-config-provider": "^3.0.0", + "@smithy/util-middleware": "^3.0.9", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/token-providers": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/property-provider": "^3.1.9", + "@smithy/shared-ini-file-loader": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-endpoints": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "@smithy/util-endpoints": "^2.1.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.692.0", + "@smithy/types": "^3.7.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-retry": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.6.tgz", - "integrity": "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg==", + "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.6", - "@smithy/types": "^4.3.1", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-stream": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz", - "integrity": "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg==", + "node_modules/@aws-sdk/client-sagemaker/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/fetch-http-handler": "^5.1.0", - "@smithy/node-http-handler": "^4.1.0", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "node_modules/@aws-sdk/client-sagemaker/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": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "node_modules/@aws-sdk/client-sagemaker/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": "^4.0.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], + "node_modules/@aws-sdk/client-sfn": { + "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.693.0.tgz", + "integrity": "sha512-B2K3aXGnP7eD1ITEIx4kO43l1N5OLqHdLW4AUbwoopwU5qzicc9jADrthXpGxymJI8AhJz9T2WtLmceBU2EpNg==", + "license": "Apache-2.0", "dependencies": { - "strnum": "^2.1.0" + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.693.0", + "@aws-sdk/client-sts": "3.693.0", + "@aws-sdk/core": "3.693.0", + "@aws-sdk/credential-provider-node": "3.693.0", + "@aws-sdk/middleware-host-header": "3.693.0", + "@aws-sdk/middleware-logger": "3.693.0", + "@aws-sdk/middleware-recursion-detection": "3.693.0", + "@aws-sdk/middleware-user-agent": "3.693.0", + "@aws-sdk/region-config-resolver": "3.693.0", + "@aws-sdk/types": "3.692.0", + "@aws-sdk/util-endpoints": "3.693.0", + "@aws-sdk/util-user-agent-browser": "3.693.0", + "@aws-sdk/util-user-agent-node": "3.693.0", + "@smithy/config-resolver": "^3.0.11", + "@smithy/core": "^2.5.2", + "@smithy/fetch-http-handler": "^4.1.0", + "@smithy/hash-node": "^3.0.9", + "@smithy/invalid-dependency": "^3.0.9", + "@smithy/middleware-content-length": "^3.0.11", + "@smithy/middleware-endpoint": "^3.2.2", + "@smithy/middleware-retry": "^3.0.26", + "@smithy/middleware-serde": "^3.0.9", + "@smithy/middleware-stack": "^3.0.9", + "@smithy/node-config-provider": "^3.1.10", + "@smithy/node-http-handler": "^3.3.0", + "@smithy/protocol-http": "^4.1.6", + "@smithy/smithy-client": "^3.4.3", + "@smithy/types": "^3.7.0", + "@smithy/url-parser": "^3.0.9", + "@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.26", + "@smithy/util-defaults-mode-node": "^3.0.26", + "@smithy/util-endpoints": "^2.1.5", + "@smithy/util-middleware": "^3.0.9", + "@smithy/util-retry": "^3.0.9", + "@smithy/util-utf8": "^3.0.0", + "@types/uuid": "^9.0.1", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, - "bin": { - "fxparser": "src/cli/cli.js" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3-control/node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ] - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", + "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -17153,8 +19254,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", + "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -17204,8 +19307,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", + "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -17253,8 +19358,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/core": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", + "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17273,8 +19380,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", + "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17292,8 +19401,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", + "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17316,8 +19427,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", + "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.693.0", @@ -17337,8 +19450,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", + "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.693.0", @@ -17354,8 +19469,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", + "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17371,8 +19488,10 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", + "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17384,8 +19503,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", + "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17396,8 +19517,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", + "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17409,8 +19532,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", + "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17425,8 +19550,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", + "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17440,8 +19567,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", + "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17457,8 +19586,10 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", + "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17470,8 +19601,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", + "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17480,8 +19613,10 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", + "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "3.693.0", @@ -17502,8 +19637,10 @@ } } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-sfn/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" @@ -17512,8 +19649,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-sfn/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", @@ -17523,8 +19662,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-sfn/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", @@ -17534,10 +19675,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker": { + "node_modules/@aws-sdk/client-ssm": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sagemaker/-/client-sagemaker-3.693.0.tgz", - "integrity": "sha512-iInrrb7V9f0CRBiVCaaxCbpoBRQ5BqxX4elRYI6gE/pSDD2tPqmRfm4reahMtTUcKg1jaSGuvqJLfOpp0HTozQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -17589,10 +19728,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", - "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -17638,10 +19775,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso-oidc": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", - "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -17691,10 +19826,8 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sts": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", - "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -17742,10 +19875,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/core": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", - "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17764,10 +19895,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-http": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", - "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17785,10 +19914,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", - "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17811,10 +19938,8 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-node": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", - "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.693.0", @@ -17834,10 +19959,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", - "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-sso": "3.693.0", @@ -17853,10 +19976,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", - "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17872,10 +19993,8 @@ "@aws-sdk/client-sts": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-host-header": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", - "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17887,10 +20006,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-logger": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", - "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17901,10 +20018,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", - "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17916,10 +20031,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", - "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.693.0", @@ -17934,10 +20047,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/region-config-resolver": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", - "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17951,10 +20062,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", - "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17970,10 +20079,8 @@ "@aws-sdk/client-sso-oidc": "^3.693.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", - "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17985,10 +20092,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", - "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.692.0", @@ -17997,10 +20102,8 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", - "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/middleware-user-agent": "3.693.0", @@ -18021,10 +20124,8 @@ } } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/is-array-buffer": { + "node_modules/@aws-sdk/client-ssm/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" @@ -18033,10 +20134,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-buffer-from": { + "node_modules/@aws-sdk/client-ssm/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", @@ -18046,10 +20145,8 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sagemaker/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-ssm/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", @@ -18059,1389 +20156,1444 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sfn/-/client-sfn-3.693.0.tgz", - "integrity": "sha512-B2K3aXGnP7eD1ITEIx4kO43l1N5OLqHdLW4AUbwoopwU5qzicc9jADrthXpGxymJI8AhJz9T2WtLmceBU2EpNg==", + "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/client-sso-oidc": "3.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", + "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", + "@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", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.693.0.tgz", - "integrity": "sha512-QEynrBC26x6TG9ZMzApR/kZ3lmt4lEIs2D+cHuDxt6fDGzahBUsQFBwJqhizzsM97JJI5YvmJhmihoYjdSSaXA==", + "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.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", + "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", + "@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-sfn/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.693.0.tgz", - "integrity": "sha512-UEDbYlYtK/e86OOMyFR4zEPyenIxDzO2DRdz3fwVW7RzZ94wfmSwBh/8skzPTuY1G7sI064cjHW0b0QG01Sdtg==", + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/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/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/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", + "@smithy/util-base64": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.637.0", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", + "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", + "@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.693.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.693.0.tgz", - "integrity": "sha512-4S2y7VEtvdnjJX4JPl4kDQlslxXEZFnC50/UXVUYSt/AMc5A/GgspFNA5FVz4E3Gwpfobbf23hR2NBF8AGvYoQ==", + "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { + "version": "3.609.0", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^3.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { + "version": "3.2.4", "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.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", + "@smithy/protocol-http": "^4.1.0", + "@smithy/querystring-builder": "^3.0.3", + "@smithy/types": "^3.3.0", "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { + "version": "3.0.0", + "license": "Apache-2.0", + "dependencies": { "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/core": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.693.0.tgz", - "integrity": "sha512-v6Z/kWmLFqRLDPEwl9hJGhtTgIFHjZugSfF1Yqffdxf4n1AWgtHS7qSegakuMyN5pP4K2tvUD8qHJ+gGe2Bw2A==", + "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8": { + "version": "3.0.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.693.0.tgz", - "integrity": "sha512-sL8MvwNJU7ZpD7/d2VVb3by1GknIJUxzTIgYtVkDVA/ojo+KRQSSHxcj0EWWXF5DTSh2Tm+LrEug3y1ZyKHsDA==", + "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/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.693.0.tgz", - "integrity": "sha512-kvaa4mXhCCOuW7UQnBhYqYfgWmwy7WSBSDClutwSLPZvgrhYj2l16SD2lN4IfYdxARYMJJ1lFYp3/jJG/9Yk4Q==", + "node_modules/@aws-sdk/core": { + "version": "3.635.0", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@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-cognito-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.936.0.tgz", + "integrity": "sha512-+aSC59yiD4M5RcYp9Gx3iwX/n4hO3ZWA2Mxmkzmt9gYFBbJ9umx2LpBdrV64y57AtOvfGeo0h7PAXniIufagxw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-cognito-identity": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.693.0.tgz", - "integrity": "sha512-42WMsBjTNnjYxYuM3qD/Nq+8b7UdMopUq5OduMDxoM3mFTV6PXMMnfI4Z1TNnR4tYRvPXAnuNltF6xmjKbSJRA==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.936.0.tgz", + "integrity": "sha512-AkJZ426y0G8Lsyi9p7mWudacMKeo8XLZOfxUmeThMkDa3GxGQ1y6BTrOj6ZcvqQ1Hz7Abb3QWPC+EMqhu1Lncw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-node": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.693.0.tgz", - "integrity": "sha512-479UlJxY+BFjj3pJFYUNC0DCMrykuG7wBAXfsvZqQxKUa83DnH5Q1ID/N2hZLkxjGd4ZW0AC3lTOMxFelGzzpQ==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/client-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", + "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.693.0.tgz", - "integrity": "sha512-8LB210Pr6VeCiSb2hIra+sAH4KUBLyGaN50axHtIgufVK8jbKIctTZcVY5TO9Se+1107TsruzeXS7VeqVdJfFA==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/core": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", + "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", + "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.693.0.tgz", - "integrity": "sha512-BCki6sAZ5jYwIN/t3ElCiwerHad69ipHwPsDCxJQyeiOnJ8HG+lEpnVIfrnI8A0fLQNSF3Gtx6ahfBpKiv1Oug==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", + "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.693.0.tgz", - "integrity": "sha512-dXnXDPr+wIiJ1TLADACI1g9pkSB21KkMIko2u4CJ2JCBoxi5IqeTnVoa6YcC8GdFNVRl+PorZ3Zqfmf1EOTC6w==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", + "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-login": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.693.0.tgz", - "integrity": "sha512-0LDmM+VxXp0u3rG0xQRWD/q6Ubi7G8I44tBPahevD5CaiDZTkmNTrVUf0VEJgVe0iCKBppACMBDkLB0/ETqkFw==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", + "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-ini": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.693.0.tgz", - "integrity": "sha512-/KUq/KEpFFbQmNmpp7SpAtFAdViquDfD2W0QcG07zYBfz9MwE2ig48ALynXm5sMpRmnG7sJXjdvPtTsSVPfkiw==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", + "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.693.0.tgz", - "integrity": "sha512-YLUkMsUY0GLW/nfwlZ69cy1u07EZRmsv8Z9m0qW317/EZaVx59hcvmcvb+W4bFqj5E8YImTjoGfE4cZ0F9mkyw==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", + "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@aws-sdk/client-sso": "3.936.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/token-providers": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.693.0.tgz", - "integrity": "sha512-nDBTJMk1l/YmFULGfRbToOA2wjf+FkQT4dMgYCv+V9uSYsMzQj8A7Tha2dz9yv4vnQgYaEiErQ8d7HVyXcVEoA==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", + "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", + "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.693.0.tgz", - "integrity": "sha512-eo4F6DRQ/kxS3gxJpLRv+aDNy76DxQJL5B3DPzpr9Vkq0ygVoi4GT5oIZLVaAVIJmi6k5qq9dLsYZfWLUxJJSg==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-logger": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", + "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.693.0.tgz", - "integrity": "sha512-6EUfuKOujtddy18OLJUaXfKBgs+UcbZ6N/3QV4iOkubCUdeM1maIqs++B9bhCbWeaeF5ORizJw5FTwnyNjE/mw==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", + "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", + "@aws-sdk/types": "3.936.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.693.0.tgz", - "integrity": "sha512-td0OVX8m5ZKiXtecIDuzY3Y3UZIzvxEr57Hp21NOwieqKCG2UeyQWWeGPv0FQaU7dpTkvFmVNI+tx9iB8V/Nhg==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", + "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/nested-clients": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", + "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/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==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", + "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", "license": "Apache-2.0", "dependencies": { + "@aws-sdk/types": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/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==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/token-providers": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", + "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sfn/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==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", + "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-endpoints": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", + "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", "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.693.0", - "@aws-sdk/client-sts": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.8", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", + "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", + "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", + "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", "license": "Apache-2.0", "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sts": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", "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.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-node": "3.693.0", - "@aws-sdk/middleware-host-header": "3.693.0", - "@aws-sdk/middleware-logger": "3.693.0", - "@aws-sdk/middleware-recursion-detection": "3.693.0", - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/region-config-resolver": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@aws-sdk/util-user-agent-browser": "3.693.0", - "@aws-sdk/util-user-agent-node": "3.693.0", - "@smithy/config-resolver": "^3.0.11", - "@smithy/core": "^2.5.2", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/hash-node": "^3.0.9", - "@smithy/invalid-dependency": "^3.0.9", - "@smithy/middleware-content-length": "^3.0.11", - "@smithy/middleware-endpoint": "^3.2.2", - "@smithy/middleware-retry": "^3.0.26", - "@smithy/middleware-serde": "^3.0.9", - "@smithy/middleware-stack": "^3.0.9", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/url-parser": "^3.0.9", - "@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.26", - "@smithy/util-defaults-mode-node": "^3.0.26", - "@smithy/util-endpoints": "^2.1.5", - "@smithy/util-middleware": "^3.0.9", - "@smithy/util-retry": "^3.0.9", - "@smithy/util-utf8": "^3.0.0", + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/core": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz", + "integrity": "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==", "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/core": "^2.5.2", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/signature-v4": "^4.2.2", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-middleware": "^3.0.9", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/fetch-http-handler": "^4.1.0", - "@smithy/node-http-handler": "^3.3.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/protocol-http": "^4.1.6", - "@smithy/smithy-client": "^3.4.3", - "@smithy/types": "^3.7.0", - "@smithy/util-stream": "^3.3.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/core": { + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", + "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.693.0", - "@aws-sdk/credential-provider-http": "3.693.0", - "@aws-sdk/credential-provider-ini": "3.693.0", - "@aws-sdk/credential-provider-process": "3.693.0", - "@aws-sdk/credential-provider-sso": "3.693.0", - "@aws-sdk/credential-provider-web-identity": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/credential-provider-imds": "^3.2.6", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.693.0", - "@aws-sdk/core": "3.693.0", - "@aws-sdk/token-providers": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/types": "^3.7.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-logger": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/is-array-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@aws-sdk/util-endpoints": "3.693.0", - "@smithy/core": "^2.5.2", - "@smithy/protocol-http": "^4.1.6", - "@smithy/types": "^3.7.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", + "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.9", + "@smithy/core": "^3.18.5", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-retry": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", + "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/property-provider": "^3.1.9", - "@smithy/shared-ini-file-loader": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.693.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "@smithy/util-endpoints": "^2.1.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.693.0", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.692.0", - "@smithy/types": "^3.7.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.693.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.693.0", - "@aws-sdk/types": "3.692.0", - "@smithy/node-config-provider": "^3.1.10", - "@smithy/types": "^3.7.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", "license": "Apache-2.0", "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", "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", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", "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", + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", "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" + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/smithy-client": { + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", + "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", + "@smithy/core": "^3.18.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", "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/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-base64": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", "license": "Apache-2.0", "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-body-length-browser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-body-length-node": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-buffer-from": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", "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", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/types": { - "version": "3.609.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-config-provider": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", + "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", "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/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", + "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", "license": "Apache-2.0", "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8/node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-hex-encoding": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/core": { - "version": "3.635.0", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", "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", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.730.0.tgz", - "integrity": "sha512-Ynp67VkpaaFubqPrqGxLbg5XuS+QTjR7JVhZvjNO6Su4tQVKBFSfQpDIXTyggD9UVixXy4NB9cqg30uvebDeiw==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-uri-escape": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/@smithy/util-utf8": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", "dependencies": { + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/credential-provider-cognito-identity/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@aws-sdk/credential-provider-env": { "version": "3.693.0", "license": "Apache-2.0", @@ -21767,25 +23919,80 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.730.0.tgz", - "integrity": "sha512-Z25yfmHOehgIDVyY8h7GmAEbodHD2iLgNmrBBkkJXCE6d4GwDet3Qeyw4bQPPyuycBtYOUiz5Oco03+YGOEhYA==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.936.0.tgz", + "integrity": "sha512-RWiX6wuReeEU7/P7apGwWMNO7nrai/CXmMMaho3+pJW7i6ImosgsjSe5tetdv1r4djOtM1b4J4WAbHPKJUahUg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-cognito-identity": "3.730.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/credential-provider-cognito-identity": "3.730.0", - "@aws-sdk/credential-provider-env": "3.730.0", - "@aws-sdk/credential-provider-http": "3.730.0", - "@aws-sdk/credential-provider-ini": "3.730.0", - "@aws-sdk/credential-provider-node": "3.730.0", - "@aws-sdk/credential-provider-process": "3.730.0", - "@aws-sdk/credential-provider-sso": "3.730.0", - "@aws-sdk/credential-provider-web-identity": "3.730.0", - "@aws-sdk/nested-clients": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/credential-provider-imds": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/client-cognito-identity": "3.936.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-cognito-identity": "3.936.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-ini": "3.936.0", + "@aws-sdk/credential-provider-login": "3.936.0", + "@aws-sdk/credential-provider-node": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-cognito-identity": { + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.936.0.tgz", + "integrity": "sha512-AkJZ426y0G8Lsyi9p7mWudacMKeo8XLZOfxUmeThMkDa3GxGQ1y6BTrOj6ZcvqQ1Hz7Abb3QWPC+EMqhu1Lncw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-node": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -21793,47 +24000,48 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/client-sso": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.730.0.tgz", - "integrity": "sha512-mI8kqkSuVlZklewEmN7jcbBMyVODBld3MsTjCKSl5ztduuPX69JD7nXLnWWPkw1PX4aGTO24AEoRMGNxntoXUg==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.936.0.tgz", + "integrity": "sha512-0G73S2cDqYwJVvqL08eakj79MZG2QRaB56Ul8/Ps9oQxllr7DMI1IQ/N3j3xjxgpq/U36pkoFZ8aK1n7Sbr3IQ==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/middleware-host-header": "3.723.0", - "@aws-sdk/middleware-logger": "3.723.0", - "@aws-sdk/middleware-recursion-detection": "3.723.0", - "@aws-sdk/middleware-user-agent": "3.730.0", - "@aws-sdk/region-config-resolver": "3.723.0", - "@aws-sdk/types": "3.723.0", - "@aws-sdk/util-endpoints": "3.730.0", - "@aws-sdk/util-user-agent-browser": "3.723.0", - "@aws-sdk/util-user-agent-node": "3.730.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -21841,20 +24049,23 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/core": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.730.0.tgz", - "integrity": "sha512-jonKyR+2GcqbZj2WDICZS0c633keLc9qwXnePu83DfAoFXMMIMyoR/7FOGf8F3OrIdGh8KzE9VvST+nZCK9EJA==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.936.0.tgz", + "integrity": "sha512-eGJ2ySUMvgtOziHhDRDLCrj473RJoL4J1vPjVM3NrKC/fF3/LoHjkut8AAnKmrW6a2uTzNKubigw8dEnpmpERw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/core": "^3.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/signature-v4": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", - "fast-xml-parser": "4.4.1", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -21862,14 +24073,15 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.730.0.tgz", - "integrity": "sha512-fFXgo3jBXLWqu8I07Hd96mS7RjrtpDgm3bZShm0F3lKtqDQF+hObFWq9A013SOE+RjMLVfbABhToXAYct3FcBw==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.936.0.tgz", + "integrity": "sha512-dKajFuaugEA5i9gCKzOaVy9uTeZcApE+7Z5wdcZ6j40523fY1a56khDAUYkCfwqa7sHci4ccmxBkAo+fW1RChA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -21877,19 +24089,20 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.730.0.tgz", - "integrity": "sha512-1aF3elbCzpVhWLAuV63iFElfLOqLGGTp4fkf2VAFIDO3hjshpXUQssTgIWiBwwtJYJdOSxaFrCU7u8frjr/5aQ==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.936.0.tgz", + "integrity": "sha512-5FguODLXG1tWx/x8fBxH+GVrk7Hey2LbXV5h9SFzYCx/2h50URBm0+9hndg0Rd23+xzYe14F6SI9HA9c1sPnjg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-stream": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { @@ -21897,22 +24110,24 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.730.0.tgz", - "integrity": "sha512-zwsxkBuQuPp06o45ATAnznHzj3+ibop/EaTytNzSv0O87Q59K/jnS/bdtv1n6bhe99XCieRNTihvtS7YklzK7A==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.936.0.tgz", + "integrity": "sha512-TbUv56ERQQujoHcLMcfL0Q6bVZfYF83gu/TjHkVkdSlHPOIKaG/mhE2XZSQzXv1cud6LlgeBbfzVAxJ+HPpffg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/credential-provider-env": "3.730.0", - "@aws-sdk/credential-provider-http": "3.730.0", - "@aws-sdk/credential-provider-process": "3.730.0", - "@aws-sdk/credential-provider-sso": "3.730.0", - "@aws-sdk/credential-provider-web-identity": "3.730.0", - "@aws-sdk/nested-clients": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/credential-provider-imds": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-login": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -21920,21 +24135,22 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.730.0.tgz", - "integrity": "sha512-ztRjh1edY7ut2wwrj1XqHtqPY/NXEYIk5fYf04KKsp8zBi81ScVqP7C+Cst6PFKixjgLSG6RsqMx9GSAalVv0Q==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.936.0.tgz", + "integrity": "sha512-rk/2PCtxX9xDsQW8p5Yjoca3StqmQcSfkmD7nQ61AqAHL1YgpSQWqHE+HjfGGiHDYKG7PvE33Ku2GyA7lEIJAw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.730.0", - "@aws-sdk/credential-provider-http": "3.730.0", - "@aws-sdk/credential-provider-ini": "3.730.0", - "@aws-sdk/credential-provider-process": "3.730.0", - "@aws-sdk/credential-provider-sso": "3.730.0", - "@aws-sdk/credential-provider-web-identity": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/credential-provider-imds": "^4.0.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/credential-provider-env": "3.936.0", + "@aws-sdk/credential-provider-http": "3.936.0", + "@aws-sdk/credential-provider-ini": "3.936.0", + "@aws-sdk/credential-provider-process": "3.936.0", + "@aws-sdk/credential-provider-sso": "3.936.0", + "@aws-sdk/credential-provider-web-identity": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -21942,15 +24158,16 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.730.0.tgz", - "integrity": "sha512-cNKUQ81eptfZN8MlSqwUq3+5ln8u/PcY57UmLZ+npxUHanqO1akpgcpNsLpmsIkoXGbtSQrLuDUgH86lS/SWOw==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.936.0.tgz", + "integrity": "sha512-GpA4AcHb96KQK2PSPUyvChvrsEKiLhQ5NWjeef2IZ3Jc8JoosiedYqp6yhZR+S8cTysuvx56WyJIJc8y8OTrLA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -21958,17 +24175,18 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.730.0.tgz", - "integrity": "sha512-SdI2xrTbquJLMxUh5LpSwB8zfiKq3/jso53xWRgrVfeDlrSzZuyV6QghaMs3KEEjcNzwEnTfSIjGQyRXG9VrEw==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.936.0.tgz", + "integrity": "sha512-wHlEAJJvtnSyxTfNhN98JcU4taA1ED2JvuI2eePgawqBwS/Tzi0mhED1lvNIaWOkjfLd+nHALwszGrtJwEq4yQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.730.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/token-providers": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/client-sso": "3.936.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/token-providers": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -21976,15 +24194,17 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.730.0.tgz", - "integrity": "sha512-l5vdPmvF/d890pbvv5g1GZrdjaSQkyPH/Bc8dO/ZqkWxkIP8JNgl48S2zgf4DkP3ik9K2axWO828L5RsMDQzdA==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.936.0.tgz", + "integrity": "sha512-v3qHAuoODkoRXsAF4RG+ZVO6q2P9yYBT4GMpMEfU9wXVNn7AIfwZgTwzSUfnjNiGva5BKleWVpRpJ9DeuLFbUg==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/nested-clients": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -21992,13 +24212,14 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.723.0.tgz", - "integrity": "sha512-LLVzLvk299pd7v4jN9yOSaWDZDfH0SnBPb6q+FDPaOCMGBY8kuwQso7e/ozIKSmZHRMGO3IZrflasHM+rI+2YQ==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.936.0.tgz", + "integrity": "sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.936.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22006,12 +24227,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-logger": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.723.0.tgz", - "integrity": "sha512-chASQfDG5NJ8s5smydOEnNK7N0gDMyuPbx7dYYcm1t/PKtnVfvWF+DHCTrRC2Ej76gLJVCVizlAJKM8v8Kg3cg==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.936.0.tgz", + "integrity": "sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22019,13 +24241,15 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.723.0.tgz", - "integrity": "sha512-7usZMtoynT9/jxL/rkuDOFQ0C2mhXl4yCm67Rg7GNTstl67u7w5WN1aIRImMeztaKlw8ExjoTyo6WTs1Kceh7A==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.936.0.tgz", + "integrity": "sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.936.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22033,16 +24257,17 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.730.0.tgz", - "integrity": "sha512-aPMZvNmf2a42B41au3bA3ODU4HfHka2nYT/SAIhhVXH1ENYfAmZo7FraFPxetKepFMCtL7j4QE6/LDucK6liIw==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.936.0.tgz", + "integrity": "sha512-YB40IPa7K3iaYX0lSnV9easDOLPLh+fJyUDF3BH8doX4i1AOSsYn86L4lVldmOaSX+DwiaqKHpvk4wPBdcIPWw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@aws-sdk/util-endpoints": "3.730.0", - "@smithy/core": "^3.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@smithy/core": "^3.18.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22050,47 +24275,48 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/nested-clients": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.730.0.tgz", - "integrity": "sha512-vilIgf1/7kre8DdE5zAQkDOwHFb/TahMn/6j2RZwFLlK7cDk91r19deSiVYnKQkupDMtOfNceNqnorM4I3PDzw==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.936.0.tgz", + "integrity": "sha512-eyj2tz1XmDSLSZQ5xnB7cLTVKkSJnYAEoNDSUNhzWPxrBDYeJzIbatecOKceKCU8NBf8gWWZCK/CSY0mDxMO0A==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.730.0", - "@aws-sdk/middleware-host-header": "3.723.0", - "@aws-sdk/middleware-logger": "3.723.0", - "@aws-sdk/middleware-recursion-detection": "3.723.0", - "@aws-sdk/middleware-user-agent": "3.730.0", - "@aws-sdk/region-config-resolver": "3.723.0", - "@aws-sdk/types": "3.723.0", - "@aws-sdk/util-endpoints": "3.730.0", - "@aws-sdk/util-user-agent-browser": "3.723.0", - "@aws-sdk/util-user-agent-node": "3.730.0", - "@smithy/config-resolver": "^4.0.0", - "@smithy/core": "^3.0.0", - "@smithy/fetch-http-handler": "^5.0.0", - "@smithy/hash-node": "^4.0.0", - "@smithy/invalid-dependency": "^4.0.0", - "@smithy/middleware-content-length": "^4.0.0", - "@smithy/middleware-endpoint": "^4.0.0", - "@smithy/middleware-retry": "^4.0.0", - "@smithy/middleware-serde": "^4.0.0", - "@smithy/middleware-stack": "^4.0.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/node-http-handler": "^4.0.0", - "@smithy/protocol-http": "^5.0.0", - "@smithy/smithy-client": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/url-parser": "^4.0.0", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.0", - "@smithy/util-defaults-mode-node": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", - "@smithy/util-middleware": "^4.0.0", - "@smithy/util-retry": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/middleware-host-header": "3.936.0", + "@aws-sdk/middleware-logger": "3.936.0", + "@aws-sdk/middleware-recursion-detection": "3.936.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/region-config-resolver": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@aws-sdk/util-endpoints": "3.936.0", + "@aws-sdk/util-user-agent-browser": "3.936.0", + "@aws-sdk/util-user-agent-node": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.5", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-retry": "^4.4.12", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.11", + "@smithy/util-defaults-mode-node": "^4.2.14", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -22098,15 +24324,15 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.723.0.tgz", - "integrity": "sha512-tGF/Cvch3uQjZIj34LY2mg8M2Dr4kYG8VU8Yd0dFnB1ybOEOveIK/9ypUo9ycZpB9oO6q01KRe5ijBaxNueUQg==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.936.0.tgz", + "integrity": "sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/types": "^4.0.0", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.0", + "@aws-sdk/types": "3.936.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22114,15 +24340,17 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/token-providers": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.730.0.tgz", - "integrity": "sha512-BSPssGj54B/AABWXARIPOT/1ybFahM1ldlfmXy9gRmZi/afe9geWJGlFYCCt3PmqR+1Ny5XIjSfue+kMd//drQ==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.936.0.tgz", + "integrity": "sha512-vvw8+VXk0I+IsoxZw0mX9TMJawUJvEsg3EF7zcCSetwhNPAU8Xmlhv7E/sN/FgSmm7b7DsqKoW6rVtQiCs1PWQ==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/nested-clients": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/property-provider": "^4.0.0", - "@smithy/shared-ini-file-loader": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/core": "3.936.0", + "@aws-sdk/nested-clients": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22130,11 +24358,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/types": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.723.0.tgz", - "integrity": "sha512-LmK3kwiMZG1y5g3LGihT9mNkeNOmwEyPk6HGcJqh0wOSV4QpWoKu2epyKE4MLQNUUlz2kOVbVbOrwmI6ZcteuA==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.936.0.tgz", + "integrity": "sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.0.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22142,13 +24371,15 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-endpoints": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.730.0.tgz", - "integrity": "sha512-1KTFuVnk+YtLgWr6TwDiggcDqtPpOY2Cszt3r2lkXfaEAX6kHyOZi1vdvxXjPU5LsOBJem8HZ7KlkmrEi+xowg==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.936.0.tgz", + "integrity": "sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/types": "^4.0.0", - "@smithy/util-endpoints": "^3.0.0", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", "tslib": "^2.6.2" }, "engines": { @@ -22156,45 +24387,71 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.723.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.723.0.tgz", - "integrity": "sha512-Wh9I6j2jLhNFq6fmXydIpqD1WyQLyTfSxjW9B+PXSnPyk3jtQW8AKQur7p97rO8LAUzVI0bv8kb3ZzDEVbquIg==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.936.0.tgz", + "integrity": "sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.723.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/types": "3.936.0", + "@smithy/types": "^4.9.0", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.730.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.730.0.tgz", - "integrity": "sha512-yBvkOAjqsDEl1va4eHNOhnFBk0iCY/DBFNyhvtTMqPF4NO+MITWpFs3J9JtZKzJlQ6x0Yb9TLQ8NhDjEISz5Ug==", + "version": "3.936.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.936.0.tgz", + "integrity": "sha512-XOEc7PF9Op00pWV2AYCGDSu5iHgYjIO53Py2VUQTIvP7SRCaCsXmA33mjBvC2Ms6FhSyWNa4aK4naUGIz0hQcw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.730.0", - "@aws-sdk/types": "3.723.0", - "@smithy/node-config-provider": "^4.0.0", - "@smithy/types": "^4.0.0", + "@aws-sdk/middleware-user-agent": "3.936.0", + "@aws-sdk/types": "3.936.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.1.tgz", + "integrity": "sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/abort-controller": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.4.tgz", - "integrity": "sha512-gJnEjZMvigPDQWHrW3oPrFhQtkrgqBkyjj3pCIdF3A5M6vsZODG93KNlfJprv6bp4245bdT32fsHK4kkH3KYDA==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22202,14 +24459,16 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/config-resolver": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.4.tgz", - "integrity": "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { @@ -22217,18 +24476,20 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/core": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.5.3.tgz", - "integrity": "sha512-xa5byV9fEguZNofCclv6v9ra0FYh5FATQW/da7FQUVTic94DfrN/NvmKZjrMyzbpqfot9ZjBaO8U1UeTbmSLuA==", + "version": "3.18.5", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.5.tgz", + "integrity": "sha512-6gnIz3h+PEPQGDj8MnRSjDvKBah042jEoPgjFGJ4iJLBE78L4lY/n98x14XyPF4u3lN179Ub/ZKFY5za9GeLQw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.0.8", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-stream": "^4.2.2", - "@smithy/util-utf8": "^4.0.0", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, "engines": { @@ -22236,14 +24497,15 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/credential-provider-imds": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz", - "integrity": "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", "tslib": "^2.6.2" }, "engines": { @@ -22251,14 +24513,15 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/fetch-http-handler": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz", - "integrity": "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, "engines": { @@ -22266,13 +24529,14 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/hash-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.4.tgz", - "integrity": "sha512-qnbTPUhCVnCgBp4z4BUJUhOEkVwxiEi1cyFM+Zj6o+aY8OFGxUQleKWq8ltgp3dujuhXojIvJWdoqpm6dVO3lQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -22280,11 +24544,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/invalid-dependency": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.4.tgz", - "integrity": "sha512-bNYMi7WKTJHu0gn26wg8OscncTt1t2b8KcsZxvOv56XA6cyXtOAAAaNP7+m45xfppXfOatXF3Sb1MNsLUgVLTw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22292,9 +24557,10 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.0.tgz", + "integrity": "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -22303,12 +24569,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-content-length": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.4.tgz", - "integrity": "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22316,17 +24583,18 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-endpoint": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.11.tgz", - "integrity": "sha512-zDogwtRLzKl58lVS8wPcARevFZNBOOqnmzWWxVe9XiaXU2CADFjvJ9XfNibgkOWs08sxLuSr81NrpY4mgp9OwQ==", + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.12.tgz", + "integrity": "sha512-9pAX/H+VQPzNbouhDhkW723igBMLgrI8OtX+++M7iKJgg/zY/Ig3i1e6seCcx22FWhE6Q/S61BRdi2wXBORT+A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.5.3", - "@smithy/middleware-serde": "^4.0.8", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", - "@smithy/url-parser": "^4.0.4", - "@smithy/util-middleware": "^4.0.4", + "@smithy/core": "^3.18.5", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", "tslib": "^2.6.2" }, "engines": { @@ -22334,31 +24602,33 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-retry": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.12.tgz", - "integrity": "sha512-wvIH70c4e91NtRxdaLZF+mbLZ/HcC6yg7ySKUiufL6ESp6zJUSnJucZ309AvG9nqCFHSRB5I6T3Ez1Q9wCh0Ww==", + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.12.tgz", + "integrity": "sha512-S4kWNKFowYd0lID7/DBqWHOQxmxlsf0jBaos9chQZUWTVOjSW1Ogyh8/ib5tM+agFDJ/TCxuCTvrnlc+9cIBcQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/protocol-http": "^5.1.2", - "@smithy/service-error-classification": "^4.0.5", - "@smithy/smithy-client": "^4.4.3", - "@smithy/types": "^4.3.1", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-retry": "^4.0.5", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-serde": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.8.tgz", - "integrity": "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22366,11 +24636,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/middleware-stack": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.4.tgz", - "integrity": "sha512-kagK5ggDrBUCCzI93ft6DjteNSfY8Ulr83UtySog/h09lTIOAJ/xUSObutanlPT0nhoHAkpmW9V5K8oPyLh+QA==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22378,13 +24649,14 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-config-provider": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.3.tgz", - "integrity": "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/shared-ini-file-loader": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22392,14 +24664,15 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/node-http-handler": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz", - "integrity": "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/querystring-builder": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22407,11 +24680,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/property-provider": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz", - "integrity": "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22419,11 +24693,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/protocol-http": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.2.tgz", - "integrity": "sha512-rOG5cNLBXovxIrICSBm95dLqzfvxjEmuZx4KK3hWwPFHGdW3lxY0fZNXfv2zebfRO7sJZ5pKJYHScsqopeIWtQ==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22431,12 +24706,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-builder": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.4.tgz", - "integrity": "sha512-SwREZcDnEYoh9tLNgMbpop+UTGq44Hl9tdj3rf+yeLcfH7+J8OXEBaMc2kDxtyRHu8BhSg9ADEx0gFHvpJgU8w==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", - "@smithy/util-uri-escape": "^4.0.0", + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -22444,11 +24720,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/querystring-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.4.tgz", - "integrity": "sha512-6yZf53i/qB8gRHH/l2ZwUG5xgkPgQF15/KxH0DdXMDHjesA9MeZje/853ifkSY0x4m5S+dfDZ+c4x439PF0M2w==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22456,22 +24733,24 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/service-error-classification": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.5.tgz", - "integrity": "sha512-LvcfhrnCBvCmTee81pRlh1F39yTS/+kYleVeLCwNtkY8wtGg8V/ca9rbZZvYIl8OjlMtL6KIjaiL/lgVqHD2nA==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1" + "@smithy/types": "^4.9.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.4.tgz", - "integrity": "sha512-63X0260LoFBjrHifPDs+nM9tV0VMkOTl4JRMYNuKh/f5PauSjowTfvF3LogfkWdcPoxsA9UjqEOgjeYIbhb7Nw==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22479,17 +24758,18 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/signature-v4": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.2.tgz", - "integrity": "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ==", + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -22497,16 +24777,17 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/smithy-client": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.3.tgz", - "integrity": "sha512-xxzNYgA0HD6ETCe5QJubsxP0hQH3QK3kbpJz3QrosBCuIWyEXLR/CO5hFb2OeawEKUxMNhz3a1nuJNN2np2RMA==", + "version": "4.9.8", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.8.tgz", + "integrity": "sha512-8xgq3LgKDEFoIrLWBho/oYKyWByw9/corz7vuh1upv7ZBm0ZMjGYBhbn6v643WoIqA9UTcx5A5htEp/YatUwMA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.5.3", - "@smithy/middleware-endpoint": "^4.1.11", - "@smithy/middleware-stack": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/types": "^4.3.1", - "@smithy/util-stream": "^4.2.2", + "@smithy/core": "^3.18.5", + "@smithy/middleware-endpoint": "^4.3.12", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", "tslib": "^2.6.2" }, "engines": { @@ -22514,9 +24795,10 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/types": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz", - "integrity": "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -22525,12 +24807,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/url-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.4.tgz", - "integrity": "sha512-eMkc144MuN7B0TDA4U2fKs+BqczVbk3W+qIvcoCY6D1JY3hnAdCuhCZODC+GAeaxj0p6Jroz4+XMUn3PCxQQeQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.0.4", - "@smithy/types": "^4.3.1", + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22538,12 +24821,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.3.0.tgz", + "integrity": "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -22551,9 +24835,10 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.2.0.tgz", + "integrity": "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -22562,9 +24847,10 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.2.1.tgz", + "integrity": "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -22573,11 +24859,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.2.0.tgz", + "integrity": "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==", + "license": "Apache-2.0", "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", + "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -22585,9 +24872,10 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.2.0.tgz", + "integrity": "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -22596,14 +24884,14 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.19.tgz", - "integrity": "sha512-mvLMh87xSmQrV5XqnUYEPoiFFeEGYeAKIDDKdhE2ahqitm8OHM3aSvhqL6rrK6wm1brIk90JhxDf5lf2hbrLbQ==", + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.11.tgz", + "integrity": "sha512-yHv+r6wSQXEXTPVCIQTNmXVWs7ekBTpMVErjqZoWkYN75HIFN5y9+/+sYOejfAuvxWGvgzgxbTHa/oz61YTbKw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.3", - "@smithy/types": "^4.3.1", - "bowser": "^2.11.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22611,16 +24899,17 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.19.tgz", - "integrity": "sha512-8tYnx+LUfj6m+zkUUIrIQJxPM1xVxfRBvoGHua7R/i6qAxOMjqR6CpEpDwKoIs1o0+hOjGvkKE23CafKL0vJ9w==", + "version": "4.2.14", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.14.tgz", + "integrity": "sha512-ljZN3iRvaJUgulfvobIuG97q1iUuCMrvXAlkZ4msY+ZuVHQHDIqn7FKZCEj+bx8omz6kF5yQXms/xhzjIO5XiA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.1.4", - "@smithy/credential-provider-imds": "^4.0.6", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/smithy-client": "^4.4.3", - "@smithy/types": "^4.3.1", + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.8", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22628,12 +24917,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-endpoints": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz", - "integrity": "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.1.3", - "@smithy/types": "^4.3.1", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22641,9 +24931,10 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.2.0.tgz", + "integrity": "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -22652,11 +24943,12 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-middleware": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.4.tgz", - "integrity": "sha512-9MLKmkBmf4PRb0ONJikCbCwORACcil6gUWojwARCClT7RmLzF04hUR4WdRprIXal7XVyrddadYNfp2eF3nrvtQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22664,12 +24956,13 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-retry": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.5.tgz", - "integrity": "sha512-V7MSjVDTlEt/plmOFBn1762Dyu5uqMrV2Pl2X0dYk4XvWfdWJNe9Bs5Bzb56wkCuiWjSfClVMGcsuKrGj7S/yg==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.0.5", - "@smithy/types": "^4.3.1", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { @@ -22677,17 +24970,18 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-stream": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz", - "integrity": "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w==", + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.0.4", - "@smithy/node-http-handler": "^4.0.6", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { @@ -22695,9 +24989,10 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.2.0.tgz", + "integrity": "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -22706,17 +25001,48 @@ } }, "node_modules/@aws-sdk/credential-providers/node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.2.0.tgz", + "integrity": "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==", + "license": "Apache-2.0", "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", + "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/credential-providers/node_modules/fast-xml-parser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", + "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^2.1.0" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/@aws-sdk/credential-providers/node_modules/strnum": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", + "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/@aws-sdk/lib-storage": { "version": "3.693.0", "license": "Apache-2.0", @@ -24526,9 +26852,9 @@ } }, "node_modules/@aws-toolkits/telemetry": { - "version": "1.0.338", - "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.338.tgz", - "integrity": "sha512-fg3zCqH4GEBjgL3Wo+xiijRbkyxMh4hXPsOD8Q52k8bvmq5rL9tjbp2IqmHI8JVLOhoomedicXK9ZVEdKSsatw==", + "version": "1.0.341", + "resolved": "https://registry.npmjs.org/@aws-toolkits/telemetry/-/telemetry-1.0.341.tgz", + "integrity": "sha512-y5Q4lBmbmbjkXDZ/paxL1btBa9A79x5tCcA+jWmOzkT4QajMQ71Ntp9sl4aagCiipQOrhbIgOtbSzB8Ug5C1TQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -40323,6 +42649,7 @@ "dependencies": { "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", + "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", @@ -40359,7 +42686,7 @@ "@aws-sdk/credential-provider-env": "<3.731.0", "@aws-sdk/credential-provider-process": "<3.731.0", "@aws-sdk/credential-provider-sso": "<3.731.0", - "@aws-sdk/credential-providers": "<3.731.0", + "@aws-sdk/credential-providers": "^3.936.0", "@aws-sdk/lib-storage": "<3.731.0", "@aws-sdk/property-provider": "<3.731.0", "@aws-sdk/protocol-http": "<3.731.0", @@ -42612,7 +44939,7 @@ }, "packages/toolkit": { "name": "aws-toolkit-vscode", - "version": "3.90.0-SNAPSHOT", + "version": "3.92.0-SNAPSHOT", "license": "Apache-2.0", "dependencies": { "aws-core-vscode": "file:../core/" diff --git a/package.json b/package.json index 242e4ee9594..1c63c1e0dde 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "scan-licenses": "ts-node ./scripts/scan-licenses.ts" }, "devDependencies": { - "@aws-toolkits/telemetry": "^1.0.338", + "@aws-toolkits/telemetry": "^1.0.341", "@playwright/browser-chromium": "^1.43.1", "@stylistic/eslint-plugin": "^2.11.0", "@types/he": "^1.2.3", diff --git a/packages/amazonq/src/app/inline/completion.ts b/packages/amazonq/src/app/inline/completion.ts index 6642ea6a2cd..a7ba2760c09 100644 --- a/packages/amazonq/src/app/inline/completion.ts +++ b/packages/amazonq/src/app/inline/completion.ts @@ -369,7 +369,7 @@ export class AmazonQInlineCompletionItemProvider implements InlineCompletionItem // yield event loop to let the document listen catch updates await sleep(1) - let logstr = `GenerateCompletion activity:\\n` + let logstr = `GenerateCompletion activity:\n` try { const t0 = Date.now() vsCodeState.isRecommendationsActive = true diff --git a/packages/amazonq/src/app/inline/recommendationService.ts b/packages/amazonq/src/app/inline/recommendationService.ts index 52a039126dd..e866eb47a04 100644 --- a/packages/amazonq/src/app/inline/recommendationService.ts +++ b/packages/amazonq/src/app/inline/recommendationService.ts @@ -35,7 +35,7 @@ export interface GetAllRecommendationsOptions { } export class RecommendationService { - private logger = getLogger() + private logger = getLogger('inline') constructor( private readonly sessionManager: SessionManager, @@ -176,7 +176,7 @@ export class RecommendationService { } } - this.logger.info('Received inline completion response from LSP: %O', { + this.logger.info('Received inline completion response (page 0) from LSP: %O', { sessionId: result.sessionId, latency: Date.now() - t0, itemCount: result.items?.length || 0, @@ -188,6 +188,7 @@ export class RecommendationService { 50 ) + '...', })), + nextToken: result.partialResultToken, }) if (result.items.length > 0 && result.items[0].isInlineEdit === false) { @@ -249,18 +250,27 @@ export class RecommendationService { // TODO: question, is it possible that the first request returns empty suggestion but has non-empty next token? if (result.partialResultToken) { - let logstr = `found non null next token; ` + let logstr = `Found non null next token; ` if (!isInlineEdit) { // If the suggestion is COMPLETIONS and there are more results to fetch, handle them in the background - logstr += 'Suggestion type is COMPLETIONS. Start pulling more items' - this.processRemainingRequests(languageClient, request, result, token).catch((error) => { - languageClient.warn(`Error when getting suggestions: ${error}`) - }) + logstr += 'start pagination' + this.processRemainingRequests(languageClient, request, result, token) + .then(async (flag) => { + // Force vscode to reload suggestions + await commands.executeCommand('editor.action.inlineSuggest.hide') + await commands.executeCommand('editor.action.inlineSuggest.trigger') + + const logstr = `Done pagination; shouldUpdate=${flag}; updatedSuggestionCount=${this.sessionManager.getActiveRecommendation().length}` + this.logger.info(logstr) + }) + .catch((error) => { + languageClient.warn(`Error when getting suggestions: ${error}`) + }) } else { // Skip fetching for more items if the suggesion is EDITS. If it is EDITS suggestion, only fetching for more // suggestions when the user start to accept a suggesion. // Save editsStreakPartialResultToken for the next EDITS suggestion trigger if user accepts. - logstr += 'Suggestion type is EDITS. Skip pulling more items' + logstr += 'skip pagination as Edit doesnt support pagination' this.sessionManager.updateActiveEditsStreakToken(result.partialResultToken) } @@ -294,26 +304,39 @@ export class RecommendationService { initialRequest: InlineCompletionWithReferencesParams, firstResult: InlineCompletionListWithReferences, token: CancellationToken - ): Promise { + ): Promise { + let page = 1 + let logstr = `Pagination call is complete\n\tpage 0 has ${this.sessionManager.getActiveRecommendation().length} suggestions\n` let nextToken = firstResult.partialResultToken + let shouldUpdateUi: boolean = false while (nextToken) { const request = { ...initialRequest, partialResultToken: nextToken } const result = await this.getRecommendationsWithTimeout(languageClient, request, token) + + logstr += `\tpage ${page} has ${result.items.length} suggestions\n` + // when pagination is in progress, but user has already accepted or rejected an inline completion // then stop pagination if (this.sessionManager.getActiveSession() === undefined || vsCodeState.isCodeWhispererEditing) { break } this.sessionManager.updateSessionSuggestions(result.items) + if (result.items.length > 0) { + shouldUpdateUi = true + } nextToken = result.partialResultToken + page++ } + this.logger.info(logstr) this.sessionManager.closeSession() // refresh inline completion items to render paginated responses // All pagination requests completed TelemetryHelper.instance.setAllPaginationEndTime() TelemetryHelper.instance.tryRecordClientComponentLatency() + + return shouldUpdateUi } } diff --git a/packages/core/package.json b/packages/core/package.json index c8ede330efb..7d0d08721b3 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -581,6 +581,7 @@ "@amzn/amazon-q-developer-streaming-client": "file:../../src.gen/@amzn/amazon-q-developer-streaming-client", "@amzn/codewhisperer-streaming": "file:../../src.gen/@amzn/codewhisperer-streaming", "@amzn/sagemaker-client": "file:../../src.gen/@amzn/sagemaker-client/1.0.0.tgz", + "@amzn/glue-catalog-client": "file:../../src.gen/@amzn/glue-catalog-client/0.0.1.tgz", "@aws-sdk/client-accessanalyzer": "^3.888.0", "@aws-sdk/client-api-gateway": "<3.731.0", "@aws-sdk/client-apprunner": "<3.731.0", @@ -616,7 +617,7 @@ "@aws-sdk/credential-provider-env": "<3.731.0", "@aws-sdk/credential-provider-process": "<3.731.0", "@aws-sdk/credential-provider-sso": "<3.731.0", - "@aws-sdk/credential-providers": "<3.731.0", + "@aws-sdk/credential-providers": "^3.936.0", "@aws-sdk/lib-storage": "<3.731.0", "@aws-sdk/property-provider": "<3.731.0", "@aws-sdk/protocol-http": "<3.731.0", diff --git a/packages/core/package.nls.json b/packages/core/package.nls.json index bda0d97b022..8c758424fbf 100644 --- a/packages/core/package.nls.json +++ b/packages/core/package.nls.json @@ -115,6 +115,7 @@ "AWS.command.refreshappBuilderExplorer": "Refresh Application Builder Explorer", "AWS.command.applicationComposer.openDialog": "Open Template with Infrastructure Composer...", "AWS.command.auth.addConnection": "Add New Connection", + "AWS.command.auth.consoleLogin": "Login with console credentials (Recommended)", "AWS.command.auth.showConnectionsPage": "Add New Connection", "AWS.command.auth.switchConnections": "Switch Connections", "AWS.command.auth.signout": "Sign Out", diff --git a/packages/core/scripts/build/generateServiceClient.ts b/packages/core/scripts/build/generateServiceClient.ts index ac46c307a0f..6e6829fd1ec 100644 --- a/packages/core/scripts/build/generateServiceClient.ts +++ b/packages/core/scripts/build/generateServiceClient.ts @@ -241,10 +241,6 @@ void (async () => { serviceJsonPath: 'src/codewhisperer/client/user-service-2.json', serviceName: 'CodeWhispererUserClient', }, - { - serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/gluecatalogapi.json', - serviceName: 'GlueCatalogApi', - }, { serviceJsonPath: 'src/sagemakerunifiedstudio/shared/client/sqlworkbench.json', serviceName: 'SQLWorkbench', diff --git a/packages/core/src/auth/consoleSessionUtils.ts b/packages/core/src/auth/consoleSessionUtils.ts new file mode 100644 index 00000000000..e21772b4535 --- /dev/null +++ b/packages/core/src/auth/consoleSessionUtils.ts @@ -0,0 +1,353 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import * as nls from 'vscode-nls' +const localize = nls.loadMessageBundle() + +import { parseKnownFiles } from '@smithy/shared-ini-file-loader' +import { globals } from 'aws-core-vscode/shared' +import { getLogger } from '../shared/logger/logger' +import { ChildProcess } from '../shared/utilities/processUtils' +import { getOrInstallCli, updateAwsCli } from '../shared/utilities/cliUtils' +import { CancellationError } from '../shared/utilities/timeoutUtils' +import { ToolkitError } from '../shared/errors' +import { telemetry } from '../shared/telemetry/telemetry' +import { Auth } from './auth' +import { CredentialsId, asString } from './providers/credentials' +import { createRegionPrompter } from '../shared/ui/common/region' + +/** + * @description Authenticates with AWS using browser-based login via AWS CLI. + * Creates a session profile and automatically activates it. + * + * @param profileName Optional profile name. If not provided, user will be prompted. + * @param region Optional AWS region. If not provided, user will be prompted. + */ +export async function authenticateWithConsoleLogin(profileName?: string, region?: string): Promise { + const logger = getLogger() + + // Prompt for profile name if not provided + if (!profileName) { + const profileNameInput = await vscode.window.showInputBox({ + prompt: localize('AWS.message.prompt.consoleLogin.profileName', 'Enter a name for this profile'), + placeHolder: localize('AWS.message.placeholder.consoleLogin.profileName', 'profile-name'), + validateInput: (value) => { + if (!value || value.trim().length === 0) { + return localize('AWS.message.error.consoleLogin.emptyProfileName', 'Profile name cannot be empty') + } + if (/\s/.test(value)) { + return localize( + 'AWS.message.error.consoleLogin.spacesInProfileName', + 'Profile name cannot contain spaces' + ) + } + if (!/^[a-zA-Z0-9_-]+$/.test(value)) { + return localize( + 'AWS.message.error.consoleLogin.invalidCharacters', + 'Profile name can only contain letters, numbers, underscores, and hyphens' + ) + } + return undefined + }, + }) + + if (!profileNameInput) { + throw new ToolkitError('User cancelled entering profile', { + cancelled: true, + }) + } + + profileName = profileNameInput.trim() + } + + // After user interaction has occurred, we can safely emit telemetry + await telemetry.auth_consoleLoginCommand.run(async (span) => { + span.record({ authConsoleLoginStarted: true }) // Track entry into flow (raw count) + + // Prompt for region if not provided + if (!region) { + const regionPrompter = createRegionPrompter(undefined, { + title: localize('AWS.message.prompt.consoleLogin.region', 'Select an AWS region for console login'), + }) + + const selectedRegion = await regionPrompter.prompt() + + if (!selectedRegion || typeof selectedRegion === 'symbol') { + throw new ToolkitError('User cancelled selecting region', { + cancelled: true, + }) + } + + // TypeScript narrowing: at this point selectedRegion is Region + const regionResult = selectedRegion as { id: string } + region = regionResult.id + } + + // Verify AWS CLI availability and install if needed + let awsCliPath: string + try { + logger.info('Verifying AWS CLI availability...') + awsCliPath = await getOrInstallCli('aws-cli', true) + logger.info('AWS CLI found at: %s', awsCliPath) + } catch (error) { + logger.error('Failed to verify or install AWS CLI: %O', error) + void vscode.window.showErrorMessage( + localize( + 'AWS.message.error.consoleLogin.cliInstallFailed', + 'Failed to install AWS CLI. Please install it manually.' + ) + ) + throw new ToolkitError('Failed to verify or install AWS CLI', { + code: 'CliInstallFailed', + cause: error as Error, + }) + } + + // Execute login with console credentials command + try { + // At this point, profileName and region are guaranteed to be defined + if (!profileName || !region) { + throw new ToolkitError('Profile name and region are required') + } + + logger.info( + `Executing login with console credentials command for profile: ${profileName}, region: ${region}` + ) + + const commandArgs = ['login', '--profile', profileName, '--region', region] + + // Track if we've shown the URL dialog and if user cancelled + let urlShown = false + let loginUrl: string | undefined + let userCancelled = false + + let loginProcess: ChildProcess | undefined + + // Start the process and handle output with cancellation support + const result = await vscode.window.withProgress( + { + location: vscode.ProgressLocation.Notification, + title: localize('AWS.message.progress.consoleLogin', 'Login with console credentials'), + cancellable: true, + }, + async (progress, token) => { + progress.report({ + message: localize( + 'AWS.message.progress.waitingForBrowser', + 'Waiting for browser authentication...' + ), + }) + + loginProcess = new ChildProcess(awsCliPath, commandArgs, { + collect: true, + rejectOnErrorCode: false, + onStdout: (text: string) => { + // Enhance the UX by showing AWS Sign-in service (signin.aws.amazon.com) URL in VS Code when we detect it. + const urlMatch = text.match(/(https:\/\/[^\s]+signin\.aws\.amazon\.com[^\s]+)/i) + if (urlMatch && !urlShown) { + loginUrl = urlMatch[1] + urlShown = true + + // Show URL with Copy button (non-blocking) + const copyUrl = localize('AWS.button.copyUrl', 'Copy URL') + void vscode.window + .showInformationMessage( + localize( + 'AWS.message.info.consoleLogin.browserAuth', + 'Attempting to open your default browser.\nIf the browser does not open, copy the URL:\n\n{0}', + loginUrl + ), + copyUrl + ) + .then(async (selection) => { + if (selection === copyUrl && loginUrl) { + await vscode.env.clipboard.writeText(loginUrl) + void vscode.window.showInformationMessage( + localize( + 'AWS.message.info.urlCopied', + 'AWS Sign-in URL copied to clipboard.' + ) + ) + } + }) + } + // Check if profile is already configured with a session + const overwriteMatch = text.match( + /Profile .+ is already configured to use session .+\. Do you want to overwrite it to use .+ instead\?/s + ) + if (overwriteMatch) { + const cliMessage = overwriteMatch[0].trim() // Extract the matched string + const overwriteBtn = localize('AWS.generic.overwrite', 'Overwrite') + const cancelBtn = localize('AWS.generic.cancel', 'Cancel') + void vscode.window + .showInformationMessage(cliMessage, overwriteBtn, cancelBtn) + .then(async (selection) => { + if (selection === overwriteBtn && loginProcess) { + // Send "y" to stdin to proceed with overwrite + await loginProcess.send('y\n') + } else if (loginProcess) { + // User cancelled, stop the process + await loginProcess.send('n\n') + userCancelled = true + } + }) + } + }, + }) + + // Handle cancellation + token.onCancellationRequested(() => { + userCancelled = true + loginProcess?.stop() + }) + + return await loginProcess.run() + } + ) + + // Check if user cancelled + if (userCancelled) { + void vscode.window.showInformationMessage( + localize('AWS.message.info.consoleLogin.cancelled', 'Login with console credentials was cancelled.') + ) + throw new ToolkitError('User cancelled login with console credentials', { + cancelled: true, + }) + } + + if (result.exitCode === 0) { + telemetry.aws_consoleLoginCLISuccess.emit({ result: 'Succeeded' }) + // Show generic success message + void vscode.window.showInformationMessage( + localize( + 'AWS.message.success.consoleLogin', + 'Login with console credentials command completed. Profile "{0}" is now available.', + profileName + ) + ) + logger.info('Login with console credentials command completed. Exit code: %d', result.exitCode) + } else if (result.exitCode === 254) { + logger.error( + 'AWS Sign-in service returned an error. Exit code %d: %s', + result.exitCode, + result.stdout || result.stderr + ) + void vscode.window.showErrorMessage( + localize( + 'AWS.message.error.consoleLogin.signinServiceError', + 'Unable to sign in with console credentials in "{0}". Please try another region.', + region + ) + ) + throw new ToolkitError('AWS Sign-in service returned an error', { + code: 'SigninServiceError', + details: { + exitCode: result.exitCode, + }, + }) + } else if (result.exitCode === 252) { + // AWS CLI is outdated, attempt to update + try { + await updateAwsCli() + // Retry the login command after successful update + return await authenticateWithConsoleLogin(profileName, region) + } catch (err) { + if (CancellationError.isUserCancelled(err)) { + throw new ToolkitError('User cancelled updating AWS CLI', { + cancelled: true, + }) + } + logger.error('Failed to update AWS CLI: %O', err) + throw ToolkitError.chain(err, 'AWS CLI update failed') + } + } else { + // Show generic error message + void vscode.window.showErrorMessage( + localize('AWS.message.error.consoleLogin.commandFailed', 'Login with console credentials failed.') + ) + logger.error( + 'Login with console credentials command failed with exit code %d: %s', + result.exitCode, + result.stdout || result.stderr + ) + throw new ToolkitError('Login with console credentials command failed with exit code', { + code: 'CommandFailed', + details: { + exitCode: result.exitCode, + }, + }) + } + } catch (error) { + logger.error('Error executing login with console credentials command: %O', error) + void vscode.window.showErrorMessage( + localize( + 'AWS.message.error.consoleLogin.executionFailed', + 'Failed to execute login with console credentials command: {0}', + error instanceof Error ? error.message : String(error) + ) + ) + throw new ToolkitError('Failed to execute login with console credentials command', { + code: 'ExecutionFailed', + cause: error as Error, + }) + } + + // Load and verify profile with ignoreCache to get newly written config from disk to catch CLI's async writes + logger.info(`Verifying profile configuration for ${profileName}`) + const profiles = await parseKnownFiles({ ignoreCache: true }) + const profile = profiles[profileName] + logger.info('Profile found: %O', profile) + logger.info('Login session value: %s, type: %s', profile?.login_session, typeof profile?.login_session) + if (!profiles[profileName]?.login_session) { + throw new ToolkitError(`Console login succeeded but profile ${profileName} not properly configured`, { + code: 'ConsoleLoginConfigError', + }) + } + + // Activate the newly created profile + try { + logger.info(`Activating profile: ${profileName}`) + // Connection ID format is "profile:profileName" + const credentialsId: CredentialsId = { + credentialSource: 'profile', + credentialTypeId: profileName, + } + const connectionId = asString(credentialsId) + // Invalidate cached credentials to force fresh fetch + getLogger().info(`Invalidated cached credentials for ${connectionId}`) + globals.loginManager.store.invalidateCredentials(credentialsId) + logger.info(`Looking for connection with ID: ${connectionId}`) + + const connection = await Auth.instance.getConnection({ id: connectionId }) + if (connection === undefined) { + // Log available connections for debugging + const availableConnections = await Auth.instance.listConnections() + logger.error( + 'Connection not found. Available connections: %O', + availableConnections.map((c) => c.id) + ) + throw new ToolkitError(`Failed to get connection from profile: ${connectionId}`, { + code: 'MissingConnection', + }) + } + // Don't call useConnection() - let credentials be fetched naturally when needed + await Auth.instance.updateConnectionState(connectionId, 'valid') + } catch (error) { + logger.error('Failed to activate profile: %O', error) + void vscode.window.showErrorMessage( + localize( + 'AWS.message.error.consoleLogin.profileActivationFailed', + 'Failed to activate profile: {0}', + error instanceof Error ? error.message : String(error) + ) + ) + throw new ToolkitError('Failed to activate profile', { + code: 'ProfileActivationFailed', + cause: error as Error, + }) + } + }) +} diff --git a/packages/core/src/auth/credentials/types.ts b/packages/core/src/auth/credentials/types.ts index 75a12a2d9b2..9a9d1bca0d2 100644 --- a/packages/core/src/auth/credentials/types.ts +++ b/packages/core/src/auth/credentials/types.ts @@ -10,6 +10,7 @@ export const SharedCredentialsKeys = { AWS_ACCESS_KEY_ID: 'aws_access_key_id', AWS_SECRET_ACCESS_KEY: 'aws_secret_access_key', AWS_SESSION_TOKEN: 'aws_session_token', + CONSOLE_SESSION: 'login_session', CREDENTIAL_PROCESS: 'credential_process', CREDENTIAL_SOURCE: 'credential_source', ENDPOINT_URL: 'endpoint_url', diff --git a/packages/core/src/auth/providers/sharedCredentialsProvider.ts b/packages/core/src/auth/providers/sharedCredentialsProvider.ts index 02d8f9b40f8..19baa7d5dd1 100644 --- a/packages/core/src/auth/providers/sharedCredentialsProvider.ts +++ b/packages/core/src/auth/providers/sharedCredentialsProvider.ts @@ -3,7 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as vscode from 'vscode' import * as AWS from '@aws-sdk/types' +import { fromLoginCredentials } from '@aws-sdk/credential-providers' import { fromProcess } from '@aws-sdk/credential-provider-process' import { ParsedIniData } from '@smithy/types' import { chain } from '@aws-sdk/property-provider' @@ -87,6 +89,8 @@ export class SharedCredentialsProvider implements CredentialsProvider { public getTelemetryType(): CredentialType { if (hasProps(this.profile, SharedCredentialsKeys.SSO_START_URL)) { return 'ssoProfile' + } else if (hasProps(this.profile, SharedCredentialsKeys.CONSOLE_SESSION)) { + return 'consoleSessionProfile' } else if (this.isCredentialSource(credentialSources.EC2_INSTANCE_METADATA)) { return 'ec2Metadata' } else if (this.isCredentialSource(credentialSources.ECS_CONTAINER)) { @@ -199,6 +203,8 @@ export class SharedCredentialsProvider implements CredentialsProvider { ) } else if (isSsoProfile(this.profile)) { return undefined + } else if (hasProps(this.profile, SharedCredentialsKeys.CONSOLE_SESSION)) { + return undefined } else { return 'not supported by the Toolkit' } @@ -349,6 +355,14 @@ export class SharedCredentialsProvider implements CredentialsProvider { return this.makeSsoCredentaislProvider() } + if (hasProps(this.profile, SharedCredentialsKeys.CONSOLE_SESSION)) { + logger.verbose( + `Profile ${this.profileName} contains ${SharedCredentialsKeys.CONSOLE_SESSION} - treating as Console Credentials` + ) + + return this.makeConsoleSessionCredentialsProvider() + } + logger.error(`Profile ${this.profileName} did not contain any supported properties`) throw new Error(`Shared Credentials profile ${this.profileName} is not supported`) } @@ -381,6 +395,76 @@ export class SharedCredentialsProvider implements CredentialsProvider { } } + private makeConsoleSessionCredentialsProvider() { + const defaultRegion = this.getDefaultRegion() ?? 'us-east-1' + const baseProvider = fromLoginCredentials({ + profile: this.profileName, + clientConfig: { + region: defaultRegion, + }, + }) + return async () => { + try { + return await baseProvider() + } catch (error) { + getLogger().error( + 'Console login authentication failed for profile %s in region %s: %O', + this.profileName, + defaultRegion, + error + ) + + if ( + error instanceof Error && + (error.message.includes('Your session has expired') || + error.message.includes('Failed to load a token for session') || + error.message.includes('Failed to load token from')) + ) { + // Ask for user confirmation before refreshing + const response = await vscode.window.showInformationMessage( + `Unable to use your console credentials for profile "${this.profileName}". Would you like to refresh it?`, + 'Refresh', + 'Cancel' + ) + + if (response !== 'Refresh') { + throw ToolkitError.chain(error, 'User cancelled console credentials token refresh.', { + code: 'LoginSessionRefreshCancelled', + cancelled: true, + }) + } + + getLogger().info('Re-authenticating using console credentials for profile %s', this.profileName) + // Execute the console login command with the existing profile and region + try { + await vscode.commands.executeCommand( + 'aws.toolkit.auth.consoleLogin', + this.profileName, + defaultRegion + ) + } catch (reAuthError) { + throw ToolkitError.chain( + reAuthError, + `Failed to refresh credentials for profile ${this.profileName}. Run 'aws login --profile ${this.profileName}' to authenticate.`, + { code: 'LoginSessionReAuthError' } + ) + } + + getLogger().info( + 'Authentication completed for profile %s, refreshing credentials...', + this.profileName + ) + + // Use the same provider instance but get fresh credentials + return await baseProvider() + } + throw ToolkitError.chain(error, `Failed to get console credentials`, { + code: 'FromLoginCredentialProviderError', + }) + } + } + } + private makeSharedIniFileCredentialsProvider(loadedCreds?: ParsedIniData): AWS.CredentialProvider { // Our credentials logic merges profiles from the credentials and config files but SDK v3 does not // This can cause odd behavior where the Toolkit can switch to a profile but not authenticate with it diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts index 59b9662c70b..d135185e71d 100644 --- a/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/deployedNode.ts @@ -26,9 +26,11 @@ import { SERVERLESS_FUNCTION_TYPE, SERVERLESS_API_TYPE, s3BucketType, + SERVERLESS_CAPACITY_PROVIDER_TYPE, } from '../../../../shared/cloudformation/cloudformation' import { ToolkitError } from '../../../../shared/errors' -import { ResourceTreeEntity } from '../samProject' +import { ResourceTreeEntity, isFunctionResource } from '../samProject' +import { LambdaCapacityProviderNode } from '../../../../lambda/explorer/lambdaCapacityProviderNode' const localize = nls.loadMessageBundle() export interface DeployedResource { @@ -43,6 +45,7 @@ export const DeployedResourceContextValues: Record = { [SERVERLESS_FUNCTION_TYPE]: 'awsRegionFunctionNodeDownloadable', [SERVERLESS_API_TYPE]: 'awsApiGatewayNode', [s3BucketType]: 'awsS3BucketNode', + [SERVERLESS_CAPACITY_PROVIDER_TYPE]: 'awsCapacityProviderNode', } export class DeployedResourceNode implements TreeNode { @@ -93,12 +96,13 @@ export async function generateDeployedNode( try { configuration = (await defaultClient.getFunction(deployedResource.PhysicalResourceId)) .Configuration as FunctionConfiguration + const codeUri = isFunctionResource(resourceTreeEntity) ? resourceTreeEntity.CodeUri : undefined newDeployedResource = new LambdaFunctionNode( lambdaNode, regionCode, configuration, undefined, - location ? vscode.Uri.joinPath(location, resourceTreeEntity.CodeUri ?? '').fsPath : undefined, + location ? vscode.Uri.joinPath(location, codeUri ?? '').fsPath : undefined, location, deployedResource.LogicalResourceId ) @@ -124,6 +128,10 @@ export async function generateDeployedNode( newDeployedResource = new RestApiNode(apiParentNode, partitionId, regionCode, apiNode as RestApi) break } + case SERVERLESS_CAPACITY_PROVIDER_TYPE: { + newDeployedResource = new LambdaCapacityProviderNode(regionCode, deployedResource) + break + } default: newDeployedResource = new DeployedResourceNode(deployedResource) getLogger().info('Details are missing or are incomplete for: %O', deployedResource) diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/propertyNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/propertyNode.ts index 481ecdf7009..e6eb92ff22a 100644 --- a/packages/core/src/awsService/appBuilder/explorer/nodes/propertyNode.ts +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/propertyNode.ts @@ -7,6 +7,16 @@ import * as vscode from 'vscode' import { getIcon } from '../../../../shared/icons' import { TreeNode } from '../../../../shared/treeview/resourceTreeDataProvider' +/** + * Formats CloudFormation intrinsic functions into readable strings + */ +function formatIntrinsicFunction(value: any): string | undefined { + if (typeof value !== 'object' || value === null || Object.keys(value).length !== 1) { + return undefined + } + return JSON.stringify(value) +} + export class PropertyNode implements TreeNode { public readonly id = this.key public readonly resource = this.value @@ -25,12 +35,15 @@ export class PropertyNode implements TreeNode { } public getTreeItem() { - const item = new vscode.TreeItem(`${this.key}: ${this.value}`) + const intrinsicFormat = formatIntrinsicFunction(this.value) + const displayValue = intrinsicFormat ?? this.value + + const item = new vscode.TreeItem(`${this.key}: ${displayValue}`) item.contextValue = 'awsAppBuilderPropertyNode' item.iconPath = getIcon('vscode-gear') - if (this.value instanceof Array || this.value instanceof Object) { + if (!intrinsicFormat && (this.value instanceof Array || this.value instanceof Object)) { item.label = this.key item.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed } @@ -41,6 +54,6 @@ export class PropertyNode implements TreeNode { export function generatePropertyNodes(properties: { [key: string]: any }): TreeNode[] { return Object.entries(properties) - .filter(([key, _]) => key !== 'Id' && key !== 'Type' && key !== 'Events') + .filter(([key, value]) => key !== 'Id' && key !== 'Type' && key !== 'Events' && value !== undefined) .map(([key, value]) => new PropertyNode(key, value)) } diff --git a/packages/core/src/awsService/appBuilder/explorer/nodes/resourceNode.ts b/packages/core/src/awsService/appBuilder/explorer/nodes/resourceNode.ts index fc9d4c48c14..134302b0417 100644 --- a/packages/core/src/awsService/appBuilder/explorer/nodes/resourceNode.ts +++ b/packages/core/src/awsService/appBuilder/explorer/nodes/resourceNode.ts @@ -12,6 +12,7 @@ import { s3BucketType, appRunnerType, ecrRepositoryType, + SERVERLESS_CAPACITY_PROVIDER_TYPE, } from '../../../../shared/cloudformation/cloudformation' import { generatePropertyNodes } from './propertyNode' import { generateDeployedNode } from './deployedNode' @@ -24,6 +25,7 @@ enum ResourceTypeId { Function = 'function', DeployedFunction = 'deployed-function', Api = 'api', + CapacityProvider = 'capacityprovider', Other = '', } @@ -88,7 +90,10 @@ export class ResourceNode implements TreeNode { this.location.projectRoot )) as DeployedResourceNode[] } - if (this.resourceTreeEntity.Type === SERVERLESS_FUNCTION_TYPE) { + if ( + this.resourceTreeEntity.Type === SERVERLESS_FUNCTION_TYPE || + this.resourceTreeEntity.Type === SERVERLESS_CAPACITY_PROVIDER_TYPE + ) { propertyNodes = generatePropertyNodes(this.resourceTreeEntity) } @@ -132,6 +137,8 @@ export class ResourceNode implements TreeNode { return getIcon('aws-apprunner-service') case ecrRepositoryType: return getIcon('aws-ecr-registry') + case SERVERLESS_CAPACITY_PROVIDER_TYPE: + return getIcon('vscode-gear') default: return getIcon('vscode-info') } @@ -146,6 +153,8 @@ export class ResourceNode implements TreeNode { return ResourceTypeId.Function case 'Api': return ResourceTypeId.Api + case SERVERLESS_CAPACITY_PROVIDER_TYPE: + return ResourceTypeId.CapacityProvider default: return ResourceTypeId.Other } diff --git a/packages/core/src/awsService/appBuilder/explorer/samProject.ts b/packages/core/src/awsService/appBuilder/explorer/samProject.ts index faba9bcad76..eedf19ccdc5 100644 --- a/packages/core/src/awsService/appBuilder/explorer/samProject.ts +++ b/packages/core/src/awsService/appBuilder/explorer/samProject.ts @@ -9,7 +9,6 @@ import { SamConfig, SamConfigErrorCode } from '../../../shared/sam/config' import { getLogger } from '../../../shared/logger/logger' import { ToolkitError } from '../../../shared/errors' import { showViewLogsMessage } from '../../../shared/utilities/messages' -import { Runtime } from '@aws-sdk/client-lambda' export interface SamApp { location: SamAppLocation @@ -22,18 +21,40 @@ export interface SamAppLocation { projectRoot: vscode.Uri } -export interface ResourceTreeEntity { +export interface BaseResourceEntity { Id: string Type: string - Runtime?: Runtime - CodeUri?: string - Handler?: string - Events?: ResourceTreeEntity[] +} + +export interface EventEntity extends BaseResourceEntity { Path?: string Method?: string +} + +export interface FunctionResourceEntity extends BaseResourceEntity { + Runtime?: string + CodeUri?: string + Handler?: string + Events?: EventEntity[] Environment?: { Variables: Record } + CapacityProviderConfig?: string + Architectures?: string +} + +export interface CapacityProviderResourceEntity extends BaseResourceEntity { + Architectures?: string +} + +export type ResourceTreeEntity = FunctionResourceEntity | CapacityProviderResourceEntity | BaseResourceEntity + +export function isFunctionResource(resource: ResourceTreeEntity): resource is FunctionResourceEntity { + return resource.Type === CloudFormation.SERVERLESS_FUNCTION_TYPE +} + +export function isCapacityProviderResource(resource: ResourceTreeEntity): resource is CapacityProviderResourceEntity { + return resource.Type === CloudFormation.SERVERLESS_CAPACITY_PROVIDER_TYPE } export async function getStackName(projectRoot: vscode.Uri): Promise { @@ -78,30 +99,58 @@ function getResourceEntity(template: any): ResourceTreeEntity[] { const resourceTree: ResourceTreeEntity[] = [] for (const [logicalId, resource] of Object.entries(template?.Resources ?? []) as [string, any][]) { - const resourceEntity: ResourceTreeEntity = { - Id: logicalId, - Type: resource.Type, + const resourceEntity = createResourceEntity(logicalId, resource, template) + resourceTree.push(resourceEntity) + } + return resourceTree +} + +function createResourceEntity(logicalId: string, resource: any, template: any): ResourceTreeEntity { + const baseEntity: BaseResourceEntity = { + Id: logicalId, + Type: resource.Type, + } + + // Create type-specific entities + if (resource.Type === CloudFormation.SERVERLESS_FUNCTION_TYPE) { + const functionEntity: FunctionResourceEntity = { + ...baseEntity, Runtime: resource.Properties?.Runtime ?? template?.Globals?.Function?.Runtime, Handler: resource.Properties?.Handler ?? template?.Globals?.Function?.Handler, Events: resource.Properties?.Events ? getEvents(resource.Properties.Events) : undefined, CodeUri: resource.Properties?.CodeUri ?? template?.Globals?.Function?.CodeUri, Environment: resource.Properties?.Environment ?? template?.Globals?.Function?.Environment, + CapacityProviderConfig: + resource.Properties?.CapacityProviderConfig ?? template?.Globals?.Function?.CapacityProviderConfig, + Architectures: resource.Properties?.Architectures?.[0] ?? template?.Globals?.Function?.Architectures?.[0], } - resourceTree.push(resourceEntity) + return functionEntity } - return resourceTree + + if (resource.Type === CloudFormation.SERVERLESS_CAPACITY_PROVIDER_TYPE) { + const capacityProviderEntity: CapacityProviderResourceEntity = { + ...baseEntity, + Architectures: + resource.Properties?.InstanceRequirements?.Architectures?.[0] ?? + template?.Globals?.CapacityProvider?.InstanceRequirements?.Architectures?.[0], + } + return capacityProviderEntity + } + + // Generic resource for unsupported types + return baseEntity } -function getEvents(events: Record): ResourceTreeEntity[] { - const eventResources: ResourceTreeEntity[] = [] +function getEvents(events: Record): EventEntity[] { + const eventResources: EventEntity[] = [] for (const [eventsLogicalId, event] of Object.entries(events)) { const eventProperties = event.Properties - const eventResource: ResourceTreeEntity = { + const eventResource: EventEntity = { Id: eventsLogicalId, Type: event.Type, - Path: eventProperties.Path, - Method: eventProperties.Method, + Path: eventProperties?.Path, + Method: eventProperties?.Method, } eventResources.push(eventResource) } diff --git a/packages/core/src/awsService/appBuilder/utils.ts b/packages/core/src/awsService/appBuilder/utils.ts index d88aa170f57..bf65059ebc1 100644 --- a/packages/core/src/awsService/appBuilder/utils.ts +++ b/packages/core/src/awsService/appBuilder/utils.ts @@ -8,6 +8,7 @@ import { TreeNode } from '../../shared/treeview/resourceTreeDataProvider' import * as nls from 'vscode-nls' import { ResourceNode } from './explorer/nodes/resourceNode' import type { SamAppLocation } from './explorer/samProject' +import { isFunctionResource } from './explorer/samProject' import { ToolkitError } from '../../shared/errors' import globals from '../../shared/extensionGlobals' import { OpenTemplateParams, OpenTemplateWizard } from './explorer/openTemplate' @@ -552,27 +553,33 @@ export async function runOpenTemplate(arg?: TreeNode) { */ export async function runOpenHandler(arg: ResourceNode): Promise { const folderUri = path.dirname(arg.resource.location.fsPath) - if (!arg.resource.resource.CodeUri) { + const resource = arg.resource.resource + + if (!isFunctionResource(resource)) { + throw new ToolkitError('Resource is not a Lambda function', { code: 'NotAFunction' }) + } + + if (!resource.CodeUri) { throw new ToolkitError('No CodeUri provided in template, cannot open handler', { code: 'NoCodeUriProvided' }) } - if (!arg.resource.resource.Handler) { + if (!resource.Handler) { throw new ToolkitError('No Handler provided in template, cannot open handler', { code: 'NoHandlerProvided' }) } - if (!arg.resource.resource.Runtime) { + if (!resource.Runtime) { throw new ToolkitError('No Runtime provided in template, cannot open handler', { code: 'NoRuntimeProvided' }) } const handlerFile = await getLambdaHandlerFile( vscode.Uri.file(folderUri), - arg.resource.resource.CodeUri, - arg.resource.resource.Handler, - arg.resource.resource.Runtime + resource.CodeUri, + resource.Handler, + resource.Runtime as Runtime ) if (!handlerFile) { throw new ToolkitError( - `No handler file found with name "${arg.resource.resource.Handler}". Ensure the file exists in the expected location."`, + `No handler file found with name "${resource.Handler}". Ensure the file exists in the expected location."`, { code: 'NoHandlerFound', } diff --git a/packages/core/src/awsService/cloudformation/commands/cfnCommands.ts b/packages/core/src/awsService/cloudformation/commands/cfnCommands.ts index ee7c829cf1c..be5b2d7f60f 100644 --- a/packages/core/src/awsService/cloudformation/commands/cfnCommands.ts +++ b/packages/core/src/awsService/cloudformation/commands/cfnCommands.ts @@ -22,7 +22,7 @@ import { Command } from 'vscode-languageclient/node' import * as yaml from 'js-yaml' import { Deployment } from '../stacks/actions/deploymentWorkflow' -import { Parameter, Capability, OnStackFailure, Stack } from '@aws-sdk/client-cloudformation' +import { Parameter, Capability, OnStackFailure, Stack, StackStatus } from '@aws-sdk/client-cloudformation' import { getParameterValues, getStackName, @@ -135,7 +135,8 @@ export function viewChangeSetCommand(client: LanguageClient, diffProvider: DiffW params.changeSetName, true, [], - describeChangeSetResult.deploymentMode + describeChangeSetResult.deploymentMode, + describeChangeSetResult.status ) void commands.executeCommand(commandKey('diff.focus')) } catch (error) { @@ -209,13 +210,13 @@ type OptionalFlagSelection = ChangeSetOptionalFlags & { shouldSaveOptions?: boolean } -function shouldPromptForDeploymentMode( +function isRevertDriftEligible( stackDetails: Stack | undefined, importExistingResources: boolean | undefined, includeNestedStacks: boolean | undefined, onStackFailure: OnStackFailure | undefined ): boolean { - const isCreate = !stackDetails + const isCreate = !stackDetails || stackDetails.StackStatus === StackStatus.REVIEW_IN_PROGRESS const hasDisableRollback = onStackFailure === OnStackFailure.DO_NOTHING return !isCreate && !importExistingResources && !includeNestedStacks && !hasDisableRollback @@ -246,7 +247,7 @@ export async function promptForOptionalFlags( // default to REVERT_DRIFT if possible because it's generally useful deploymentMode: fileFlags?.deploymentMode ?? - (shouldPromptForDeploymentMode( + (isRevertDriftEligible( stackDetails, fileFlags?.importExistingResources, fileFlags?.includeNestedStacks, @@ -259,21 +260,21 @@ export async function promptForOptionalFlags( break case OptionalFlagMode.Input: { - const onStackFailure = fileFlags?.onStackFailure ?? (await getOnStackFailure(!!stackDetails)) - const includeNestedStacks = fileFlags?.includeNestedStacks ?? (await getIncludeNestedStacks()) - const importExistingResources = fileFlags?.importExistingResources ?? (await getImportExistingResources()) - - let deploymentMode = fileFlags?.deploymentMode - if ( - !deploymentMode && - shouldPromptForDeploymentMode( - stackDetails, - importExistingResources, - includeNestedStacks, - onStackFailure - ) - ) { - deploymentMode = await getDeploymentMode() + // Only available for UPDATE stack and is incompatible with the other options + const deploymentMode = + fileFlags?.deploymentMode ?? + (isRevertDriftEligible(stackDetails, undefined, undefined, undefined) + ? await getDeploymentMode() + : undefined) + + let onStackFailure: OnStackFailure | undefined + let includeNestedStacks: boolean | undefined + let importExistingResources: boolean | undefined + + if (deploymentMode !== DeploymentMode.REVERT_DRIFT) { + onStackFailure = fileFlags?.onStackFailure ?? (await getOnStackFailure(stackDetails)) + includeNestedStacks = fileFlags?.includeNestedStacks ?? (await getIncludeNestedStacks()) + importExistingResources = fileFlags?.importExistingResources ?? (await getImportExistingResources()) } optionalFlags = { @@ -483,7 +484,7 @@ async function changeSetSteps( try { environmentFile = await environmentManager.selectEnvironmentFile(templateUri, paramDefinition) } catch (error) { - getLogger().warn(`Failed to select environment file:: ${extractErrorMessage(error)}`) + getLogger().warn(`Failed to select environment file: ${extractErrorMessage(error)}`) } if (paramDefinition.length > 0) { diff --git a/packages/core/src/awsService/cloudformation/consoleLinksUtils.ts b/packages/core/src/awsService/cloudformation/consoleLinksUtils.ts index 67a56fc6eeb..390f1f3804a 100644 --- a/packages/core/src/awsService/cloudformation/consoleLinksUtils.ts +++ b/packages/core/src/awsService/cloudformation/consoleLinksUtils.ts @@ -2,6 +2,9 @@ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ + +import { parse } from '@aws-sdk/util-arn-parser' + export function arnToConsoleUrl(arn: string): string { return `https://console.aws.amazon.com/go/view?arn=${encodeURIComponent(arn)}` } @@ -11,6 +14,15 @@ export function arnToConsoleTabUrl(arn: string, tab: 'resources' | 'events' | 'o return `https://${region}.console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/${tab}?stackId=${encodeURIComponent(arn)}` } +export function operationIdToConsoleUrl(arn: string, operationId: string): string | undefined { + try { + const region = parse(arn).region + return `https://${region}.console.aws.amazon.com/cloudformation/home?region=${region}#/stacks/operations/info?stackId=${encodeURIComponent(arn)}&operationId=${operationId}` + } catch { + return undefined + } +} + // Reference link - https://cloudscape.design/foundation/visual-foundation/iconography/ - icon name: external export function externalLinkSvg(): string { return `` diff --git a/packages/core/src/awsService/cloudformation/extension.ts b/packages/core/src/awsService/cloudformation/extension.ts index f3e7a6dfad2..22016000d83 100644 --- a/packages/core/src/awsService/cloudformation/extension.ts +++ b/packages/core/src/awsService/cloudformation/extension.ts @@ -83,6 +83,7 @@ import { CfnInitUiInterface } from './cfn-init/cfnInitUiInterface' import { CfnInitCliCaller } from './cfn-init/cfnInitCliCaller' import { CfnEnvironmentFileSelector } from './ui/cfnEnvironmentFileSelector' import { fs } from '../../shared/fs/fs' +import { ToolkitError } from '../../shared/errors' let client: LanguageClient let clientDisposables: Disposable[] = [] @@ -167,11 +168,10 @@ async function startClient(context: ExtensionContext) { }, errorHandler: { error: (error: Error, message: Message | undefined, count: number | undefined): ErrorHandlerResult => { - void window.showErrorMessage(formatMessage(`Error count = ${count}): ${toString(message)}`)) + void window.showErrorMessage(formatMessage(`${toString(message)} - ${toString(error)}`)) return { action: ErrorAction.Continue } }, closed: (): CloseHandlerResult => { - void window.showWarningMessage(formatMessage(`Server connection closed`)) return { action: CloseAction.DoNotRestart } }, }, @@ -331,8 +331,8 @@ export async function activate(context: ExtensionContext) { try { await startClient(context) - } catch (err: any) { - getLogger().error(`CloudFormation language server failed to start: ${toString(err)}`) + } catch (err) { + getLogger('awsCfnLsp').error(ToolkitError.chain(err, 'CloudFormation language server failed to start')) } } diff --git a/packages/core/src/awsService/cloudformation/lsp-server/CLibCheck.ts b/packages/core/src/awsService/cloudformation/lsp-server/CLibCheck.ts new file mode 100644 index 00000000000..5a21ca9b799 --- /dev/null +++ b/packages/core/src/awsService/cloudformation/lsp-server/CLibCheck.ts @@ -0,0 +1,141 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import { execSync } from 'child_process' // eslint-disable-line no-restricted-imports, aws-toolkits/no-string-exec-for-child-process +import * as fs from 'fs' // eslint-disable-line no-restricted-imports +import * as semver from 'semver' +import { getLogger } from '../../../shared/logger/logger' + +interface VersionResult { + maxFound: string | undefined + allAvailable: string[] +} + +export class CLibCheck { + /** + * Checks the GNU C Library (glibc) version. + * Uses `ldd --version` to parse the version number. + */ + public static getGLibCVersion(): string | undefined { + try { + const output = execSync('ldd --version', { + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + timeout: 5000, + }) + // Output usually looks like: "ldd (Ubuntu GLIBC 2.35-0ubuntu3.1) 2.35" + // We look for the first version number pattern on the first line. + const firstLine = output.split('\n')[0] + const match = firstLine.match(/(\d+\.\d+)/) + return match ? semver.coerce(match[0])?.version || match[0] : undefined + } catch (error) { + getLogger('awsCfnLsp').warn('Could not run ldd. Is this a glibc-based distro?') + return undefined + } + } + + /** + * Checks available GLIBCXX versions in libstdc++. + * 1. Finds libstdc++.so.6 location. + * 2. Scans the binary for "GLIBCXX_*" strings. + * 3. Sorts them to find the maximum version supported. + */ + public static getGLibCXXVersions(): VersionResult { + const libPath = this.findLibStdCpp() + + if (!libPath) { + return { maxFound: undefined, allAvailable: [] } + } + + try { + // Method 1: Try using the `strings` command (fastest, but requires binutils) + const output = execSync(`strings "${libPath}" | grep GLIBCXX`, { + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + timeout: 10000, + }) + return this.parseGLibCXXOutput(output) + } catch (e) { + // Method 2: Fallback to Node.js FS reading (works in minimal containers w/o strings) + try { + const content = fs.readFileSync(libPath, 'binary') // Read as binary string + // Regex to find all GLIBCXX_x.x.x occurrences + const matches = content.match(/GLIBCXX_\d+\.\d+(\.\d+)?/g) + if (matches) { + return this.parseGLibCXXOutput(matches.join('\n')) + } + } catch (readError) { + getLogger('awsCfnLsp').error(`Failed to read library at ${libPath}`) + } + } + + return { maxFound: undefined, allAvailable: [] } + } + + private static parseGLibCXXOutput(rawOutput: string): VersionResult { + const rawVersions = rawOutput + .trim() + .split('\n') + .map((line) => line.trim()) + // 1. Strict Filter: Must be GLIBCXX_ followed immediately by a digit + .filter((line) => /^GLIBCXX_\d/.test(line)) + // 2. Extraction: Capture strictly the numeric part + .map((line) => { + const match = line.match(/^GLIBCXX_(\d+\.\d+(?:\.\d+)?)/) + return match ? match[1] : undefined + }) + .filter((v): v is string => v !== undefined) + + // 3. Deduplicate + const uniqueVersions = [...new Set(rawVersions)] + + // 4. Sort using Semver + // We use coerce() because "3.4" is not valid strict semver, but "3.4.0" is. + const sorted = uniqueVersions.sort((a, b) => { + const verA = semver.coerce(a) + const verB = semver.coerce(b) + // Handle unlikely case where coerce fails (returns null) by pushing it to the bottom + if (!verA || !verB) { + return 0 + } + return semver.compare(verA, verB) + }) + + return { + maxFound: sorted.length > 0 ? sorted[sorted.length - 1] : undefined, + allAvailable: sorted, + } + } + + private static findLibStdCpp(): string | undefined { + // 1. Try ldconfig cache (most reliable on standard linux) + try { + const ldconfig = execSync('/sbin/ldconfig -p | grep libstdc++.so.6', { encoding: 'utf8', timeout: 5000 }) + // Output: "libstdc++.so.6 (libc6,x86-64) => /lib/x86_64-linux-gnu/libstdc++.so.6" + const match = ldconfig.match(/=>\s+(.+)$/m) + if (match && match[1]) { + return match[1].trim() + } + } catch (e) { + /* ignore */ + } + + // 2. Search common paths (fallback for containers/weird setups) + const commonPaths = [ + '/usr/lib/x86_64-linux-gnu/libstdc++.so.6', + '/usr/lib64/libstdc++.so.6', + '/usr/lib/libstdc++.so.6', + '/lib/x86_64-linux-gnu/libstdc++.so.6', + ] + + for (const p of commonPaths) { + if (fs.existsSync(p)) { + return p + } + } + + return undefined + } +} diff --git a/packages/core/src/awsService/cloudformation/lsp-server/githubManifestAdapter.ts b/packages/core/src/awsService/cloudformation/lsp-server/githubManifestAdapter.ts index 7c5f70de45c..88dfeb441c2 100644 --- a/packages/core/src/awsService/cloudformation/lsp-server/githubManifestAdapter.ts +++ b/packages/core/src/awsService/cloudformation/lsp-server/githubManifestAdapter.ts @@ -3,10 +3,19 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { Manifest, LspVersion, Target } from '../../../shared/lsp/types' import { CfnLspName, CfnLspServerEnvType } from './lspServerConfig' -import { addWindows, dedupeAndGetLatestVersions } from './utils' +import { + addWindows, + CfnManifest, + CfnTarget, + CfnLspVersion, + dedupeAndGetLatestVersions, + extractPlatformAndArch, + useOldLinuxVersion, + mapLegacyLinux, +} from './utils' import { getLogger } from '../../../shared/logger/logger' +import { ToolkitError } from '../../../shared/errors' export class GitHubManifestAdapter { constructor( @@ -15,7 +24,56 @@ export class GitHubManifestAdapter { readonly environment: CfnLspServerEnvType ) {} - async getManifest(): Promise { + async getManifest(): Promise { + let manifest: CfnManifest + try { + manifest = await this.getManifestJson() + } catch (err) { + getLogger('awsCfnLsp').error(ToolkitError.chain(err, 'Failed to get CloudFormation manifest')) + manifest = await this.getFromReleases() + } + + getLogger('awsCfnLsp').info( + 'Candidate versions: %s', + manifest.versions + .map( + (v) => + `${v.serverVersion}[${v.targets + .sort() + .map((t) => `${t.platform}-${t.arch}-${t.nodejs}`) + .join(',')}]` + ) + .join(', ') + ) + + if (process.platform !== 'linux') { + return manifest + } + + const useFallbackLinux = useOldLinuxVersion() + if (!useFallbackLinux) { + return manifest + } + + getLogger('awsCfnLsp').info('In a legacy or sandbox Linux environment') + manifest.versions = mapLegacyLinux(manifest.versions) + + getLogger('awsCfnLsp').info( + 'Remapped candidate versions: %s', + manifest.versions + .map( + (v) => + `${v.serverVersion}[${v.targets + .sort() + .map((t) => `${t.platform}-${t.arch}-${t.nodejs}`) + .join(',')}]` + ) + .join(', ') + ) + return manifest + } + + private async getFromReleases(): Promise { const releases = await this.fetchGitHubReleases() const envReleases = this.filterByEnvironment(releases) const sortedReleases = envReleases.sort((a, b) => { @@ -58,7 +116,7 @@ export class GitHubManifestAdapter { return response.json() } - private convertRelease(release: GitHubRelease): LspVersion { + private convertRelease(release: GitHubRelease): CfnLspVersion { return { serverVersion: release.tag_name, isDelisted: false, @@ -66,13 +124,14 @@ export class GitHubManifestAdapter { } } - private extractTargets(assets: GitHubAsset[]): Target[] { - return this.filterByNodeVersion(assets).map((asset) => { - const { arch, platform } = this.extractPlatformAndArch(asset.name) + private extractTargets(assets: GitHubAsset[]): CfnTarget[] { + return assets.map((asset) => { + const { arch, platform, nodejs } = extractPlatformAndArch(asset.name) return { platform, arch, + nodejs, contents: [ { filename: asset.name, @@ -85,58 +144,28 @@ export class GitHubManifestAdapter { }) } - private filterByNodeVersion(assets: GitHubAsset[]): GitHubAsset[] { - const hasNodeVersion = assets.map((asset) => asset.name).some((name) => name.includes('-node')) - const nodeVersion = process.version.replaceAll('v', '').split('.')[0] - - if (hasNodeVersion) { - const matchedVersion = assets.filter((asset) => { - return asset.name.includes(`-node${nodeVersion}`) - }) - - if (matchedVersion.length > 0) { - return matchedVersion - } - - const latestVersion = this.getLatestNodeVersion(assets) - getLogger().warn(`Could not find bundle for Node.js version ${nodeVersion}, using latest ${latestVersion}`) - return assets.filter((asset) => asset.name.includes(`-node${latestVersion}`)) + private async getManifestJson(): Promise { + const response = await fetch( + `https://raw.githubusercontent.com/${this.repoOwner}/${this.repoName}/refs/heads/main/assets/release-manifest.json` + ) + if (!response.ok) { + throw new Error(`GitHub API error: ${response.status}`) } - return assets - } - - private extractPlatformAndArch(filename: string): { - arch: string - platform: string - } { - const lower = filename.toLowerCase().replaceAll(/-node.*$/g, '') - const parts = lower.split('-') + const json = (await response.json()) as Record - const arch = parts.pop() - const platform = parts.pop() - - if (!platform || !arch) { - throw new Error(`Unknown arch and platform ${arch} ${platform}`) + return { + manifestSchemaVersion: json.manifestSchemaVersion as string, + artifactId: json.artifactId as string, + artifactDescription: json.artifactDescription as string, + isManifestDeprecated: json.isManifestDeprecated as boolean, + versions: json[this.environment] as CfnLspVersion[], } - - return { arch, platform } - } - - private getLatestNodeVersion(assets: GitHubAsset[]): number { - const versions = assets - .map((asset) => { - const match = asset.name.match(/-node(\d+)/) - return match ? parseInt(match[1]) : undefined - }) - .filter((v): v is number => v !== undefined) - - return Math.max(...versions) } } /* eslint-disable @typescript-eslint/naming-convention */ -export interface GitHubAsset { +interface GitHubAsset { url: string browser_download_url: string id: number @@ -151,7 +180,7 @@ export interface GitHubAsset { updated_at: string } -export interface GitHubRelease { +interface GitHubRelease { url: string html_url: string assets_url: string diff --git a/packages/core/src/awsService/cloudformation/lsp-server/lspInstaller.ts b/packages/core/src/awsService/cloudformation/lsp-server/lspInstaller.ts index e13494ddb61..fa54beba44b 100644 --- a/packages/core/src/awsService/cloudformation/lsp-server/lspInstaller.ts +++ b/packages/core/src/awsService/cloudformation/lsp-server/lspInstaller.ts @@ -13,6 +13,7 @@ import { getLogger } from '../../../shared/logger/logger' import { ResourcePaths } from '../../../shared/lsp/types' import * as nodeFs from 'fs' // eslint-disable-line no-restricted-imports import globals from '../../../shared/extensionGlobals' +import { toString } from '../utils' function determineEnvironment(): CfnLspServerEnvType { if (isDebugInstance()) { @@ -72,7 +73,8 @@ export class CfnLspInstaller extends BaseLspInstaller { throw error } }, - } as any + } as any, + 'sha256' ) } @@ -95,7 +97,7 @@ export class CfnLspInstaller extends BaseLspInstaller { const folders = entries.filter((entry) => entry.isDirectory()) if (folders.length !== 1) { - throw new Error(`1 or more CloudFormation LSP folders found ${folders}`) + throw new Error(`${folders.length} CloudFormation LSP folders found ${toString(folders)}`) } return { diff --git a/packages/core/src/awsService/cloudformation/lsp-server/lspServerProvider.ts b/packages/core/src/awsService/cloudformation/lsp-server/lspServerProvider.ts index 35b21e48bcf..3ecd11208aa 100644 --- a/packages/core/src/awsService/cloudformation/lsp-server/lspServerProvider.ts +++ b/packages/core/src/awsService/cloudformation/lsp-server/lspServerProvider.ts @@ -59,7 +59,7 @@ export class LspServerProvider implements LspServerResolverI, Disposable { this._serverRootDir = dir return } catch (err) { - getLogger().error( + getLogger('awsCfnLsp').error( ToolkitError.chain(err, `Failed to resolve CloudFormation LSP provider ${provider.name()}`) ) } diff --git a/packages/core/src/awsService/cloudformation/lsp-server/utils.ts b/packages/core/src/awsService/cloudformation/lsp-server/utils.ts index 04ca6aacdc1..9775fb0036b 100644 --- a/packages/core/src/awsService/cloudformation/lsp-server/utils.ts +++ b/packages/core/src/awsService/cloudformation/lsp-server/utils.ts @@ -3,29 +3,48 @@ * SPDX-License-Identifier: Apache-2.0 */ -import { LspVersion, Target } from '../../../shared/lsp/types' +import { LspVersion, Target, Manifest } from '../../../shared/lsp/types' +import * as semver from 'semver' +import { CLibCheck } from './CLibCheck' +import { toString } from '../utils' +import { getLogger } from '../../../shared/logger/logger' + +export interface CfnTarget extends Target { + nodejs?: string +} +export interface CfnLspVersion extends LspVersion { + targets: CfnTarget[] +} +export interface CfnManifest extends Manifest { + versions: CfnLspVersion[] +} -export function addWindows(targets: Target[]): Target[] { +export function addWindows(targets: CfnTarget[]): CfnTarget[] { const win32Targets = targets.filter((target) => { return target.platform === 'win32' }) - if (win32Targets.length < 1) { + const windowsTargets = targets.filter((target) => { + return target.platform === 'windows' + }) + + if (win32Targets.length < 1 || windowsTargets.length > 0) { return targets } - const windowsTargets: Target[] = win32Targets.map((target) => { - return { - ...target, - platform: 'windows', - } - }) - - return [...targets, ...windowsTargets] + return [ + ...targets, + ...win32Targets.map((target) => { + return { + ...target, + platform: 'windows', + } + }), + ] } -export function dedupeAndGetLatestVersions(versions: LspVersion[]): LspVersion[] { - const grouped: Record = {} +export function dedupeAndGetLatestVersions(versions: CfnLspVersion[]): CfnLspVersion[] { + const grouped: Record = {} // Group by normalized version for (const version of versions) { @@ -36,7 +55,7 @@ export function dedupeAndGetLatestVersions(versions: LspVersion[]): LspVersion[] grouped[normalizedV].push(version) } - const groupedAndSorted: Record = Object.fromEntries( + const groupedAndSorted: Record = Object.fromEntries( Object.entries(grouped).sort(([v1], [v2]) => { return compareVersionsDesc(v1, v2) }) @@ -81,3 +100,76 @@ function convertVersionToNumbers(version: string): number[] { function getMajorMinorPatchVersion(version: string): string { return removeWordsFromVersion(version).split('-')[0] } + +export function extractPlatformAndArch(filename: string): { platform: string; arch: string; nodejs?: string } { + const match = filename.match(/^cloudformation-languageserver-(.*)-(.*)-(x64|arm64)(?:-node(\d+))?\.zip$/) + if (match === null) { + throw new Error(`Could not extract platform from ${filename}`) + } + + const platform = match[2] + const arch = match[3] + const nodejs = match[4] + + if (!platform || !arch) { + throw new Error(`Unknown arch and platform ${arch} ${platform}`) + } + + return { arch, platform, nodejs } +} + +export function useOldLinuxVersion(): boolean { + if (process.platform !== 'linux') { + return false + } + + if (process.env.SNAP !== undefined) { + return true + } + + const glibcxx = CLibCheck.getGLibCXXVersions() + const maxAvailGLibCXX = glibcxx.maxFound + if (!maxAvailGLibCXX) { + return false + } + + getLogger('awsCfnLsp').info(`Found GLIBCXX ${toString(glibcxx)}`) + return semver.lt(maxAvailGLibCXX, '3.4.29') +} + +const LegacyLinuxGLibPlatform = 'linuxglib2.28' + +export function mapLegacyLinux(versions: CfnLspVersion[]): CfnLspVersion[] { + const remappedVersions: CfnLspVersion[] = [] + + for (const version of versions) { + const hasLegacyLinux = version.targets.some((t) => t.platform === LegacyLinuxGLibPlatform) + + if (!hasLegacyLinux) { + getLogger('awsCfnLsp').warn(`Found no compatible legacy linux builds for ${version.serverVersion}`) + remappedVersions.push(version) + } else { + const newTargets = version.targets + .filter((target) => { + return target.platform !== 'linux' + }) + .map((target) => { + if (target.platform !== LegacyLinuxGLibPlatform) { + return target + } + + return { + ...target, + platform: 'linux', + } + }) + + remappedVersions.push({ + ...version, + targets: newTargets, + }) + } + } + + return remappedVersions +} diff --git a/packages/core/src/awsService/cloudformation/stacks/actions/validationWorkflow.ts b/packages/core/src/awsService/cloudformation/stacks/actions/validationWorkflow.ts index 1586f2a53ed..70f0565678a 100644 --- a/packages/core/src/awsService/cloudformation/stacks/actions/validationWorkflow.ts +++ b/packages/core/src/awsService/cloudformation/stacks/actions/validationWorkflow.ts @@ -4,7 +4,7 @@ */ import { v4 as uuidv4 } from 'uuid' -import { Parameter, Capability } from '@aws-sdk/client-cloudformation' +import { Parameter, Capability, ChangeSetStatus } from '@aws-sdk/client-cloudformation' import { StackActionPhase, StackChange, @@ -163,7 +163,8 @@ export class Validation { this.changeSetName, this.shouldEnableDeployment, validationDetail, - deploymentMode + deploymentMode, + ChangeSetStatus.CREATE_COMPLETE ) void commands.executeCommand(commandKey('diff.focus')) } diff --git a/packages/core/src/awsService/cloudformation/ui/diffWebviewProvider.ts b/packages/core/src/awsService/cloudformation/ui/diffWebviewProvider.ts index 3a70650eccd..f7c06f5f6f8 100644 --- a/packages/core/src/awsService/cloudformation/ui/diffWebviewProvider.ts +++ b/packages/core/src/awsService/cloudformation/ui/diffWebviewProvider.ts @@ -9,6 +9,7 @@ import { DiffViewHelper } from './diffViewHelper' import { commandKey } from '../utils' import { StackViewCoordinator } from './stackViewCoordinator' import { showWarningConfirmation } from './message' +import { ChangeSetStatus } from '@aws-sdk/client-cloudformation' const webviewCommandOpenDiff = 'openDiff' @@ -24,6 +25,7 @@ export class DiffWebviewProvider implements WebviewViewProvider, Disposable { private readonly disposables: Disposable[] = [] private validationDetail: ValidationDetail[] = [] private deploymentMode?: DeploymentMode + private changeSetStatus?: string constructor(private readonly coordinator: StackViewCoordinator) { this.disposables.push( @@ -46,7 +48,8 @@ export class DiffWebviewProvider implements WebviewViewProvider, Disposable { changeSetName?: string, enableDeployments = false, validationDetail?: ValidationDetail[], - deploymentMode?: DeploymentMode + deploymentMode?: DeploymentMode, + changeSetStatus?: string ) { this.stackName = stackName this.changes = changes @@ -58,6 +61,7 @@ export class DiffWebviewProvider implements WebviewViewProvider, Disposable { this.validationDetail = validationDetail } this.deploymentMode = deploymentMode + this.changeSetStatus = changeSetStatus await this.coordinator.setChangeSetMode(stackName, true) if (this._view) { @@ -120,6 +124,23 @@ export class DiffWebviewProvider implements WebviewViewProvider, Disposable { const displayedChanges = changes.slice(startIndex, endIndex) const hasNext = this.currentPage < this.totalPages - 1 const hasPrev = this.currentPage > 0 + const terminalChangeSetStatuses: string[] = [ + ChangeSetStatus.CREATE_COMPLETE, + ChangeSetStatus.FAILED, + ChangeSetStatus.DELETE_FAILED, + ] + + const deletionButton = ` + + ` if (!changes || changes.length === 0) { return ` @@ -137,6 +158,23 @@ export class DiffWebviewProvider implements WebviewViewProvider, Disposable {

No changes detected for stack: ${this.stackName}

+ ${ + this.changeSetName && + this.changeSetStatus && + terminalChangeSetStatuses.includes(this.changeSetStatus) + ? ` +
+ ${deletionButton} +
+ + ` + : '' + } ` @@ -351,9 +389,15 @@ export class DiffWebviewProvider implements WebviewViewProvider, Disposable { ` const deploymentButtons = - this.changeSetName && this.enableDeployments + this.changeSetName && + this.enableDeployments && + this.changeSetStatus && + terminalChangeSetStatuses.includes(this.changeSetStatus) ? `
+ ${ + this.changeSetStatus === ChangeSetStatus.CREATE_COMPLETE + ? ` - + ">Deploy Changes` + : '' + } + ${deletionButton}
` : '' diff --git a/packages/core/src/awsService/cloudformation/ui/inputBox.ts b/packages/core/src/awsService/cloudformation/ui/inputBox.ts index b010ce4f639..cbe7eb2444c 100644 --- a/packages/core/src/awsService/cloudformation/ui/inputBox.ts +++ b/packages/core/src/awsService/cloudformation/ui/inputBox.ts @@ -9,7 +9,7 @@ import { validateParameterValue, validateChangeSetName, } from '../stacks/actions/stackActionInputValidation' -import { Parameter, Capability, Tag, OnStackFailure } from '@aws-sdk/client-cloudformation' +import { Parameter, Capability, Tag, OnStackFailure, Stack, StackStatus } from '@aws-sdk/client-cloudformation' import { TemplateParameter, ResourceToImport, @@ -255,13 +255,13 @@ export async function getImportExistingResources(): Promise )?.value } -export async function getOnStackFailure(stackExists?: boolean): Promise { +export async function getOnStackFailure(stackDetails?: Stack): Promise { const options: Array<{ label: string; description: string; value: OnStackFailure }> = [ { label: 'Do nothing', description: 'Leave stack in failed state', value: OnStackFailure.DO_NOTHING }, { label: 'Rollback', description: 'Rollback to previous state', value: OnStackFailure.ROLLBACK }, ] - if (!stackExists) { + if (!stackDetails || stackDetails.StackStatus === StackStatus.REVIEW_IN_PROGRESS) { // only a valid option for CREATE options.unshift({ label: 'Delete', description: 'Delete the stack on failure', value: OnStackFailure.DELETE }) } @@ -276,7 +276,7 @@ export async function getDeploymentMode(): Promise { [ { label: 'Revert Drift', - description: 'Revert drift during deployment', + description: 'Revert drift during deployment (disables dev friendly flags)', value: DeploymentMode.REVERT_DRIFT, }, { label: 'Standard', description: 'No special handling during deployment', value: undefined }, diff --git a/packages/core/src/awsService/cloudformation/ui/stackEventsWebviewProvider.ts b/packages/core/src/awsService/cloudformation/ui/stackEventsWebviewProvider.ts index b17ac79950d..90417924e68 100644 --- a/packages/core/src/awsService/cloudformation/ui/stackEventsWebviewProvider.ts +++ b/packages/core/src/awsService/cloudformation/ui/stackEventsWebviewProvider.ts @@ -9,20 +9,30 @@ import { LanguageClient } from 'vscode-languageclient/node' import { extractErrorMessage, getStackStatusClass, isStackInTransientState } from '../utils' import { GetStackEventsRequest, ClearStackEventsRequest } from '../stacks/actions/stackActionProtocol' import { StackViewCoordinator } from './stackViewCoordinator' -import { arnToConsoleTabUrl, externalLinkSvg, consoleLinkStyles } from '../consoleLinksUtils' +import { arnToConsoleTabUrl, operationIdToConsoleUrl, externalLinkSvg, consoleLinkStyles } from '../consoleLinksUtils' const EventsPerPage = 50 const RefreshIntervalMs = 5000 +interface StackEventWithOperationId extends StackEvent { + OperationId?: string +} + +interface GroupedEvent extends StackEventWithOperationId { + isParent?: boolean + groupId: string + groupParentId?: string +} + export class StackEventsWebviewProvider implements WebviewViewProvider, Disposable { private view?: WebviewView private stackName?: string private stackArn?: string - private allEvents: StackEvent[] = [] + private allEvents: StackEventWithOperationId[] = [] private currentPage = 0 private nextToken?: string private refreshTimer?: NodeJS.Timeout - private readonly disposables: Disposable[] = [] + private expandedGroups = new Set() private readonly coordinatorSubscription: Disposable constructor( @@ -57,13 +67,16 @@ export class StackEventsWebviewProvider implements WebviewViewProvider, Disposab this.allEvents = [] this.currentPage = 0 this.nextToken = undefined + this.expandedGroups.clear() try { - const result = await this.client.sendRequest(GetStackEventsRequest, { - stackName: this.stackName, - }) + const result = await this.client.sendRequest(GetStackEventsRequest, { stackName }) this.allEvents = result.events this.nextToken = result.nextToken + + if (this.allEvents.length > 0 && this.allEvents[0].OperationId) { + this.expandedGroups.add(`op-${this.allEvents[0].OperationId}`) + } } catch (error) { this.renderError(`Failed to load events: ${extractErrorMessage(error)}`) } @@ -80,17 +93,25 @@ export class StackEventsWebviewProvider implements WebviewViewProvider, Disposab }) webviewView.onDidChangeVisibility(() => { if (webviewView.visible) { + this.render() this.startAutoRefresh() } else { this.stopAutoRefresh() } }) - webviewView.webview.onDidReceiveMessage(async (message: { command: string }) => { + webviewView.webview.onDidReceiveMessage(async (message: { command: string; groupId?: string }) => { if (message.command === 'nextPage') { await this.nextPage() } else if (message.command === 'prevPage') { await this.prevPage() + } else if (message.command === 'toggle' && message.groupId) { + if (this.expandedGroups.has(message.groupId)) { + this.expandedGroups.delete(message.groupId) + } else { + this.expandedGroups.add(message.groupId) + } + this.render() } }) @@ -102,9 +123,6 @@ export class StackEventsWebviewProvider implements WebviewViewProvider, Disposab if (this.stackName) { void this.client.sendRequest(ClearStackEventsRequest, { stackName: this.stackName }) } - for (const d of this.disposables) { - d.dispose() - } this.coordinatorSubscription.dispose() } @@ -190,8 +208,54 @@ export class StackEventsWebviewProvider implements WebviewViewProvider, Disposab } } + private groupEvents(events: StackEventWithOperationId[]): GroupedEvent[] { + const operationGroups = new Map() + const eventsWithoutOperationId: StackEventWithOperationId[] = [] + + for (const event of events) { + if (event.OperationId) { + if (!operationGroups.has(event.OperationId)) { + operationGroups.set(event.OperationId, []) + } + operationGroups.get(event.OperationId)!.push(event) + } else { + eventsWithoutOperationId.push(event) + } + } + + const grouped: GroupedEvent[] = [] + + for (const [operationId, operationEvents] of operationGroups.entries()) { + const groupId = `op-${operationId}` + grouped.push({ + ...operationEvents[0], + groupId, + isParent: true, + }) + + for (const [index, event] of operationEvents.entries()) { + grouped.push({ + ...event, + groupId: `${groupId}-${index}`, + groupParentId: groupId, + isParent: false, + }) + } + } + + for (const [index, event] of eventsWithoutOperationId.entries()) { + grouped.push({ + ...event, + groupId: `flat-${index}`, + isParent: true, + }) + } + + return grouped + } + private renderError(message: string): void { - if (!this.view || this.view.visible === false) { + if (!this.view || !this.view.visible) { return } this.view.webview.html = ` @@ -214,14 +278,16 @@ export class StackEventsWebviewProvider implements WebviewViewProvider, Disposab } private render(notification?: string): void { - if (!this.view || this.view.visible === false) { + if (!this.view || !this.view.visible) { return } + const groupedEvents = this.groupEvents(this.allEvents) + const hasHooks = this.allEvents.some((e) => e.HookType) const start = this.currentPage * EventsPerPage const end = start + EventsPerPage - const pageEvents = this.allEvents.slice(start, end) - const totalPages = Math.ceil(this.allEvents.length / EventsPerPage) + const pageEvents = groupedEvents.slice(start, end) + const totalPages = Math.ceil(groupedEvents.length / EventsPerPage) const hasMore = this.nextToken !== undefined this.view.webview.html = this.getHtml( @@ -230,162 +296,236 @@ export class StackEventsWebviewProvider implements WebviewViewProvider, Disposab totalPages, hasMore, this.allEvents.length, + hasHooks, notification ) } private getHtml( - events: StackEvent[], + events: GroupedEvent[], currentPage: number, totalPages: number, hasMore: boolean, totalEvents: number, + hasHooks: boolean, notification?: string ): string { - return ` - - - - + + +
+
+
+ ${this.stackName ?? ''} + ${this.stackArn + ? `${externalLinkSvg()}` + : ''} + (${totalEvents} events${hasMore ? ' loaded' : ''}) +
+ +
+
+ ${notification ? `
${notification}
` : ''} +
+ ${emptyMessage || + ` + + + + + + +${hasHooks ? '' : ''} + + +${events.map((e) => this.renderEventRow(e, hasHooks)).join('')} + +
Operation IDTimestampLogical IDStatusStatus ReasonHook Invocation
`} +
+ + + ` + } + + private renderEventRow(event: GroupedEvent, hasHooks: boolean): string { + const hookCell = hasHooks + ? `${event.HookType ? `${event.HookType} (${event.HookStatus ?? '-'})` : '-'}` + : '' + + if (event.isParent) { + const expanded = this.expandedGroups.has(event.groupId) + const chevron = event.OperationId ? `â–¶` : '' + const opUrl = + event.OperationId && this.stackArn + ? operationIdToConsoleUrl(this.stackArn, event.OperationId) + : undefined + const opIdDisplay = opUrl ? `${event.OperationId}` : (event.OperationId ?? '-') + + return ` +${chevron} ${opIdDisplay} +${event.Timestamp ? new Date(event.Timestamp).toLocaleString() : '-'} +${event.LogicalResourceId ?? '-'} +${event.ResourceStatus ?? '-'} +${event.ResourceStatusReason ?? '-'} +${hookCell} +` } - - - -
-
-
- ${this.stackName ?? ''} - ${this.stackArn ? `${externalLinkSvg()}` : ''} - (${totalEvents} events${hasMore ? ' loaded' : ''}) -
- -
-
- ${notification ? `
${notification}
` : ''} -
- - - - - - - - - - - - ${events - .map( - (e) => ` - - - - - - - - ` - ) - .join('')} - -
TimestampResourceTypeStatusReason
${e.Timestamp ? new Date(e.Timestamp).toLocaleString() : '-'}${e.LogicalResourceId ?? '-'}${e.ResourceType ?? '-'}${e.ResourceStatus ?? '-'}${e.ResourceStatusReason ?? '-'}
-
- - -` + + const opUrl = + event.OperationId && this.stackArn ? operationIdToConsoleUrl(this.stackArn, event.OperationId) : undefined + const opIdDisplay = opUrl ? `${event.OperationId}` : (event.OperationId ?? '-') + + return ` +${opIdDisplay} +${event.Timestamp ? new Date(event.Timestamp).toLocaleString() : '-'} +${event.LogicalResourceId ?? '-'} +${event.ResourceStatus ?? '-'} +${event.ResourceStatusReason ?? '-'} +${hookCell} +` } } diff --git a/packages/core/src/awsService/cloudformation/ui/stackOutputsWebviewProvider.ts b/packages/core/src/awsService/cloudformation/ui/stackOutputsWebviewProvider.ts index 8c54b5d9067..bd42f9d6c21 100644 --- a/packages/core/src/awsService/cloudformation/ui/stackOutputsWebviewProvider.ts +++ b/packages/core/src/awsService/cloudformation/ui/stackOutputsWebviewProvider.ts @@ -44,6 +44,12 @@ export class StackOutputsWebviewProvider implements WebviewViewProvider, Disposa this.view = webviewView webviewView.webview.options = { enableScripts: true } + webviewView.onDidChangeVisibility(() => { + if (webviewView.visible) { + this.render() + } + }) + if (this.stackName) { await this.loadOutputs() } else { diff --git a/packages/core/src/awsService/cloudformation/ui/stackOverviewWebviewProvider.ts b/packages/core/src/awsService/cloudformation/ui/stackOverviewWebviewProvider.ts index d240be89247..3b3cbaa52da 100644 --- a/packages/core/src/awsService/cloudformation/ui/stackOverviewWebviewProvider.ts +++ b/packages/core/src/awsService/cloudformation/ui/stackOverviewWebviewProvider.ts @@ -87,6 +87,7 @@ export class StackOverviewWebviewProvider implements WebviewViewProvider, Dispos webviewView.onDidChangeVisibility(() => { if (webviewView.visible && this.currentStackName) { + this.render() this.startAutoRefresh() } else { this.stopAutoRefresh() diff --git a/packages/core/src/awsService/cloudformation/ui/stackResourcesWebviewProvider.ts b/packages/core/src/awsService/cloudformation/ui/stackResourcesWebviewProvider.ts index 5c78f99635f..25aaefe5044 100644 --- a/packages/core/src/awsService/cloudformation/ui/stackResourcesWebviewProvider.ts +++ b/packages/core/src/awsService/cloudformation/ui/stackResourcesWebviewProvider.ts @@ -99,6 +99,7 @@ export class StackResourcesWebviewProvider implements WebviewViewProvider, Dispo private setupLifecycleHandlers(webviewView: WebviewView) { webviewView.onDidChangeVisibility(() => { if (webviewView.visible) { + this.render() this.startAutoUpdate() } else { this.stopAutoUpdate() diff --git a/packages/core/src/awsService/sagemaker/commands.ts b/packages/core/src/awsService/sagemaker/commands.ts index 64449eaf971..b308a74146f 100644 --- a/packages/core/src/awsService/sagemaker/commands.ts +++ b/packages/core/src/awsService/sagemaker/commands.ts @@ -27,7 +27,6 @@ import { ToolkitError, isUserCancelledError } from '../../shared/errors' import { showConfirmationMessage } from '../../shared/utilities/messages' import { ConnectFromRemoteWorkspaceMessage, - InstanceTypeError, InstanceTypeInsufficientMemory, InstanceTypeInsufficientMemoryMessage, RemoteAccess, @@ -254,19 +253,29 @@ export async function openRemoteConnect( return } - const spaceName = node.spaceApp.SpaceName! - await tryRefreshNode(node) + try { + const spaceName = node.spaceApp.SpaceName! + await tryRefreshNode(node) - const remoteAccess = node.spaceApp.SpaceSettingsSummary?.RemoteAccess - const nodeStatus = node.getStatus() + const remoteAccess = node.spaceApp.SpaceSettingsSummary?.RemoteAccess + const nodeStatus = node.getStatus() - // Route to appropriate handler based on space state - if (nodeStatus === SpaceStatus.RUNNING && remoteAccess !== RemoteAccess.ENABLED) { - return handleRunningSpaceWithDisabledAccess(node, ctx, spaceName, sageMakerClient) - } else if (nodeStatus === SpaceStatus.STOPPED) { - return handleStoppedSpace(node, ctx, spaceName, sageMakerClient) - } else if (nodeStatus === SpaceStatus.RUNNING) { - return handleRunningSpaceWithEnabledAccess(node, ctx, spaceName) + // Route to appropriate handler based on space state + if (nodeStatus === SpaceStatus.RUNNING && remoteAccess !== RemoteAccess.ENABLED) { + return await handleRunningSpaceWithDisabledAccess(node, ctx, spaceName, sageMakerClient) + } else if (nodeStatus === SpaceStatus.STOPPED) { + return await handleStoppedSpace(node, ctx, spaceName, sageMakerClient) + } else if (nodeStatus === SpaceStatus.RUNNING) { + return await handleRunningSpaceWithEnabledAccess(node, ctx, spaceName) + } + } catch (err: any) { + // Suppress errors that don't need additional error messages: + // - User cancellations (checked by isUserCancelledError) + // - SSH config errors (already shown via modal in prepareDevEnvConnection) + if (isUserCancelledError(err) || (err instanceof ToolkitError && err.code === 'SshConfigError')) { + return + } + throw err } } @@ -390,8 +399,10 @@ async function handleRunningSpaceWithDisabledAccess( ) await tryRemoteConnection(node, ctx, progress) } catch (err: any) { - // Handle user declining instance type upgrade - if (err.code === InstanceTypeError) { + // Suppress errors that don't need additional error messages: + // - User cancellations (checked by isUserCancelledError) + // - SSH config errors (already shown via modal in prepareDevEnvConnection) + if (isUserCancelledError(err) || (err instanceof ToolkitError && err.code === 'SshConfigError')) { return } throw new ToolkitError(`Remote connection failed: ${err.message}`, { @@ -437,8 +448,10 @@ async function handleStoppedSpace( } ) } catch (err: any) { - // Handle user declining instance type upgrade - if (err.code === InstanceTypeError) { + // Suppress errors that don't need additional error messages: + // - User cancellations (checked by isUserCancelledError) + // - SSH config errors (already shown via modal in prepareDevEnvConnection) + if (isUserCancelledError(err) || (err instanceof ToolkitError && err.code === 'SshConfigError')) { return } throw new ToolkitError(`Remote connection failed: ${(err as Error).message}`, { diff --git a/packages/core/src/awsService/sagemaker/constants.ts b/packages/core/src/awsService/sagemaker/constants.ts index 78da6557d55..8e2ce84a0eb 100644 --- a/packages/core/src/awsService/sagemaker/constants.ts +++ b/packages/core/src/awsService/sagemaker/constants.ts @@ -7,6 +7,7 @@ export const ConnectFromRemoteWorkspaceMessage = 'Unable to establish new remote connection. Your last active VS Code window is connected to a remote workspace. To open a new SageMaker Studio connection, select your local VS Code window and try again.' export const InstanceTypeError = 'InstanceTypeError' +export const SshConfigError = 'SshConfigError' export const InstanceTypeMinimum = 'ml.t3.large' @@ -46,6 +47,10 @@ export const InstanceTypeNotSelectedMessage = (spaceName: string) => { export const RemoteAccessRequiredMessage = 'This space requires remote access to be enabled.\nWould you like to restart the space and connect?\nAny unsaved work will be lost.' +export const SshConfigErrorMessage = () => { + return `Unable to connect. Your SSH config file contains errors. Fix the errors to continue.` +} + export const SmusDeeplinkSessionExpiredError = { title: 'Session Disconnected', message: diff --git a/packages/core/src/awsService/sagemaker/model.ts b/packages/core/src/awsService/sagemaker/model.ts index 6504d01dafc..ae73513533c 100644 --- a/packages/core/src/awsService/sagemaker/model.ts +++ b/packages/core/src/awsService/sagemaker/model.ts @@ -6,7 +6,7 @@ // Disabled: detached server files cannot import vscode. /* eslint-disable no-restricted-imports */ import * as vscode from 'vscode' -import { sshAgentSocketVariable, startSshAgent, startVscodeRemote } from '../../shared/extensions/ssh' +import { getSshConfigPath, sshAgentSocketVariable, startSshAgent, startVscodeRemote } from '../../shared/extensions/ssh' import { createBoundProcess, ensureDependencies } from '../../shared/remoteSession' import { ensureConnectScript, SshConfig } from '../../shared/sshConfig' import { Result } from '../../shared/utilities/result' @@ -27,6 +27,7 @@ import { isKiro } from '../../shared/extensionUtilities' import { getIdeType } from '../../shared/extensionUtilities' import { ChildProcess } from '../../shared/utilities/processUtils' import { ensureSageMakerSshKiroExtension } from './sagemakerSshKiroUtils' +import { SshConfigError, SshConfigErrorMessage } from './constants' import globals from '../../shared/extensionGlobals' const logger = getLogger('sagemaker') @@ -193,6 +194,27 @@ export async function prepareDevEnvConnection( const err = config.err() const logPrefix = connectionType === 'sm_hp' ? 'hyperpod' : 'sagemaker' logger.error(`${logPrefix}: failed to add ssh config section: ${err.message}`) + + if (err instanceof ToolkitError && err.code === 'SshCheckFailed') { + const sshConfigPath = getSshConfigPath() + const openConfigButton = 'Open SSH Config' + const resp = await vscode.window.showErrorMessage( + SshConfigErrorMessage(), + { modal: true, detail: err.message }, + openConfigButton + ) + + if (resp === openConfigButton) { + void vscode.window.showTextDocument(vscode.Uri.file(sshConfigPath)) + } + + // Throw error to stop the connection flow + // User is already notified via modal above, downstream handlers check the error code + throw new ToolkitError('Unable to connect: SSH configuration contains errors', { + code: SshConfigError, + }) + } + throw err } } diff --git a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts index c2934dc24ba..ea61fb88451 100644 --- a/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts +++ b/packages/core/src/codewhisperer/service/transformByQ/transformApiHandler.ts @@ -919,17 +919,24 @@ export async function runClientSideBuild(projectCopyDir: string, clientInstructi throw err } } finally { - await fs.delete(projectCopyDir, { recursive: true }) - await fs.delete(uploadZipDir, { recursive: true }) - await fs.delete(uploadZipPath, { force: true }) - const exportZipDir = path.join( - os.tmpdir(), - `downloadClientInstructions_${transformByQState.getJobId()}_${clientInstructionArtifactId}` - ) - await fs.delete(exportZipDir, { recursive: true }) - getLogger().info( - `CodeTransformation: deleted projectCopy, clientInstructionsResult, and downloadClientInstructions directories/files` - ) + try { + await fs.delete(projectCopyDir, { recursive: true }) + await fs.delete(uploadZipDir, { recursive: true }) + await fs.delete(uploadZipPath, { force: true }) + const exportZipDir = path.join( + os.tmpdir(), + `downloadClientInstructions_${transformByQState.getJobId()}_${clientInstructionArtifactId}` + ) + await fs.delete(exportZipDir, { recursive: true }) + getLogger().info( + `CodeTransformation: deleted projectCopy, clientInstructionsResult, and downloadClientInstructions directories/files` + ) + } catch (e) { + getLogger().info( + 'CodeTransformation: error deleting temporary files after client-side build, continuing anyway: %O', + e + ) + } } } diff --git a/packages/core/src/commands.ts b/packages/core/src/commands.ts index f69a8dd173c..40a4517e590 100644 --- a/packages/core/src/commands.ts +++ b/packages/core/src/commands.ts @@ -144,6 +144,16 @@ export function registerCommands(context: vscode.ExtensionContext) { } ) + if (!isWeb()) { + context.subscriptions.push( + Commands.register('aws.toolkit.auth.consoleLogin', async (profileName?: string, region?: string) => { + // Dynamically import prevent the Node.js modules from being included in the web extension bundle + const { authenticateWithConsoleLogin } = await import('./auth/consoleSessionUtils.js') + return await authenticateWithConsoleLogin(profileName, region) + }) + ) + } + context.subscriptions.push( addConnection, manageConnections, diff --git a/packages/core/src/lambda/activation.ts b/packages/core/src/lambda/activation.ts index 9b010eceff8..e0c03986abf 100644 --- a/packages/core/src/lambda/activation.ts +++ b/packages/core/src/lambda/activation.ts @@ -233,7 +233,6 @@ export async function activate(context: ExtContext): Promise { Commands.register('aws.launchDebugConfigForm', async (node: ResourceNode) => registerSamDebugInvokeVueCommand(context.extensionContext, { resource: node }) ), - Commands.register('aws.appBuilder.tailLogs', async (node: LambdaFunctionNode | TreeNode) => { let functionConfiguration: FunctionConfiguration try { diff --git a/packages/core/src/lambda/explorer/lambdaCapacityProviderNode.ts b/packages/core/src/lambda/explorer/lambdaCapacityProviderNode.ts new file mode 100644 index 00000000000..17a5562eb10 --- /dev/null +++ b/packages/core/src/lambda/explorer/lambdaCapacityProviderNode.ts @@ -0,0 +1,46 @@ +/*! + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * SPDX-License-Identifier: Apache-2.0 + */ + +import * as vscode from 'vscode' +import { getIcon } from '../../shared/icons' + +import { AWSResourceNode } from '../../shared/treeview/nodes/awsResourceNode' +import { AWSTreeNodeBase } from '../../shared/treeview/nodes/awsTreeNodeBase' +import globals from '../../shared/extensionGlobals' +import { ToolkitError } from '../../shared/errors' + +export const contextValueLambdaCapacityProvider = 'awsCapacityProviderNode' + +export class LambdaCapacityProviderNode extends AWSTreeNodeBase implements AWSResourceNode { + public constructor( + public override readonly regionCode: string, + public readonly deployedResource: any, + public override readonly contextValue?: string + ) { + super( + deployedResource.LogicalResourceId, + contextValue === contextValueLambdaCapacityProvider + ? vscode.TreeItemCollapsibleState.Collapsed + : vscode.TreeItemCollapsibleState.None + ) + this.iconPath = getIcon('vscode-gear') + this.contextValue = contextValueLambdaCapacityProvider + } + + public get name() { + return this.deployedResource.LogicalResourceId + } + private get accountId(): string { + const accountId = globals.awsContext.getCredentialAccountId() + if (!accountId) { + throw new ToolkitError('Aws account ID not found') + } + return accountId + } + + public get arn() { + return `arn:aws:lambda:${this.regionCode}:${this.accountId}:capacity-provider:${this.deployedResource.PhysicalResourceId}` + } +} diff --git a/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts b/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts index 2084ebe82fe..2f00d8a4373 100644 --- a/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts +++ b/packages/core/src/lambda/vue/configEditor/samInvokeBackend.ts @@ -28,6 +28,7 @@ import * as CloudFormation from '../../../shared/cloudformation/cloudformation' import { openLaunchJsonFile } from '../../../shared/sam/debugger/commands/addSamDebugConfiguration' import { getSampleLambdaPayloads } from '../../utils' import { samLambdaCreatableRuntimes } from '../../models/samLambdaRuntime' +import { isFunctionResource } from '../../../awsService/appBuilder/explorer/samProject' import globals from '../../../shared/extensionGlobals' import { VueWebview } from '../../../webviews/main' import { Commands } from '../../../shared/vscode/commands2' @@ -441,6 +442,10 @@ export async function registerSamDebugInvokeVueCommand( (config) => (config.invokeTarget as TemplateTargetProperties).logicalId === resource.resource.Id ) + if (!isFunctionResource(resource.resource)) { + throw new ToolkitError('Resource is not a Lambda function') + } + const webview = new WebviewPanel(context, launchConfig, { logicalId: resource.resource.Id ?? '', region: resource.region ?? '', diff --git a/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts b/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts index 4fb894b0c97..6c9348cb62a 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts +++ b/packages/core/src/lambda/vue/remoteInvoke/invokeLambda.ts @@ -272,6 +272,13 @@ export class RemoteInvokeWebview extends VueWebview { qualifier = RemoteDebugController.instance.qualifier } + const isLMI = (this.data.LambdaFunctionNode?.configuration as any)?.CapacityProviderConfig + const isDurable = (this.data.LambdaFunctionNode?.configuration as any)?.DurableConfig + if (isDurable && !qualifier) { + // Make sure to invoke with qualifier for Durable Function, invoking unqualified will fail + qualifier = isLMI ? '$LATEST.PUBLISHED' : '$LATEST' + } + this.isInvoking = true // If debugging is active, reset the timer during invoke @@ -284,12 +291,10 @@ export class RemoteInvokeWebview extends VueWebview { await telemetry.lambda_invokeRemote.run(async (span) => { try { let funcResponse - const snapStartDisabled = - !this.data.LambdaFunctionNode?.configuration.SnapStart && - this.data.LambdaFunctionNode?.configuration.State !== 'Active' + if (remoteDebugEnabled) { funcResponse = await this.clientDebug.invoke(this.data.FunctionArn, input, qualifier) - } else if (snapStartDisabled) { + } else if (isLMI) { funcResponse = await this.client.invoke(this.data.FunctionArn, input, qualifier, 'None') } else { funcResponse = await this.client.invoke(this.data.FunctionArn, input, qualifier, 'Tail') @@ -300,7 +305,7 @@ export class RemoteInvokeWebview extends VueWebview { const payload = decodedPayload || JSON.stringify({}) this.channel.appendLine(`Invocation result for ${this.data.FunctionArn}`) - if (!snapStartDisabled) { + if (!isLMI) { this.channel.appendLine('Logs:') this.channel.appendLine(logs) this.channel.appendLine('') @@ -315,6 +320,7 @@ export class RemoteInvokeWebview extends VueWebview { this.channel.appendLine('') } finally { let action = remoteDebugEnabled ? 'debug' : 'invoke' + action = `${action}${isDurable ? '-durable' : ''}${isLMI ? '-lmi' : ''}` if (!this.data.isLambdaRemote) { action = `${action}LocalStack` } diff --git a/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue index 11c07afbf89..36c1a997d5a 100644 --- a/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue +++ b/packages/core/src/lambda/vue/remoteInvoke/remoteInvoke.vue @@ -57,8 +57,7 @@ :disabled=" !initialData.runtimeSupportsRemoteDebug || !initialData.remoteDebugLayer || - (!initialData.LambdaFunctionNode?.configuration.SnapStart && - initialData.LambdaFunctionNode?.configuration.State !== 'Active') + (initialData.LambdaFunctionNode?.configuration as any)?.CapacityProviderConfig " class="remote-debug-checkbox" /> @@ -95,13 +94,10 @@ Region {{ initialData.FunctionRegion }} doesn't support remote debugging yet - Doesn't support remote debugging yet + Lambda Managed Instances Function doesn't support remote debugging yet
diff --git a/packages/core/src/login/webview/vue/amazonq/backend_amazonq.ts b/packages/core/src/login/webview/vue/amazonq/backend_amazonq.ts index a83e99d04b7..840aa7bbae4 100644 --- a/packages/core/src/login/webview/vue/amazonq/backend_amazonq.ts +++ b/packages/core/src/login/webview/vue/amazonq/backend_amazonq.ts @@ -210,6 +210,10 @@ export class AmazonQLoginWebview extends CommonAuthWebview { return [] } + override startConsoleCredentialSetup(profileName: string, region: string): Promise { + throw new Error('Method not implemented.') + } + override startIamCredentialSetup( profileName: string, accessKey: string, diff --git a/packages/core/src/login/webview/vue/backend.ts b/packages/core/src/login/webview/vue/backend.ts index c8f1f38d4d7..7bfa115c2ed 100644 --- a/packages/core/src/login/webview/vue/backend.ts +++ b/packages/core/src/login/webview/vue/backend.ts @@ -171,6 +171,8 @@ export abstract class CommonAuthWebview extends VueWebview { return Auth.instance.authenticateData(data) } + abstract startConsoleCredentialSetup(profileName: string, region: string): Promise + abstract startIamCredentialSetup( profileName: string, accessKey: string, diff --git a/packages/core/src/login/webview/vue/login.vue b/packages/core/src/login/webview/vue/login.vue index 7973844f4d4..14c31aaf3f1 100644 --- a/packages/core/src/login/webview/vue/login.vue +++ b/packages/core/src/login/webview/vue/login.vue @@ -123,6 +123,17 @@ :itemType="LoginOption.ENTERPRISE_SSO" class="selectable-item bottomMargin" > + @@ -220,9 +231,27 @@ +