diff --git a/.gitignore b/.gitignore index 27c94ac8878..1050c1822f1 100644 --- a/.gitignore +++ b/.gitignore @@ -42,6 +42,7 @@ packages/amplify-opensearch-simulator/emulator packages/graphql*/lib packages/amplify-graphql-transformer-*/lib packages/amplify-cli/lib +packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/lib packages/amplify-cli-npm/lib packages/amplify-cli-core/lib packages/amplify-cli-core-vNext/lib diff --git a/packages/amplify-cli/package.json b/packages/amplify-cli/package.json index 6b0f0f57656..8e46edb34be 100644 --- a/packages/amplify-cli/package.json +++ b/packages/amplify-cli/package.json @@ -107,6 +107,9 @@ }, "devDependencies": { "@aws-amplify/amplify-function-plugin-interface": "1.12.1", + "@aws-sdk/client-cognito-identity-provider": "^3.624.0", + "@aws-sdk/client-lambda": "^3.624.0", + "@aws-sdk/client-s3": "^3.624.0", "@types/archiver": "^5.3.1", "@types/columnify": "^1.5.1", "@types/folder-hash": "^4.0.1", diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/auth/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/auth/index.ts new file mode 100644 index 00000000000..9f6229bff0b --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/auth/index.ts @@ -0,0 +1,5 @@ +// Auth adapter - converts Gen 1 auth config to intermediate format +// Logic from amplify-gen1-codegen-auth-adapter +export const adaptAuthConfig = async (gen1AuthConfig: any) => { + // Convert Gen 1 auth configuration to intermediate format +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/data/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/data/index.ts new file mode 100644 index 00000000000..f50ef8fee18 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/data/index.ts @@ -0,0 +1,5 @@ +// Data adapter - converts Gen 1 GraphQL/DynamoDB config to intermediate format +// Logic from amplify-gen1-codegen-data-adapter +export const adaptDataConfig = async (gen1DataConfig: any) => { + // Convert Gen 1 data configuration to intermediate format +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/functions/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/functions/index.ts new file mode 100644 index 00000000000..7b3b53615d7 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/functions/index.ts @@ -0,0 +1,5 @@ +// Functions adapter - converts Gen 1 Lambda functions to intermediate format +// Logic from amplify-gen1-codegen-function-adapter +export const adaptFunctionsConfig = async (gen1FunctionsConfig: any[]) => { + // Convert Gen 1 functions configuration to intermediate format +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/project/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/project/index.ts new file mode 100644 index 00000000000..37846ea406f --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/project/index.ts @@ -0,0 +1,7 @@ +// Project adapter - handles Gen 1 project detection and parsing +// Logic from amplify-migration +export const detectGen1Project = async (projectPath: string) => { + // Detect if project is Gen 1 + // Parse amplify directory structure + // Extract project metadata +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/storage/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/storage/index.ts new file mode 100644 index 00000000000..ad4adbd005d --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/adapters/storage/index.ts @@ -0,0 +1,5 @@ +// Storage adapter - converts Gen 1 S3 storage config to intermediate format +// Logic from amplify-gen1-codegen-storage-adapter +export const adaptStorageConfig = async (gen1StorageConfig: any) => { + // Convert Gen 1 storage configuration to intermediate format +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/backend/synthesizer.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/backend/synthesizer.ts new file mode 100644 index 00000000000..9f7ca01bc08 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/backend/synthesizer.ts @@ -0,0 +1,1069 @@ +import ts, { + CallExpression, + Expression, + ExpressionStatement, + Identifier, + ImportDeclaration, + Node, + NodeArray, + VariableDeclaration, + VariableStatement, +} from 'typescript'; +import { PolicyOverrides, ReferenceAuth } from '../generators/auth/index.js'; +import type { BucketAccelerateStatus, BucketVersioningStatus } from '@aws-sdk/client-s3'; +import { AccessPatterns, ServerSideEncryptionConfiguration } from '../generators/storage/index.js'; +import { ExplicitAuthFlowsType, OAuthFlowType, UserPoolClientType } from '@aws-sdk/client-cognito-identity-provider'; +import assert from 'assert'; +import { newLineIdentifier } from '../ts_factory_utils'; + +const factory = ts.factory; +export interface BackendRenderParameters { + data?: { + importFrom: string; + }; + auth?: { + importFrom: string; + userPoolOverrides?: PolicyOverrides; + guestLogin?: boolean; + identityPoolName?: string; + oAuthFlows?: string[]; + readAttributes?: string[]; + writeAttributes?: string[]; + referenceAuth?: ReferenceAuth; + userPoolClient?: UserPoolClientType; + }; + storage?: { + importFrom: string; + dynamoDB?: string; + accelerateConfiguration?: BucketAccelerateStatus; + versionConfiguration?: BucketVersioningStatus; + hasS3Bucket?: string | AccessPatterns | undefined; + bucketEncryptionAlgorithm?: ServerSideEncryptionConfiguration; + bucketName?: string; + }; + + function?: { + importFrom: string; + functionNamesAndCategories: Map; + }; + customResources?: Map; + unsupportedCategories?: Map; +} + +const amplifyGen1EnvName = 'AMPLIFY_GEN_1_ENV_NAME'; + +export class BackendSynthesizer { + private importDurationFlag = false; + private oAuthFlag = false; + private readWriteAttributeFlag = false; + private supportedIdentityProviderFlag = false; + + private createPropertyAccessExpression(objectIdentifier: Identifier, propertyPath: string): Expression { + const parts = propertyPath.split('.'); + let expression: Expression = objectIdentifier; + for (let i = 0; i < parts.length; i++) { + expression = factory.createPropertyAccessExpression(expression, factory.createIdentifier(parts[i])); + } + return expression; + } + + private createVariableDeclaration(identifierName: string, propertyPath: string): VariableDeclaration { + const identifier = factory.createIdentifier(identifierName); + const propertyAccessExpression = this.createPropertyAccessExpression(factory.createIdentifier('backend'), propertyPath); + return factory.createVariableDeclaration(identifier, undefined, undefined, propertyAccessExpression); + } + + private createVariableStatement(variableDeclaration: VariableDeclaration): VariableStatement { + return factory.createVariableStatement([], factory.createVariableDeclarationList([variableDeclaration], ts.NodeFlags.Const)); + } + + private createImportStatement(identifiers: Identifier[], backendPackageName: string): ImportDeclaration { + return factory.createImportDeclaration( + undefined, + factory.createImportClause( + false, + undefined, + factory.createNamedImports(identifiers.map((identifier) => factory.createImportSpecifier(false, undefined, identifier))), + ), + factory.createStringLiteral(backendPackageName), + ); + } + + private defineBackendCall(backendFunctionIdentifier: Identifier, properties: ts.ObjectLiteralElementLike[]): CallExpression { + const backendFunctionArgs = factory.createObjectLiteralExpression(properties, true); + return factory.createCallExpression(backendFunctionIdentifier, undefined, [backendFunctionArgs]); + } + + private setPropertyValue( + objectIdentifier: Identifier, + propertyPath: string, + value: number | string | boolean | string[] | object | undefined, + ): ExpressionStatement { + const propertyAccessExpression = this.createPropertyAccessExpression(objectIdentifier, propertyPath); + const overrideValue = this.getOverrideValue(value); + + return factory.createExpressionStatement(factory.createAssignment(propertyAccessExpression, overrideValue)); + } + + private getOverrideValue(value: number | string | boolean | string[] | object | undefined): Expression { + if (typeof value === 'number') { + return factory.createNumericLiteral(value); + } else if (typeof value === 'string') { + return factory.createStringLiteral(value); + } else if (Array.isArray(value) && value.every((item) => typeof item === 'string')) { + return factory.createArrayLiteralExpression(value.map((item) => factory.createStringLiteral(item))); + } else if (typeof value === 'boolean') { + return value ? factory.createTrue() : factory.createFalse(); + } else if (typeof value === 'object' && value !== null) { + const properties: ts.PropertyAssignment[] = []; + for (const [key, val] of Object.entries(value)) { + const property = factory.createPropertyAssignment(factory.createIdentifier(key), this.getOverrideValue(val)); + properties.push(property); + } + return factory.createObjectLiteralExpression(properties, true); + } else if (value === undefined) { + return factory.createIdentifier('undefined'); + } + throw new TypeError(`Unrecognized type: ${typeof value}`); + } + + private createBooleanPropertyAssignment(identifier: string, condition: boolean) { + return factory.createPropertyAssignment(factory.createIdentifier(identifier), condition ? factory.createTrue() : factory.createFalse()); + } + + private createListPropertyAssignment(identifier: string, listAttribute: string[]) { + return factory.createPropertyAssignment( + factory.createIdentifier(identifier), + factory.createArrayLiteralExpression(listAttribute.map((attribute) => factory.createStringLiteral(attribute))), + ); + } + + private createEnumListPropertyAssignment(identifier: string, enumIdentifier: string, listAttribute: string[]) { + return factory.createPropertyAssignment( + factory.createIdentifier(identifier), + factory.createArrayLiteralExpression( + listAttribute.map((attribute) => + factory.createPropertyAccessExpression(factory.createIdentifier(enumIdentifier), factory.createIdentifier(attribute)), + ), + true, + ), + ); + } + + private createNumericPropertyAssignment(identifier: string, numericLiteral: number) { + return factory.createPropertyAssignment(factory.createIdentifier(identifier), factory.createNumericLiteral(numericLiteral)); + } + + private createDurationPropertyAssignment(identifier: string, numericLiteral: number, durationUnit: string) { + const duration = factory.createCallExpression(factory.createIdentifier(`Duration.${durationUnit}`), undefined, [ + factory.createNumericLiteral(numericLiteral), + ]); + return factory.createPropertyAssignment(factory.createIdentifier(identifier), duration); + } + + private createStringPropertyAssignment(identifier: string, stringLiteral: string) { + return factory.createPropertyAssignment(factory.createIdentifier(identifier), factory.createStringLiteral(stringLiteral)); + } + + private createUserPoolClientAssignment(userPoolClient: UserPoolClientType, imports: ts.ImportDeclaration[]) { + const userPoolClientAttributesMap = new Map(); + userPoolClientAttributesMap.set('ClientName', 'userPoolClientName'); + userPoolClientAttributesMap.set('ClientSecret', 'generateSecret'); + userPoolClientAttributesMap.set('ReadAttributes', 'readAttributes'); + userPoolClientAttributesMap.set('WriteAttributes', 'writeAttributes'); + userPoolClientAttributesMap.set('RefreshTokenValidity', 'refreshTokenValidity'); + userPoolClientAttributesMap.set('AccessTokenValidity', 'accessTokenValidity'); + userPoolClientAttributesMap.set('IdTokenValidity', 'idTokenValidity'); + userPoolClientAttributesMap.set('RefreshToken', 'refreshToken'); + userPoolClientAttributesMap.set('AccessToken', 'accessToken'); + userPoolClientAttributesMap.set('IdToken', 'idToken'); + userPoolClientAttributesMap.set('AllowedOAuthScopes', 'scopes'); + userPoolClientAttributesMap.set('CallbackURLs', 'callbackUrls'); + userPoolClientAttributesMap.set('LogoutURLs', 'logoutUrls'); + userPoolClientAttributesMap.set('DefaultRedirectURI', 'defaultRedirectUri'); + userPoolClientAttributesMap.set('AllowedOAuthFlowsUserPoolClient', 'disableOAuth'); + userPoolClientAttributesMap.set('EnableTokenRevocation', 'enableTokenRevocation'); + userPoolClientAttributesMap.set('EnablePropagateAdditionalUserContextData', 'enablePropagateAdditionalUserContextData'); + userPoolClientAttributesMap.set('SupportedIdentityProviders', 'supportedIdentityProviders'); + userPoolClientAttributesMap.set('AuthSessionValidity', 'authSessionValidity'); + userPoolClientAttributesMap.set('ExplicitAuthFlows', 'authFlows'); + userPoolClientAttributesMap.set('AllowedOAuthFlows', 'flows'); + + const userPoolClientDeclaration = factory.createVariableStatement( + undefined, + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier('userPoolClient'), + undefined, + undefined, + factory.createCallExpression( + factory.createPropertyAccessExpression(factory.createIdentifier('userPool'), factory.createIdentifier('addClient')), + undefined, + [ + factory.createStringLiteral('NativeAppClient'), + this.createNestedObjectExpression(userPoolClient, userPoolClientAttributesMap), + ], + ), + ), + ], + ts.NodeFlags.Const, + ), + ); + + if (this.importDurationFlag) { + imports.push(this.createImportStatement([factory.createIdentifier('Duration')], 'aws-cdk-lib')); + } + + if (this.readWriteAttributeFlag || this.oAuthFlag || this.supportedIdentityProviderFlag) { + const identifiers = [ + ...(this.readWriteAttributeFlag ? [factory.createIdentifier('ClientAttributes')] : []), + ...(this.oAuthFlag ? [factory.createIdentifier('OAuthScope')] : []), + ...(this.supportedIdentityProviderFlag ? [factory.createIdentifier('UserPoolClientIdentityProvider')] : []), + ]; + + if (identifiers.length > 0) { + imports.push(this.createImportStatement(identifiers, 'aws-cdk-lib/aws-cognito')); + } + } + + return userPoolClientDeclaration; + } + + private createPropertyAccessChain(identifiers: string[]): ts.Expression { + return identifiers + .slice(1) + .reduce( + (acc, curr) => factory.createPropertyAccessExpression(acc, factory.createIdentifier(curr)), + factory.createIdentifier(identifiers[0]), + ); + } + + private getProviderSetupDeclaration(): ts.VariableStatement { + const providerSetupResult = 'providerSetupResult'; + return factory.createVariableStatement( + undefined, + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier(providerSetupResult), + undefined, + undefined, + factory.createPropertyAccessExpression( + factory.createParenthesizedExpression( + factory.createAsExpression( + factory.createCallExpression( + factory.createPropertyAccessExpression( + this.createPropertyAccessChain(['backend', 'auth', 'stack', 'node', 'children']), + factory.createIdentifier('find'), + ), + undefined, + [ + factory.createArrowFunction( + undefined, + undefined, + [factory.createParameterDeclaration(undefined, undefined, factory.createIdentifier('child'))], + undefined, + factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + factory.createBinaryExpression( + this.createPropertyAccessChain(['child', 'node', 'id']), + factory.createToken(ts.SyntaxKind.EqualsEqualsEqualsToken), + factory.createStringLiteral('amplifyAuth'), + ), + ), + ], + ), + factory.createKeywordTypeNode(ts.SyntaxKind.AnyKeyword), + ), + ), + factory.createIdentifier(providerSetupResult), + ), + ), + ], + ts.NodeFlags.Const, + ), + ); + } + + private getProviderSetupForeachStatement(): ExpressionStatement { + const providerSetupResult = 'providerSetupResult'; + return factory.createExpressionStatement( + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createCallExpression( + factory.createPropertyAccessExpression(factory.createIdentifier('Object'), factory.createIdentifier('keys')), + undefined, + [factory.createIdentifier(providerSetupResult)], + ), + factory.createIdentifier('forEach'), + ), + undefined, + [ + factory.createArrowFunction( + undefined, + undefined, + [factory.createParameterDeclaration(undefined, undefined, factory.createIdentifier('provider'))], + undefined, + factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), + factory.createBlock( + [ + // const providerSetupPropertyValue = providerSetupResult[provider] + factory.createVariableStatement( + undefined, + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier('providerSetupPropertyValue'), + undefined, + undefined, + factory.createElementAccessExpression( + factory.createIdentifier(providerSetupResult), + factory.createIdentifier('provider'), + ), + ), + ], + ts.NodeFlags.Const, + ), + ), + // if condition + factory.createIfStatement( + factory.createLogicalAnd( + factory.createPropertyAccessExpression( + factory.createIdentifier('providerSetupPropertyValue'), + factory.createIdentifier('node'), + ), + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createCallExpression( + factory.createPropertyAccessExpression( + this.createPropertyAccessChain(['providerSetupPropertyValue', 'node', 'id']), + factory.createIdentifier('toLowerCase'), + ), + undefined, + [], + ), + factory.createIdentifier('endsWith'), + ), + undefined, + [factory.createStringLiteral('idp')], + ), + ), + factory.createBlock( + [ + factory.createExpressionStatement( + factory.createCallExpression( + this.createPropertyAccessChain(['userPoolClient', 'node', 'addDependency']), + undefined, + [factory.createIdentifier('providerSetupPropertyValue')], + ), + ), + ], + true, + ), + ), + ], + true, + ), + ), + ], + ), + ); + } + + private createProviderSetupCode(): ts.Statement[] { + // Create const providerSetupResult = (backend.auth.stack.node.children.find(child => child.node.id === "amplifyAuth") as any).providerSetupResult; + const providerSetupDeclaration = this.getProviderSetupDeclaration(); + + // Create Object.keys(providerSetupResult).forEach(...) + const forEachStatement = this.getProviderSetupForeachStatement(); + + return [providerSetupDeclaration, forEachStatement]; + } + + private createNestedObjectExpression(object: any, gen2PropertyMap: Map): ts.ObjectLiteralExpression { + const objectLiterals = []; + const clientSecretKey = 'ClientSecret'; + + for (const [key, value] of Object.entries(object)) { + const mappedProperty = gen2PropertyMap.get(key); + if (mappedProperty) { + if (typeof value == 'boolean') { + if (key === 'AllowedOAuthFlowsUserPoolClient') { + // CDK equivalent is disableOAuth which is opposite of this prop + objectLiterals.push(this.createBooleanPropertyAssignment(mappedProperty, !value)); + } else { + objectLiterals.push(this.createBooleanPropertyAssignment(mappedProperty, value)); + } + } else if (typeof value == 'string') { + if (!this.oAuthFlag && key == 'DefaultRedirectURI') { + this.oAuthFlag = true; + objectLiterals.push(this.createOAuthObjectExpression(object, gen2PropertyMap)); + } else if (key === clientSecretKey) { + objectLiterals.push(this.createBooleanPropertyAssignment(mappedProperty, true)); + } else if (key != 'DefaultRedirectURI') { + objectLiterals.push(this.createStringPropertyAssignment(mappedProperty, value)); + } + } else if (typeof value == 'number') { + if (['IdTokenValidity', 'RefreshTokenValidity', 'AccessTokenValidity', 'AuthSessionValidity'].includes(key)) { + // convert it to Duration + this.importDurationFlag = true; + if (key == 'IdTokenValidity') { + let durationUnit = 'hours'; + if (object['TokenValidityUnits'] && object['TokenValidityUnits'].IdToken) { + durationUnit = object['TokenValidityUnits'].IdToken; + } + objectLiterals.push(this.createDurationPropertyAssignment(mappedProperty, value, durationUnit)); + } else if (key == 'RefreshTokenValidity') { + let durationUnit = 'days'; + if (object['TokenValidityUnits'] && object['TokenValidityUnits'].RefreshToken) { + durationUnit = object['TokenValidityUnits'].RefreshToken; + } + objectLiterals.push(this.createDurationPropertyAssignment(mappedProperty, value, durationUnit)); + } else if (key == 'AccessTokenValidity') { + let durationUnit = 'hours'; + if (object['TokenValidityUnits'] && object['TokenValidityUnits'].AccessToken) { + durationUnit = object['TokenValidityUnits'].AccessToken; + } + objectLiterals.push(this.createDurationPropertyAssignment(mappedProperty, value, durationUnit)); + } else if (key == 'AuthSessionValidity') { + objectLiterals.push(this.createDurationPropertyAssignment(mappedProperty, value, 'minutes')); + } + } else { + objectLiterals.push(this.createNumericPropertyAssignment(mappedProperty, value)); + } + } else if (Array.isArray(value) && gen2PropertyMap.has(key)) { + if (key == 'ReadAttributes' || key == 'WriteAttributes') { + objectLiterals.push(this.createReadWriteAttributes(mappedProperty, value)); + } else if (key == 'SupportedIdentityProviders') { + this.supportedIdentityProviderFlag = true; + // Providers are upper case in CDK + objectLiterals.push( + this.createEnumListPropertyAssignment( + mappedProperty, + 'UserPoolClientIdentityProvider', + value.map((provider) => { + if (provider.toUpperCase() == 'LOGINWITHAMAZON') { + return 'AMAZON'; + } else if (provider.toUpperCase() === 'SIGNINWITHAPPLE') { + return 'APPLE'; + } + return provider.toUpperCase(); + }), + ), + ); + } else if (!this.oAuthFlag && key == 'AllowedOAuthFlows') { + this.oAuthFlag = true; + objectLiterals.push(this.createOAuthObjectExpression(object, gen2PropertyMap)); + } else if (key == 'ExplicitAuthFlows') { + objectLiterals.push( + factory.createPropertyAssignment(factory.createIdentifier(mappedProperty), this.createAuthFlowsObjectExpression(value)), + ); + } else if (!this.oAuthFlag && key == 'AllowedOAuthScopes') { + this.oAuthFlag = true; + objectLiterals.push(this.createOAuthObjectExpression(object, gen2PropertyMap)); + } else { + if (!this.oAuthFlag && (key == 'CallbackURLs' || key == 'LogoutURLs')) { + this.oAuthFlag = true; + objectLiterals.push(this.createOAuthObjectExpression(object, gen2PropertyMap)); + } else if (key != 'CallbackURLs' && key != 'LogoutURLs' && key != 'AllowedOAuthScopes') { + objectLiterals.push(this.createListPropertyAssignment(mappedProperty, value)); + } + } + } else if (typeof value == 'object' && value !== null) { + objectLiterals.push( + factory.createPropertyAssignment(factory.createIdentifier(key), this.createNestedObjectExpression(value, gen2PropertyMap)), + ); + } + } + } + // We need to set generateSecret to false explicitly when not defined. + // If it's set as undefined and current value in CFN template is false (moved from gen1 after refactor), CFN thinks the property has changed + // and requests for creation of a new resource (user pool client) instead of an update. + if (object[clientSecretKey] === undefined && gen2PropertyMap.has(clientSecretKey)) { + const mappedClientSecretKey = gen2PropertyMap.get(clientSecretKey); + assert(mappedClientSecretKey); + objectLiterals.push(this.createBooleanPropertyAssignment(mappedClientSecretKey, false)); + } + return factory.createObjectLiteralExpression(objectLiterals, true); + } + + private createReadWriteAttributes(identifier: string, attributes: string[]) { + const standardAttrMap = new Map(); + standardAttrMap.set('address', 'address'); + standardAttrMap.set('birthdate', 'birthdate'); + standardAttrMap.set('email', 'email'); + standardAttrMap.set('family_name', 'familyName'); + standardAttrMap.set('gender', 'gender'); + standardAttrMap.set('given_name', 'givenName'); + standardAttrMap.set('locale', 'locale'); + standardAttrMap.set('middle_name', 'middleName'); + standardAttrMap.set('name', 'fullname'); + standardAttrMap.set('nickname', 'nickname'); + standardAttrMap.set('phone_number', 'phoneNumber'); + standardAttrMap.set('picture', 'profilePicture'); + standardAttrMap.set('preferred_username', 'preferredUsername'); + standardAttrMap.set('profile', 'profilePage'); + standardAttrMap.set('updated_at', 'lastUpdateTime'); + standardAttrMap.set('website', 'website'); + standardAttrMap.set('zoneinfo', 'timezone'); + standardAttrMap.set('email_verified', 'emailVerified'); + standardAttrMap.set('phone_number_verified', 'phoneNumberVerified'); + + this.readWriteAttributeFlag = true; + const standardAttributes = attributes.filter((attribute) => !attribute.startsWith('custom:')); + const standardAttributesLiterals: ts.PropertyAssignment[] = []; + standardAttributes.forEach((attribute) => { + if (standardAttrMap.has(attribute)) { + const mappedAttribute = standardAttrMap.get(attribute); + if (mappedAttribute) { + standardAttributesLiterals.push( + factory.createPropertyAssignment(factory.createIdentifier(mappedAttribute), factory.createTrue()), + ); + } + } + }); + + let clientAttributes = factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createIdentifier('new ClientAttributes()'), + factory.createIdentifier('withStandardAttributes'), + ), + undefined, + [factory.createObjectLiteralExpression(standardAttributesLiterals, true)], + ); + + const customAttributes = attributes.filter((attribute) => attribute.startsWith('custom:')); + + if (customAttributes) { + clientAttributes = factory.createCallExpression( + factory.createPropertyAccessExpression(clientAttributes, factory.createIdentifier('withCustomAttributes')), + undefined, + customAttributes.map((attr) => factory.createStringLiteral(attr)), + ); + } + + return factory.createPropertyAssignment(factory.createIdentifier(identifier), clientAttributes); + } + + private mapOAuthScopes(scopes: string[]) { + const scopeMap = new Map(); + scopeMap.set('phone', 'PHONE'); + scopeMap.set('email', 'EMAIL'); + scopeMap.set('openid', 'OPENID'); + scopeMap.set('profile', 'PROFILE'); + + const scopesList: string[] = []; + scopes.forEach((scope) => { + if (scopeMap.has(scope)) { + const scopeValue = scopeMap.get(scope); + if (scopeValue) { + scopesList.push(scopeValue); + } + } + }); + return scopesList; + } + + private createOAuthObjectExpression(object: Record, map: Map) { + const oAuthLiterals = []; + + for (const [key, value] of Object.entries(object)) { + if (key == 'AllowedOAuthFlows') { + oAuthLiterals.push( + factory.createPropertyAssignment(factory.createIdentifier('flows'), this.createOAuthFlowsObjectExpression(value)), + ); + } else if (key == 'AllowedOAuthScopes') { + oAuthLiterals.push(this.createEnumListPropertyAssignment('scopes', 'OAuthScope', this.mapOAuthScopes(value))); + } else if (key == 'CallbackURLs' || key == 'LogoutURLs') { + const urlValue = map.get(key); + if (urlValue) { + oAuthLiterals.push(this.createListPropertyAssignment(urlValue, value)); + } + } else if (key == 'DefaultRedirectURI') { + const redirectUriValue = map.get(key); + if (redirectUriValue) { + oAuthLiterals.push(this.createStringPropertyAssignment(redirectUriValue, value)); + } + } + } + return factory.createPropertyAssignment(factory.createIdentifier('oAuth'), factory.createObjectLiteralExpression(oAuthLiterals, true)); + } + + private createOAuthFlowsObjectExpression(value: string[]) { + return factory.createObjectLiteralExpression([ + this.createBooleanPropertyAssignment('authorizationCodeGrant', value.includes(OAuthFlowType.code)), + this.createBooleanPropertyAssignment('implicitCodeGrant', value.includes(OAuthFlowType.implicit)), + this.createBooleanPropertyAssignment('clientCredentials', value.includes(OAuthFlowType.client_credentials)), + ]); + } + + private createAuthFlowsObjectExpression(value: string[]) { + return factory.createObjectLiteralExpression([ + this.createBooleanPropertyAssignment('adminUserPassword', value.includes(ExplicitAuthFlowsType.ALLOW_ADMIN_USER_PASSWORD_AUTH)), + this.createBooleanPropertyAssignment('custom', value.includes(ExplicitAuthFlowsType.ALLOW_CUSTOM_AUTH)), + this.createBooleanPropertyAssignment('userPassword', value.includes(ExplicitAuthFlowsType.ALLOW_USER_PASSWORD_AUTH)), + this.createBooleanPropertyAssignment('userSrp', value.includes(ExplicitAuthFlowsType.ALLOW_USER_SRP_AUTH)), + ]); + } + + // id1.id2 = `templateHead-${templateSpan}templateTail`; + private createTemplateLiteralExpression(id1: string, id2: string, templateHead: string, templateSpan: string, templateTail: string) { + return factory.createExpressionStatement( + factory.createAssignment( + factory.createPropertyAccessExpression(factory.createIdentifier(id1), factory.createIdentifier(id2)), + factory.createTemplateExpression(factory.createTemplateHead(templateHead), [ + factory.createTemplateSpan(factory.createIdentifier(templateSpan), factory.createTemplateTail(templateTail)), + ]), + ), + ); + } + + private createAmplifyEnvNameLogic() { + // Create: let AMPLIFY_GEN_1_ENV_NAME = process.env.AMPLIFY_GEN_1_ENV_NAME; + const variableDeclaration = factory.createVariableStatement( + undefined, + factory.createVariableDeclarationList( + [ + factory.createVariableDeclaration( + factory.createIdentifier('AMPLIFY_GEN_1_ENV_NAME'), + undefined, + undefined, + factory.createPropertyAccessExpression( + factory.createPropertyAccessExpression(factory.createIdentifier('process'), factory.createIdentifier('env')), + factory.createIdentifier('AMPLIFY_GEN_1_ENV_NAME'), + ), + ), + ], + ts.NodeFlags.Let, + ), + ); + + // Create: if (ci.isCI && !AMPLIFY_GEN_1_ENV_NAME) { ... } else if (!ci.isCI) { ... } + const ifStatement = factory.createIfStatement( + // Condition: ci.isCI && !AMPLIFY_GEN_1_ENV_NAME + factory.createLogicalAnd( + factory.createPropertyAccessExpression(factory.createIdentifier('ci'), factory.createIdentifier('isCI')), + factory.createLogicalNot(factory.createIdentifier('AMPLIFY_GEN_1_ENV_NAME')), + ), + // Then block: throw new Error('...') + factory.createBlock( + [ + factory.createThrowStatement( + factory.createNewExpression(factory.createIdentifier('Error'), undefined, [ + factory.createStringLiteral('AMPLIFY_GEN_1_ENV_NAME is required in CI environment'), + ]), + ), + ], + true, + ), + // Else block: if (!ci.isCI && !AMPLIFY_GEN_1_ENV_NAME) { ... } + factory.createIfStatement( + factory.createLogicalAnd( + factory.createLogicalNot( + factory.createPropertyAccessExpression(factory.createIdentifier('ci'), factory.createIdentifier('isCI')), + ), + factory.createLogicalNot(factory.createIdentifier('AMPLIFY_GEN_1_ENV_NAME')), + ), + // Then block: AMPLIFY_GEN_1_ENV_NAME = 'sandbox'; + factory.createBlock( + [ + factory.createExpressionStatement( + factory.createBinaryExpression( + factory.createIdentifier('AMPLIFY_GEN_1_ENV_NAME'), + factory.createToken(ts.SyntaxKind.EqualsToken), + factory.createStringLiteral('sandbox'), + ), + ), + ], + true, + ), + ), + ); + + return [variableDeclaration, ifStatement]; + } + + render(renderArgs: BackendRenderParameters): NodeArray { + const authFunctionIdentifier = factory.createIdentifier('auth'); + const storageFunctionIdentifier = factory.createIdentifier('storage'); + const dataFunctionIdentifier = factory.createIdentifier('data'); + const backendFunctionIdentifier = factory.createIdentifier('defineBackend'); + + const imports = []; + const errors = []; + const defineBackendProperties = []; + const nodes = []; + + const mappedPolicyType: Record = { + MinimumLength: 'minimumLength', + RequireUppercase: 'requireUppercase', + RequireLowercase: 'requireLowercase', + RequireNumbers: 'requireNumbers', + RequireSymbols: 'requireSymbols', + PasswordHistorySize: 'passwordHistorySize', + TemporaryPasswordValidityDays: 'temporaryPasswordValidityDays', + }; + + if (renderArgs.auth || renderArgs.storage?.hasS3Bucket || renderArgs.customResources) { + imports.push( + this.createImportStatement([factory.createIdentifier('RemovalPolicy'), factory.createIdentifier('Tags')], 'aws-cdk-lib'), + ); + } + + if (renderArgs.auth) { + imports.push(this.createImportStatement([authFunctionIdentifier], renderArgs.auth.importFrom)); + const auth = factory.createShorthandPropertyAssignment(authFunctionIdentifier); + defineBackendProperties.push(auth); + } + + if (renderArgs.data) { + imports.push(this.createImportStatement([dataFunctionIdentifier], renderArgs.data.importFrom)); + const data = factory.createShorthandPropertyAssignment(dataFunctionIdentifier); + defineBackendProperties.push(data); + } + + if (renderArgs.storage?.hasS3Bucket) { + imports.push(this.createImportStatement([storageFunctionIdentifier], renderArgs.storage.importFrom)); + const storage = factory.createShorthandPropertyAssignment(storageFunctionIdentifier); + defineBackendProperties.push(storage); + } + + if (renderArgs.function) { + const functionNameCategories = renderArgs.function.functionNamesAndCategories; + for (const [functionName, category] of functionNameCategories) { + const functionProperty = factory.createShorthandPropertyAssignment(factory.createIdentifier(functionName)); + defineBackendProperties.push(functionProperty); + imports.push(this.createImportStatement([factory.createIdentifier(functionName)], `./${category}/${functionName}/resource`)); + } + } + + if (renderArgs.storage?.dynamoDB) { + nodes.push( + factory.createThrowStatement( + factory.createNewExpression(factory.createIdentifier('Error'), undefined, [ + factory.createStringLiteral( + `DynamoDB table \`${renderArgs.storage.dynamoDB}\` is referenced in your Gen 1 backend and will need to be manually migrated to reference with CDK.`, + ), + ]), + ), + ); + } + + imports.push(this.createImportStatement([backendFunctionIdentifier], '@aws-amplify/backend')); + + if (renderArgs.unsupportedCategories) { + const categories = renderArgs.unsupportedCategories; + + for (const [key, value] of categories) { + errors.push( + factory.createCallExpression(factory.createIdentifier('throw new Error'), undefined, [ + factory.createStringLiteral(`Category ${key} is unsupported, please follow ${value}`), + ]), + ); + } + } + + if (renderArgs.customResources) { + for (const [resourceName, className] of renderArgs.customResources) { + const importStatement = factory.createImportDeclaration( + undefined, + factory.createImportClause( + false, + undefined, + factory.createNamedImports([ + factory.createImportSpecifier(false, factory.createIdentifier(`${className}`), factory.createIdentifier(`${resourceName}`)), + ]), + ), + factory.createStringLiteral(`./custom/${resourceName}/cdk-stack`), + undefined, + ); + + imports.push(importStatement); + + const customResourceExpression = factory.createNewExpression(factory.createIdentifier(`${resourceName}`), undefined, [ + factory.createPropertyAccessExpression(factory.createIdentifier('backend'), factory.createIdentifier('stack')), + factory.createStringLiteral(`${resourceName}`), + factory.createIdentifier('undefined'), + factory.createObjectLiteralExpression( + [ + factory.createPropertyAssignment(factory.createIdentifier('category'), factory.createStringLiteral('custom')), + factory.createPropertyAssignment(factory.createIdentifier('resourceName'), factory.createStringLiteral(`${resourceName}`)), + ], + true, + ), + ]); + + nodes.push(factory.createExpressionStatement(customResourceExpression)); + } + } + + const ciInfoImportStatement = factory.createImportDeclaration( + undefined, + factory.createImportClause(false, factory.createIdentifier('ci'), undefined), + factory.createStringLiteral('ci-info'), + ); + + imports.push(ciInfoImportStatement); + const envNameStatements = this.createAmplifyEnvNameLogic(); + errors.push(...envNameStatements); + + const callBackendFn = this.defineBackendCall(backendFunctionIdentifier, defineBackendProperties); + const backendVariable = factory.createVariableDeclaration('backend', undefined, undefined, callBackendFn); + const backendStatement = factory.createVariableStatement( + [], + factory.createVariableDeclarationList([backendVariable], ts.NodeFlags.Const), + ); + + if (renderArgs.auth?.userPoolOverrides && !renderArgs?.auth?.referenceAuth) { + const cfnUserPoolVariableStatement = this.createVariableStatement( + this.createVariableDeclaration('cfnUserPool', 'auth.resources.cfnResources.cfnUserPool'), + ); + nodes.push(cfnUserPoolVariableStatement); + const policies: { passwordPolicy: Record } = { + passwordPolicy: {}, + }; + for (const [overridePath, value] of Object.entries(renderArgs.auth.userPoolOverrides)) { + if (overridePath.includes('userPoolName')) { + assert(value); + assert(typeof value === 'string'); + const splitUserPoolName = value.split('-'); + const userPoolWithoutBackendEnvName = splitUserPoolName.slice(0, -1).join('-'); + + const userPoolAssignment = this.createTemplateLiteralExpression( + 'cfnUserPool', + 'userPoolName', + `${userPoolWithoutBackendEnvName}-`, + amplifyGen1EnvName, + '', + ); + + nodes.push(userPoolAssignment); + } else if (overridePath.includes('PasswordPolicy')) { + const policyKey = overridePath.split('.')[2]; + if (value !== undefined && policyKey in mappedPolicyType) { + policies.passwordPolicy[mappedPolicyType[policyKey] as string] = value; + } + } else { + nodes.push(this.setPropertyValue(factory.createIdentifier('cfnUserPool'), overridePath, value)); + } + } + nodes.push( + this.setPropertyValue( + factory.createIdentifier('cfnUserPool'), + 'policies', + policies as number | string | boolean | string[] | object, + ), + ); + } + + if (renderArgs.auth?.guestLogin === false || (renderArgs.auth?.identityPoolName && !renderArgs?.auth?.referenceAuth)) { + const cfnIdentityPoolVariableStatement = this.createVariableStatement( + this.createVariableDeclaration('cfnIdentityPool', 'auth.resources.cfnResources.cfnIdentityPool'), + ); + nodes.push(cfnIdentityPoolVariableStatement); + if (renderArgs.auth?.identityPoolName) { + const splitIdentityPoolName = renderArgs.auth.identityPoolName.split('_'); + const identityPoolWithoutBackendEnvName = splitIdentityPoolName.slice(0, -1).join('_'); + + const identityPoolAssignment = this.createTemplateLiteralExpression( + 'cfnIdentityPool', + 'identityPoolName', + `${identityPoolWithoutBackendEnvName}_`, + amplifyGen1EnvName, + '', + ); + + nodes.push(identityPoolAssignment); + } + if (renderArgs.auth?.guestLogin === false) { + nodes.push(this.setPropertyValue(factory.createIdentifier('cfnIdentityPool'), 'allowUnauthenticatedIdentities', false)); + } + } + + if ( + (renderArgs.auth?.oAuthFlows || renderArgs.auth?.readAttributes || renderArgs.auth?.writeAttributes) && + !renderArgs?.auth?.referenceAuth + ) { + const cfnUserPoolClientVariableStatement = this.createVariableStatement( + this.createVariableDeclaration('cfnUserPoolClient', 'auth.resources.cfnResources.cfnUserPoolClient'), + ); + nodes.push(cfnUserPoolClientVariableStatement); + if (renderArgs.auth?.oAuthFlows) { + nodes.push( + this.setPropertyValue( + factory.createIdentifier('cfnUserPoolClient'), + 'allowedOAuthFlows', + renderArgs.auth?.oAuthFlows as number | string | boolean | string[], + ), + ); + } + + if (renderArgs.auth?.readAttributes) { + nodes.push( + this.setPropertyValue( + factory.createIdentifier('cfnUserPoolClient'), + 'readAttributes', + renderArgs.auth?.readAttributes as number | string | boolean | string[], + ), + ); + } + } + + if (renderArgs.auth?.writeAttributes && !renderArgs?.auth?.referenceAuth) { + nodes.push( + this.setPropertyValue( + factory.createIdentifier('cfnUserPoolClient'), + 'writeAttributes', + renderArgs.auth?.writeAttributes as string[], + ), + ); + } + + // Since Gen2 only supports 1 user pool client by default, we need to add CDK overrides for the additional user pool client from Gen1 + if (renderArgs.auth?.userPoolClient) { + const userPoolVariableStatement = this.createVariableStatement(this.createVariableDeclaration('userPool', 'auth.resources.userPool')); + nodes.push(userPoolVariableStatement); + nodes.push(this.createUserPoolClientAssignment(renderArgs.auth?.userPoolClient, imports)); + } + + if (renderArgs.storage && renderArgs.storage.hasS3Bucket) { + assert(renderArgs.storage.bucketName); + const cfnStorageVariableStatement = this.createVariableStatement( + this.createVariableDeclaration('s3Bucket', 'storage.resources.cfnResources.cfnBucket'), + ); + nodes.push(cfnStorageVariableStatement); + + const splitBucketName = renderArgs.storage.bucketName.split('-'); + const bucketNameWithoutBackendEnvName = splitBucketName.slice(0, -1).join('-'); + + const bucketNameAssignment = this.createTemplateLiteralExpression( + '// s3Bucket', + 'bucketName', + `${bucketNameWithoutBackendEnvName}-`, + amplifyGen1EnvName, + '', + ); + nodes.push(bucketNameAssignment); + } + + if ( + renderArgs.storage?.accelerateConfiguration || + renderArgs.storage?.versionConfiguration || + renderArgs.storage?.bucketEncryptionAlgorithm + ) { + if (renderArgs.storage?.accelerateConfiguration) { + const accelerateConfigAssignment = factory.createExpressionStatement( + factory.createAssignment( + factory.createPropertyAccessExpression( + factory.createIdentifier('s3Bucket'), + factory.createIdentifier('accelerateConfiguration'), + ), + factory.createObjectLiteralExpression( + [this.createStringPropertyAssignment('accelerationStatus', renderArgs.storage.accelerateConfiguration)], + false, + ), + ), + ); + nodes.push(accelerateConfigAssignment); + } + + if (renderArgs.storage?.versionConfiguration) { + const versionConfigAssignment = factory.createExpressionStatement( + factory.createAssignment( + factory.createPropertyAccessExpression( + factory.createIdentifier('s3Bucket'), + factory.createIdentifier('versioningConfiguration'), + ), + factory.createObjectLiteralExpression( + [this.createStringPropertyAssignment('status', renderArgs.storage.versionConfiguration)], + false, + ), + ), + ); + nodes.push(versionConfigAssignment); + } + + if (renderArgs.storage?.bucketEncryptionAlgorithm) { + const serverSideEncryptionByDefaultMap = new Map(); + serverSideEncryptionByDefaultMap.set('SSEAlgorithm', 'sseAlgorithm'); + serverSideEncryptionByDefaultMap.set('KMSMasterKeyID', 'kmsMasterKeyId'); + serverSideEncryptionByDefaultMap.set('bucketKeyEnabled', 'bucketKeyEnabled'); + serverSideEncryptionByDefaultMap.set('serverSideEncryptionByDefault', 'serverSideEncryptionByDefault'); + + const bucketEncryptionAssignment = factory.createExpressionStatement( + factory.createAssignment( + factory.createPropertyAccessExpression(factory.createIdentifier('s3Bucket'), factory.createIdentifier('bucketEncryption')), + factory.createObjectLiteralExpression( + [ + factory.createPropertyAssignment( + factory.createIdentifier('serverSideEncryptionConfiguration'), + factory.createArrayLiteralExpression( + [this.createNestedObjectExpression(renderArgs.storage.bucketEncryptionAlgorithm, serverSideEncryptionByDefaultMap)], + true, + ), + ), + ], + true, + ), + ), + ); + nodes.push(bucketEncryptionAssignment); + } + + imports.push( + factory.createImportDeclaration( + undefined, + factory.createImportClause(false, undefined, factory.createNamespaceImport(factory.createIdentifier('s3'))), + factory.createStringLiteral('aws-cdk-lib/aws-s3'), + ), + ); + } + + if ( + renderArgs.auth?.userPoolClient && + renderArgs.auth.userPoolClient.SupportedIdentityProviders && + renderArgs.auth.userPoolClient.SupportedIdentityProviders.length > 0 + ) { + const idpStatements = this.createProviderSetupCode(); + nodes.push(...idpStatements); + + // Gen1 doesn't manage UserPoolDomains in CFN while Gen2 creates a default one for oauth apps. + // This causes an invalid domain request error when updating Gen2 post stack refactor. + // We are adding a commented line to remove the domain from Gen2 CDK. This will be + // uncommented by users post refactor (instructions will be in README.md). + // backend.auth.resources.userPool.node.tryRemoveChild('UserPoolDomain'); + const userPoolDomainRemovalStatementCommented = factory.createExpressionStatement( + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createPropertyAccessExpression( + factory.createIdentifier('// backend.auth.resources.userPool'), + factory.createIdentifier('node'), + ), + factory.createIdentifier('tryRemoveChild'), + ), + undefined, + [factory.createStringLiteral('UserPoolDomain')], + ), + ); + nodes.push(userPoolDomainRemovalStatementCommented); + } + + // Add a tag commented out to force a deployment post refactor + // Tags.of(backend.stack).add('gen1-migrated-app', 'true') + if (renderArgs.auth || renderArgs.storage?.hasS3Bucket || renderArgs.customResources) { + const tagAssignment = factory.createExpressionStatement( + factory.createCallExpression( + factory.createPropertyAccessExpression( + factory.createCallExpression(factory.createIdentifier('// Tags.of'), undefined, [factory.createIdentifier('backend.stack')]), + factory.createIdentifier('add'), + ), + undefined, + [factory.createStringLiteral('gen1-migrated-app'), factory.createStringLiteral('true')], + ), + ); + nodes.push(tagAssignment); + } + + return factory.createNodeArray([...imports, newLineIdentifier, ...errors, newLineIdentifier, backendStatement, ...nodes], true); + } +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/cli/command-handler.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/cli/command-handler.ts new file mode 100644 index 00000000000..9660e0578ce --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/cli/command-handler.ts @@ -0,0 +1,7 @@ +#!/usr/bin/env node +// CLI entry point - handles command line interface +// import { migrateToGen2 } from '../core/migration-pipeline'; + +export const run = async (args: string[]) => { + // Parse CLI arguments and call migration pipeline +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/cli/migration-command.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/cli/migration-command.ts new file mode 100644 index 00000000000..0b4b353f803 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/cli/migration-command.ts @@ -0,0 +1,4 @@ +// Migration command orchestration - integrates with Amplify CLI +export const migrationCommand = { + // Command definition and execution logic +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/core/migration-pipeline.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/core/migration-pipeline.ts new file mode 100644 index 00000000000..d5b6de08975 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/core/migration-pipeline.ts @@ -0,0 +1,342 @@ +/** + * Amplify Gen 2 Codegen Migration Tool + * + * This module provides the core functionality for migrating Amplify Gen 1 projects to Gen 2 format. + * It orchestrates the transformation of Gen 1 configurations into Gen 2 TypeScript resource definitions + * and project structure. + * + * Key Components: + * - Renderer Pattern: Uses a pipeline of renderers to generate different parts of the Gen 2 project + * - Category Processing: Handles auth, storage, data, functions, and custom resources + * - File Generation: Creates the necessary directory structure and configuration files + * - Type Safety: Provides comprehensive TypeScript interfaces for migration parameters + */ + +import path from 'path'; +import fs from 'node:fs/promises'; +import { PackageJson, patchNpmPackageJson } from '../npm_package/renderer'; +import { RenderPipeline, Renderer } from '../render_pipeline'; +import { JsonRenderer } from '../renderers/package_json'; +import { TypescriptNodeArrayRenderer } from '../renderers/typescript_block_node'; +import { BackendRenderParameters, BackendSynthesizer } from '../backend/synthesizer'; +import { EnsureDirectory } from '../renderers/ensure_directory'; +import { Lambda } from '../generators/functions/lambda'; +import { + AuthTriggerEvents, + AuthLambdaTriggers, + AuthDefinition, + renderAuthNode, + SendingAccount, + PolicyOverrides, + PasswordPolicyPath, + UserPoolMfaConfig, + Group, + Attribute, + EmailOptions, + LoginOptions, + StandardAttribute, + StandardAttributes, + CustomAttribute, + CustomAttributes, + MultifactorOptions, + OidcOptions, + OidcEndPoints, + MetadataOptions, + SamlOptions, + Scope, + AttributeMappingRule, + ReferenceAuth, +} from '../generators/auth/index'; +import { + StorageRenderParameters, + renderStorage, + AccessPatterns, + Permission, + S3TriggerDefinition, + StorageTriggerEvent, + ServerSideEncryptionConfiguration, +} from '../generators/storage/index.js'; + +import { DataDefinition, DataTableMapping, generateDataSource } from '../generators/data/index'; + +import { FunctionDefinition, renderFunctions } from '../generators/functions/index'; +import assert from 'assert'; + +/** + * Configuration options for Gen 2 rendering pipeline + * + * This interface defines all the parameters needed to migrate a Gen 1 Amplify project + * to Gen 2 format, including resource definitions and output configuration. + */ +export interface Gen2RenderingOptions { + /** Target directory where Gen 2 files will be generated */ + outputDir: string; + + /** Optional Amplify app ID for project identification */ + appId?: string; + + /** Backend environment name used for data table mapping resolution */ + backendEnvironmentName?: string | undefined; + + /** Authentication configuration from Gen 1 project */ + auth?: AuthDefinition; + + /** Storage (S3) configuration parameters */ + storage?: StorageRenderParameters; + + /** Data (GraphQL/DynamoDB) schema definition */ + data?: DataDefinition; + + /** Lambda function definitions */ + functions?: FunctionDefinition[]; + + /** Custom CloudFormation resources that need manual migration */ + customResources?: Map; + + /** Categories that cannot be automatically migrated */ + unsupportedCategories?: Map; + + /** Custom file writer function for testing or alternative output methods */ + fileWriter?: (content: string, path: string) => Promise; +} +/** + * Creates a file writer function for the specified path + * @param path - File path to write to + * @returns Async function that writes content to the file + */ +const createFileWriter = (path: string) => async (content: string) => fs.writeFile(path, content); + +/** + * Creates a Gen 2 renderer pipeline that transforms Gen 1 Amplify configurations + * into Gen 2 TypeScript resource definitions and project structure. + * + * The renderer follows these steps: + * 1. Sets up the Gen 2 directory structure (outputDir/amplify/) + * 2. Generates configuration files (package.json, tsconfig.json) + * 3. Processes each category (auth, storage, data, functions) if present + * 4. Creates the main backend.ts file that imports all resources + * 5. Handles custom resources and unsupported categories + * + * @param options - Configuration options for the rendering process + * @returns A Renderer that can be executed to perform the migration + */ +export const createGen2Renderer = ({ + outputDir, + backendEnvironmentName, + auth, + storage, + data, + functions, + customResources, + unsupportedCategories, + fileWriter = (content, path) => createFileWriter(path)(content), +}: Readonly): Renderer => { + // Create directory structure renderers + const ensureOutputDir = new EnsureDirectory(outputDir); + const ensureAmplifyDirectory = new EnsureDirectory(path.join(outputDir, 'amplify')); + // Generate amplify/package.json with ES module configuration + const amplifyPackageJson = new JsonRenderer( + async () => ({ type: 'module' }), + (content) => fileWriter(content, path.join(outputDir, 'amplify', 'package.json')), + ); + // Generate root package.json with Gen 2 dependencies + const jsonRenderer = new JsonRenderer( + async () => { + let packageJson: PackageJson = { + name: 'my-gen2-app', + }; + try { + const packageJsonContents = await fs.readFile(`./package.json`, { encoding: 'utf-8' }); + packageJson = JSON.parse(packageJsonContents); + } catch (e) { + // File doesn't exist or is inaccessible. Ignore. + } + // Restrict dev dependencies to specific versions based on create-amplify gen2 flow: + // https://github.com/aws-amplify/amplify-backend/blob/2dab201cb9a222c3b8c396a46c17d661411839ab/packages/create-amplify/src/amplify_project_creator.ts#L15-L24 + return patchNpmPackageJson(packageJson, { + 'aws-cdk': '^2', + 'aws-cdk-lib': '^2', + 'ci-info': '^3.8.0', + constructs: '^10.0.0', + typescript: '^5.0.0', + '@types/node': '*', + }); + }, + (content) => fileWriter(content, path.join(outputDir, 'package.json')), + ); + // Generate amplify/tsconfig.json with Gen 2 TypeScript configuration + const amplifyTsConfigJson = new JsonRenderer( + async () => ({ + compilerOptions: { + target: 'es2022', + module: 'es2022', + moduleResolution: 'bundler', + resolveJsonModule: true, + // eslint-disable-next-line spellcheck/spell-checker + esModuleInterop: true, + forceConsistentCasingInFileNames: true, + strict: true, + skipLibCheck: true, + paths: { + '$amplify/*': ['../.amplify/generated/*'], + }, + }, + }), + (content) => fileWriter(content, path.join(outputDir, 'amplify', 'tsconfig.json')), + ); + // Initialize backend synthesizer and render options + const backendSynthesizer = new BackendSynthesizer(); + const backendRenderOptions: BackendRenderParameters = {}; + + // Initialize renderer pipeline with base configuration files + const renderers: Renderer[] = [ensureOutputDir, ensureAmplifyDirectory, amplifyPackageJson, amplifyTsConfigJson, jsonRenderer]; + + // Handle categories that cannot be automatically migrated + if (unsupportedCategories && unsupportedCategories.size >= 1) { + backendRenderOptions.unsupportedCategories = unsupportedCategories; + } + + // Process Lambda functions - create resource.ts and handler.ts files + if (functions && functions.length) { + const functionNamesAndCategory = new Map(); + for (const func of functions) { + if (func.name) { + const resourceName = func.resourceName; + assert(resourceName); + const funcCategory = func.category; + assert(funcCategory); + functionNamesAndCategory.set(resourceName, funcCategory); + const dirPath = path.join(outputDir, 'amplify', funcCategory, resourceName); + // Create function directory and resource files + renderers.push(new EnsureDirectory(dirPath)); + renderers.push( + new TypescriptNodeArrayRenderer( + async () => renderFunctions(func), + (content) => { + // Create both resource.ts (with function definition) and empty handler.ts + return fileWriter(content, path.join(dirPath, 'resource.ts')).then(() => fileWriter('', path.join(dirPath, 'handler.ts'))); + }, + ), + ); + } + } + + backendRenderOptions.function = { + importFrom: './function/resource', + functionNamesAndCategories: functionNamesAndCategory, + }; + } + + // Process authentication configuration - create amplify/auth/resource.ts + if (auth) { + renderers.push(new EnsureDirectory(path.join(outputDir, 'amplify', 'auth'))); + renderers.push( + new TypescriptNodeArrayRenderer( + async () => renderAuthNode(auth), + (content) => fileWriter(content, path.join(outputDir, 'amplify', 'auth', 'resource.ts')), + ), + ); + // Configure auth parameters for backend synthesis + backendRenderOptions.auth = { + importFrom: './auth/resource', + userPoolOverrides: auth?.userPoolOverrides, + guestLogin: auth?.guestLogin, + identityPoolName: auth?.identityPoolName, + oAuthFlows: auth?.oAuthFlows, + readAttributes: auth?.readAttributes, + writeAttributes: auth?.writeAttributes, + referenceAuth: auth?.referenceAuth, + userPoolClient: auth?.userPoolClient, + }; + } + + // Process data (GraphQL/DynamoDB) configuration - only if table mappings exist for the environment + if (data && data.tableMappings && backendEnvironmentName && data.tableMappings[backendEnvironmentName] !== undefined) { + renderers.push(new EnsureDirectory(path.join(outputDir, 'amplify', 'data'))); + renderers.push( + new TypescriptNodeArrayRenderer( + async () => generateDataSource(data), + (content) => fileWriter(content, path.join(outputDir, 'amplify', 'data', 'resource.ts')), + ), + ); + backendRenderOptions.data = { + importFrom: './data/resource', + }; + } + + // Process storage configuration - create amplify/storage/resource.ts if S3 bucket is needed + if (storage) { + const hasS3Bucket = storage?.accessPatterns || storage?.storageIdentifier; + if (hasS3Bucket) { + renderers.push(new EnsureDirectory(path.join(outputDir, 'amplify', 'storage'))); + renderers.push( + new TypescriptNodeArrayRenderer( + async () => renderStorage(storage), + (content) => fileWriter(content, path.join(outputDir, 'amplify', 'storage', 'resource.ts')), + ), + ); + } + // Configure storage parameters for backend synthesis (includes both S3 and DynamoDB) + backendRenderOptions.storage = { + importFrom: './storage/resource', + dynamoDB: storage.dynamoDB, + accelerateConfiguration: storage.accelerateConfiguration, + versionConfiguration: storage.versioningConfiguration, + hasS3Bucket: hasS3Bucket, + bucketEncryptionAlgorithm: storage.bucketEncryptionAlgorithm, + bucketName: storage.bucketName, + }; + } + + // Handle custom CloudFormation resources that require manual migration + if (customResources && customResources.size > 0) { + backendRenderOptions.customResources = customResources; + } + + // Generate the main backend.ts file that imports and combines all resources + const backendRenderer = new TypescriptNodeArrayRenderer( + async () => backendSynthesizer.render(backendRenderOptions), + (content) => fileWriter(content, path.join(outputDir, 'amplify', 'backend.ts')), + ); + + renderers.push(backendRenderer); + + // Return a pipeline that executes all renderers in sequence + return new RenderPipeline(renderers); +}; +export { + Renderer, + SendingAccount, + UserPoolMfaConfig, + StorageRenderParameters, + AccessPatterns, + Permission, + S3TriggerDefinition, + PasswordPolicyPath, + AuthDefinition, + FunctionDefinition, + PolicyOverrides, + Group, + Attribute, + EmailOptions, + LoginOptions, + StandardAttribute, + StandardAttributes, + CustomAttribute, + CustomAttributes, + MultifactorOptions, + AuthTriggerEvents, + Lambda, + AuthLambdaTriggers, + StorageTriggerEvent, + DataDefinition, + DataTableMapping, + SamlOptions, + OidcEndPoints, + MetadataOptions, + OidcOptions, + Scope, + AttributeMappingRule, + ServerSideEncryptionConfiguration, + ReferenceAuth, +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/core/project-analyzer.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/core/project-analyzer.ts new file mode 100644 index 00000000000..95f222acf08 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/core/project-analyzer.ts @@ -0,0 +1,10 @@ +// Gen 1 project detection and analysis +import { Gen1ProjectConfig } from '../types'; + +export const analyzeGen1Project = async (projectPath: string): Promise => { + // Detect Gen 1 project structure + // Read amplify/backend/meta.json + // Parse CloudFormation templates + // Extract category configurations + return {}; +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/auth/index.test.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/auth/index.test.ts new file mode 100644 index 00000000000..98f02974b64 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/auth/index.test.ts @@ -0,0 +1,456 @@ +import { StandardAttributes } from 'aws-cdk-lib/aws-cognito'; +import assert from 'node:assert'; +import { + Attribute, + AttributeMappingRule, + AuthDefinition, + AuthTriggerEvents, + EmailOptions, + ReferenceAuth, + renderAuthNode, + UserPoolMfaConfig, +} from './index'; +import { printNodeArray } from '../../test_utils/ts_node_printer'; + +describe('render auth node', () => { + describe('external providers', () => { + describe('Google', () => { + it('renders the google provider', () => { + const rendered = renderAuthNode({ + loginOptions: { googleLogin: true, callbackURLs: ['https://example.com/callback'], logoutURLs: ['https://example.com/logout'] }, + }); + const source = printNodeArray(rendered); + assert.match(source, /google:/); + assert.match(source, /clientId: secret\("GOOGLE_CLIENT_ID"\)/); + assert.match(source, /clientSecret: secret\("GOOGLE_CLIENT_SECRET"\)/); + assert.match(source, /callbackUrls: \[\"https:\/\/example\.com\/callback\"\]/); + assert.match(source, /logoutUrls: \[\"https:\/\/example\.com\/logout\"\]/); + }); + }); + describe('Facebook', () => { + it('renders the facebook provider', () => { + const rendered = renderAuthNode({ + loginOptions: { facebookLogin: true, callbackURLs: ['https://example.com/callback'], logoutURLs: ['https://example.com/logout'] }, + }); + const source = printNodeArray(rendered); + assert.match(source, /facebook:/); + assert.match(source, /clientId: secret\("FACEBOOK_CLIENT_ID"\)/); + assert.match(source, /clientSecret: secret\("FACEBOOK_CLIENT_SECRET"\)/); + assert.match(source, /callbackUrls: \[\"https:\/\/example\.com\/callback\"\]/); + assert.match(source, /logoutUrls: \[\"https:\/\/example\.com\/logout\"\]/); + }); + }); + describe('Apple', () => { + it('renders the apple provider', () => { + const rendered = renderAuthNode({ + loginOptions: { appleLogin: true, callbackURLs: ['https://example.com/callback'], logoutURLs: ['https://example.com/logout'] }, + }); + const source = printNodeArray(rendered); + assert.match(source, /signInWithApple:/); + assert.match(source, /clientId: secret\("SIWA_CLIENT_ID"\)/); + assert.match(source, /keyId: secret\("SIWA_KEY_ID"\)/); + assert.match(source, /privateKey: secret\("SIWA_PRIVATE_KEY"\)/); + assert.match(source, /teamId: secret\("SIWA_TEAM_ID"\)/); + assert.match(source, /callbackUrls: \[\"https:\/\/example\.com\/callback\"\]/); + assert.match(source, /logoutUrls: \[\"https:\/\/example\.com\/logout\"\]/); + }); + }); + describe('Amazon', () => { + it('renders the amazon provider', () => { + const rendered = renderAuthNode({ + loginOptions: { amazonLogin: true, callbackURLs: ['https://example.com/callback'], logoutURLs: ['https://example.com/logout'] }, + }); + const source = printNodeArray(rendered); + assert.match(source, /loginWithAmazon:/); + assert.match(source, /clientId: secret\("LOGINWITHAMAZON_CLIENT_ID"\)/); + assert.match(source, /clientSecret: secret\("LOGINWITHAMAZON_CLIENT_SECRET"\)/); + assert.match(source, /callbackUrls: \[\"https:\/\/example\.com\/callback\"\]/); + assert.match(source, /logoutUrls: \[\"https:\/\/example\.com\/logout\"\]/); + }); + }); + describe('OIDC', () => { + it('renders the oidc provider', () => { + const rendered = renderAuthNode({ + loginOptions: { + oidcLogin: [{ issuerUrl: 'https://e' }, { name: 'Sanay', issuerUrl: 'hey' }], + callbackURLs: ['https://example.com/callback'], + logoutURLs: ['https://example.com/logout'], + }, + }); + const source = printNodeArray(rendered); + assert.match(source, /oidc:/); + assert.match(source, /clientId: secret\("OIDC_CLIENT_ID_1"\)/); + assert.match(source, /clientSecret: secret\("OIDC_CLIENT_SECRET_1"\)/); + assert.match(source, /issuerUrl: \"https:\/\/e\"/); + assert.match(source, /issuerUrl: \"hey\"/); + assert.match(source, /name: "Sanay"/); + }); + it('does not render OIDC if not passed', () => { + const rendered = renderAuthNode({ + loginOptions: { + oidcLogin: [], + }, + }); + const source = printNodeArray(rendered); + assert(!source.includes('oidc:')); + }); + }); + describe('SAML', () => { + it('renders the saml provider', () => { + const rendered = renderAuthNode({ + loginOptions: { + samlLogin: { name: 'Sanay', metadata: { metadataContent: 'content', metadataType: 'URL' } }, + callbackURLs: ['https://example.com/callback'], + logoutURLs: ['https://example.com/logout'], + }, + }); + const source = printNodeArray(rendered); + assert.match(source, /saml:/); + assert.match(source, /metadataContent: \"content\"/); + assert.match(source, /metadataType: \"URL\"/); + assert.match(source, /name: "Sanay"/); + }); + it('does not render SAML if not passed', () => { + const rendered = renderAuthNode({ + loginOptions: {}, + }); + const source = printNodeArray(rendered); + assert(!source.includes('saml:')); + }); + }); + }); + describe('lambda', () => { + it('adds a triggers object when a lambda trigger is defined', () => { + const rendered = renderAuthNode({ lambdaTriggers: { preSignUp: { source: 'amplify/backend/function/testfunction/handler.ts' } } }); + const source = printNodeArray(rendered); + assert.match(source, /triggers: \{/); + }); + const testCases: Record = { + createAuthChallenge: true, + customMessage: true, + defineAuthChallenge: true, + postAuthentication: true, + postConfirmation: true, + preAuthentication: true, + preSignUp: true, + preTokenGeneration: true, + userMigration: true, + verifyAuthChallengeResponse: true, + }; + for (const testCase of Object.keys(testCases)) { + const rendered = renderAuthNode({ lambdaTriggers: { [testCase]: { source: `amplify/backend/function/${testCase}/handler.ts` } } }); + const source = printNodeArray(rendered); + assert.match(source, new RegExp(`triggers:\\s*{\\s*${testCase}:\\s*${testCase}\\s*}`)); + } + }); + describe('mfa', () => { + it('does not render the multifactor property if no multifactor options are specified', () => { + const rendered = renderAuthNode({}); + const source = printNodeArray(rendered); + assert.doesNotMatch(source, new RegExp(`multifactor:`)); + }); + describe('totp', () => { + it('does not render totp if totp is not specified', () => { + const rendered = renderAuthNode({ mfa: { mode: 'OPTIONAL' } }); + const source = printNodeArray(rendered); + assert.doesNotMatch(source, new RegExp(`multifactor:\\s+\\{[\\s\\S]*totp:\\strue`)); + }); + const totpStates: boolean[] = [true, false]; + for (const state of totpStates) { + it(`correctly renders totp state of ${state}`, async () => { + const rendered = renderAuthNode({ mfa: { mode: 'OPTIONAL', totp: state } }); + const source = printNodeArray(rendered); + assert.match(source, new RegExp(`multifactor:\\s+\\{[\\s\\S]*totp:\\s${state}`)); + }); + } + }); + describe('sms', () => { + it('does not render sms if sms is not specified', () => { + const rendered = renderAuthNode({ mfa: { mode: 'OPTIONAL' } }); + const source = printNodeArray(rendered); + assert.doesNotMatch(source, new RegExp(`multifactor:\\s+\\{[\\s\\S]*sms:\\strue`)); + }); + const smsStates: boolean[] = [true, false]; + for (const state of smsStates) { + it(`correctly renders sms state of ${state}`, async () => { + const rendered = renderAuthNode({ mfa: { mode: 'OPTIONAL', sms: state } }); + const source = printNodeArray(rendered); + assert.match(source, new RegExp(`multifactor:\\s+\\{[\\s\\S]*sms:\\s${state}`)); + }); + } + }); + const modes: UserPoolMfaConfig[] = ['REQUIRED', 'OFF', 'OPTIONAL']; + for (const mode of modes) { + it(`correctly renders mfa state of ${mode}`, async () => { + const rendered = renderAuthNode({ mfa: { mode } }); + const source = printNodeArray(rendered); + assert.match(source, new RegExp(`multifactor:\\s+\\{\\s+mode:\\s"${mode}"`)); + }); + } + }); + describe('imports', () => { + it('imports @aws-amplify/backend', async () => { + const rendered = renderAuthNode({ + loginOptions: { email: true }, + }); + const source = printNodeArray(rendered); + assert.match(source, /import\s?\{\s?defineAuth\s?\}\s?from\s?"\@aws-amplify\/backend"/); + }); + }); + describe('username attributes', () => { + describe('Standard Attributes', () => { + const attributes: Array = [ + 'email', + 'gender', + 'locale', + 'address', + 'website', + 'fullname', + 'nickname', + 'timezone', + 'birthdate', + 'givenName', + 'familyName', + 'middleName', + 'phoneNumber', + 'profilePage', + 'profilePicture', + 'lastUpdateTime', + 'preferredUsername', + ]; + for (const attribute of attributes) { + for (const truthiness of [true, false]) { + it(`renders ${attribute}: ${truthiness} individually`, () => { + const authDefinition: AuthDefinition = { + loginOptions: { + email: true, + }, + standardUserAttributes: { + [attribute as Attribute]: { + mutable: truthiness, + required: truthiness, + }, + }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert(source.includes(attribute)); + assert(source.includes(`mutable: ${truthiness}`)); + assert(source.includes(`required: ${truthiness}`)); + }); + } + } + }); + describe('Custom Attributes', () => { + it('renders custom attributes', () => { + const authDefinition: AuthDefinition = { + loginOptions: { + email: true, + }, + customUserAttributes: { 'custom:Test1': { dataType: 'Number', mutable: true, min: 10, max: 100 } }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert(source.includes('custom:Test1')); + assert(source.includes('dataType: "Number"')); + }); + it('does not render anything if CustomAttribute is undefined', () => { + const authDefinition: AuthDefinition = { + loginOptions: { + email: true, + }, + customUserAttributes: { 'custom:isAllowed': undefined }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert(!source.includes('custom:isAllowed')); + }); + }); + }); + describe('groups', () => { + it('renders groups', () => { + const authDefinition: AuthDefinition = { + loginOptions: {}, + groups: ['manager'], + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /defineAuth\(\{[\s\S]*groups:\s\["manager"\]/); + }); + }); + describe('loginWith', () => { + describe('email', () => { + type TestCase = { + optionProperty: T; + gen2DefinitionProperty: string; + value: EmailOptions[T]; + searchPattern: string; + }; + + const emailPropertyTestCases: TestCase[] = [ + { + optionProperty: 'emailVerificationSubject', + value: 'My Verification Subject', + gen2DefinitionProperty: 'verificationEmailSubject', + searchPattern: '"My Verification Subject"', + }, + { + optionProperty: 'emailVerificationBody', + gen2DefinitionProperty: 'verificationEmailBody', + value: 'My Verification Body', + searchPattern: '\\(\\) => "My Verification Body"', + }, + ]; + for (const { optionProperty: property, value, searchPattern, gen2DefinitionProperty } of emailPropertyTestCases) { + it(`renders email login parameter ${property}`, () => { + const emailOptions: Partial = { + [property as keyof EmailOptions]: value, + }; + const authDefinition: AuthDefinition = { + loginOptions: { + emailOptions, + }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match( + source, + new RegExp( + `defineAuth\\(\\{\\s+loginWith:\\s+\\{\\s+email:\\s+\\{\\s+${gen2DefinitionProperty}: ${searchPattern}\\s+\\}\\s+\\}\\s+\\}\\)`, + ), + ); + }); + } + it('renders `email: true`', () => { + const authDefinition: AuthDefinition = { + loginOptions: { + email: true, + }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /defineAuth\(\{\s+loginWith:\s+\{\s+email:\s?true\s+\}\s+\}\)/); + }); + }); + describe('phone', () => { + it('renders `phone: true`', () => { + const authDefinition: AuthDefinition = { + loginOptions: { + phone: true, + }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /defineAuth\(\{\s+loginWith:\s+\{\s+phone:\s?true\s+\}\s+\}\)/); + }); + }); + describe('OAuth scopes', () => { + it('renders oauth scopes', () => { + const authDefinition: AuthDefinition = { + loginOptions: { + googleLogin: true, + scopes: ['EMAIL', 'OPENID'], + }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /defineAuth\(\{[\s\S]*scopes:\s\["EMAIL",\s"OPENID"\]/); + }); + it('renders no oauth scopes if not passed', () => { + const authDefinition: AuthDefinition = { + loginOptions: {}, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.doesNotMatch(source, /scopes:/); + }); + }); + it('renders attributeMapping if passed along with Google login', () => { + const authDefinition: AuthDefinition = { + loginOptions: { + googleLogin: true, + googleAttributes: { fullname: 'name' } as AttributeMappingRule, + }, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /defineAuth\(\{[\s\S]*attributeMapping:\s\{[\s\S]*fullname:\s"name"/); + }); + }); + describe('reference auth', () => { + it(`renders successfully for imported userpool`, () => { + const referenceAuthProps: ReferenceAuth = { + userPoolId: 'userPoolId', + userPoolClientId: 'userPoolClientId', + groups: { + Admin: 'AdminRoleARN', + ReadOnly: 'ReadOnlyRoleARN', + }, + }; + const authDefinition: AuthDefinition = { + referenceAuth: referenceAuthProps, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /referenceAuth/); + assert.match(source, /userPoolId: "userPoolId"/); + assert.match(source, /userPoolClientId: "userPoolClientId"/); + assert.match(source, /groups:/); + assert.match(source, /"Admin": "AdminRoleARN"/); + assert.match(source, /"ReadOnly": "ReadOnlyRoleARN"/); + assert.doesNotMatch(source, /identityPoolId: "identityPoolId"/); + assert.doesNotMatch(source, /authRoleArn: "authRoleArn"/); + assert.doesNotMatch(source, /unauthRoleArn: "unauthRoleArn"/); + }); + + it(`renders successfully for imported identity pool`, () => { + const referenceAuthProps: ReferenceAuth = { + identityPoolId: 'identityPoolId', + authRoleArn: 'authRoleArn', + unauthRoleArn: 'unauthRoleArn', + }; + const authDefinition: AuthDefinition = { + referenceAuth: referenceAuthProps, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /referenceAuth/); + assert.match(source, /identityPoolId: "identityPoolId"/); + assert.match(source, /authRoleArn: "authRoleArn"/); + assert.match(source, /unauthRoleArn: "unauthRoleArn"/); + assert.doesNotMatch(source, /userPoolId: "userPoolId"/); + assert.doesNotMatch(source, /userPoolClientId: "userPoolClientId"/); + assert.doesNotMatch(source, /groups:/); + assert.doesNotMatch(source, /"Admin": "AdminRoleARN"/); + assert.doesNotMatch(source, /"ReadOnly": "ReadOnlyRoleARN"/); + }); + + it(`renders successfully for imported userpool and identity pool`, () => { + const referenceAuthProps: ReferenceAuth = { + userPoolId: 'userPoolId', + userPoolClientId: 'userPoolClientId', + identityPoolId: 'identityPoolId', + authRoleArn: 'authRoleArn', + unauthRoleArn: 'unauthRoleArn', + groups: { + Admin: 'AdminRoleARN', + 'Read-Only': 'ReadOnlyRoleARN', + }, + }; + const authDefinition: AuthDefinition = { + referenceAuth: referenceAuthProps, + }; + const node = renderAuthNode(authDefinition); + const source = printNodeArray(node); + assert.match(source, /referenceAuth/); + assert.match(source, /userPoolId: "userPoolId"/); + assert.match(source, /userPoolClientId: "userPoolClientId"/); + assert.match(source, /identityPoolId: "identityPoolId"/); + assert.match(source, /authRoleArn: "authRoleArn"/); + assert.match(source, /unauthRoleArn: "unauthRoleArn"/); + assert.match(source, /groups:/); + assert.match(source, /"Admin": "AdminRoleARN"/); + assert.match(source, /"Read-Only": "ReadOnlyRoleARN"/); + }); + }); +}); diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/auth/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/auth/index.ts new file mode 100644 index 00000000000..bf8d4fee8da --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/auth/index.ts @@ -0,0 +1,914 @@ +/** + * Auth Source Builder for Amplify Gen1 to Gen2 Migration + * + * This module generates TypeScript AST nodes for Amplify Gen 2 auth resources + * from Gen 1 auth configurations. It handles the complete transformation of + * authentication settings including login providers, MFA, user attributes, + * Lambda triggers, and security configurations. + * + * @file Core auth code generation for Gen1→Gen2 migration tool + */ + +import ts, { PropertyAssignment } from 'typescript'; +import assert from 'node:assert'; +import { PasswordPolicyType, UserPoolClientType } from '@aws-sdk/client-cognito-identity-provider'; +import { renderResourceTsFile } from '../../resource/resource'; +import { createTriggersProperty, Lambda } from '../functions/lambda'; + +/** OAuth 2.0 scopes supported by Cognito User Pools */ +export type Scope = 'PHONE' | 'EMAIL' | 'OPENID' | 'PROFILE' | 'COGNITO_ADMIN'; + +/** Configuration for standard Cognito user attributes */ +export type StandardAttribute = { + /** Whether the attribute can be modified after user creation */ + readonly mutable?: boolean; + /** Whether the attribute is required during user registration */ + readonly required?: boolean; +}; + +/** Configuration for custom user attributes with validation constraints */ +export type CustomAttribute = { + /** Data type of the custom attribute (String, Number, DateTime, Boolean) */ + readonly dataType: string | undefined; + /** Whether the attribute can be modified after user creation */ + readonly mutable?: boolean; + + /** String attribute constraints */ + /** Minimum length for string attributes */ + minLen?: number; + /** Maximum length for string attributes */ + maxLen?: number; + + /** Number attribute constraints */ + /** Minimum value for number attributes */ + min?: number; + /** Maximum value for number attributes */ + max?: number; +}; + +/** Standard user attributes supported by Cognito User Pools */ +export type Attribute = + | 'address' + | 'birthdate' + | 'email' + | 'familyName' + | 'gender' + | 'givenName' + | 'locale' + | 'middleName' + | 'fullname' + | 'nickname' + | 'phoneNumber' + | 'profilePicture' + | 'preferredUsername' + | 'profilePage' + | 'timezone' + | 'lastUpdateTime' + | 'website'; + +/** Maps standard attributes to external provider attribute names */ +export type AttributeMappingRule = Record; + +/** Email sending account configuration for Cognito */ +export type SendingAccount = 'COGNITO_DEFAULT' | 'DEVELOPER'; + +/** Multi-factor authentication configuration modes */ +export type UserPoolMfaConfig = 'OFF' | 'REQUIRED' | 'OPTIONAL'; + +/** Type-safe paths for password policy overrides */ +export type PasswordPolicyPath = `Policies.PasswordPolicy.${keyof PasswordPolicyType}`; + +/** CloudFormation policy overrides for User Pool configuration */ +export type PolicyOverrides = Partial>; + +/** Email verification message customization */ +export type EmailOptions = { + /** Custom email verification message body */ + emailVerificationBody: string; + /** Custom email verification subject line */ + emailVerificationSubject: string; +}; + +/** Collection of standard user attributes with their configurations */ +export type StandardAttributes = Partial>; +/** Collection of custom user attributes with their configurations */ +export type CustomAttributes = Partial>; + +/** User group name */ +export type Group = string; + +/** SAML metadata configuration options */ +export type MetadataOptions = { + /** SAML metadata content (URL or file content) */ + metadataContent: string; + /** Type of metadata source */ + metadataType: 'URL' | 'FILE'; +}; + +/** SAML identity provider configuration */ +export type SamlOptions = { + /** Optional name for the SAML provider */ + name?: string; + /** SAML metadata configuration */ + metadata: MetadataOptions; + /** Attribute mapping from SAML to Cognito attributes */ + attributeMapping?: AttributeMappingRule; +}; + +/** OpenID Connect endpoint URLs */ +export type OidcEndPoints = { + /** Authorization endpoint URL */ + authorization?: string; + /** Token endpoint URL */ + token?: string; + /** User info endpoint URL */ + userInfo?: string; + /** JSON Web Key Set URI */ + jwksUri?: string; +}; + +/** OpenID Connect identity provider configuration */ +export type OidcOptions = { + /** OIDC issuer URL */ + issuerUrl: string; + /** Optional name for the OIDC provider */ + name?: string; + /** Custom OIDC endpoints (optional, auto-discovered if not provided) */ + endpoints?: OidcEndPoints; + /** Attribute mapping from OIDC to Cognito attributes */ + attributeMapping?: AttributeMappingRule; +}; + +/** Comprehensive login configuration options */ +export type LoginOptions = { + /** Enable email-based login */ + email?: boolean; + /** Enable phone number-based login */ + phone?: boolean; + /** Custom email verification settings */ + emailOptions?: Partial; + /** Enable Google social login */ + googleLogin?: boolean; + /** Enable Amazon social login */ + amazonLogin?: boolean; + /** Enable Apple Sign In */ + appleLogin?: boolean; + /** Enable Facebook social login */ + facebookLogin?: boolean; + /** OpenID Connect providers configuration */ + oidcLogin?: OidcOptions[]; + /** SAML identity provider configuration */ + samlLogin?: SamlOptions; + /** Google attribute mapping */ + googleAttributes?: AttributeMappingRule; + /** Amazon attribute mapping */ + amazonAttributes?: AttributeMappingRule; + /** Apple attribute mapping */ + appleAttributes?: AttributeMappingRule; + /** Facebook attribute mapping */ + facebookAttributes?: AttributeMappingRule; + /** OAuth callback URLs */ + callbackURLs?: string[]; + /** OAuth logout URLs */ + logoutURLs?: string[]; + /** OAuth scopes to request */ + scopes?: Scope[]; + /** Index signature for extensibility */ + [key: string]: boolean | Partial | string[] | Scope[] | OidcOptions[] | SamlOptions | AttributeMappingRule | undefined; +}; + +/** Multi-factor authentication configuration */ +export type MultifactorOptions = { + /** MFA enforcement mode */ + mode: UserPoolMfaConfig; + /** Enable Time-based One-Time Password (TOTP) */ + totp?: boolean; + /** Enable SMS-based MFA */ + sms?: boolean; +}; + +/** Lambda triggers for Cognito User Pool events */ +export type AuthLambdaTriggers = Record; + +/** Cognito User Pool Lambda trigger event types */ +export type AuthTriggerEvents = + | 'createAuthChallenge' // Create custom auth challenge + | 'customMessage' // Customize verification messages + | 'defineAuthChallenge' // Define custom auth flow + | 'postAuthentication' // Post-authentication processing + | 'postConfirmation' // Post-confirmation processing + | 'preAuthentication' // Pre-authentication validation + | 'preSignUp' // Pre-registration validation + | 'preTokenGeneration' // Customize JWT tokens + | 'userMigration' // Migrate users from external systems + | 'verifyAuthChallengeResponse'; // Verify custom auth challenge + +/** Configuration for referencing existing auth resources */ +export type ReferenceAuth = { + /** Existing Cognito User Pool ID */ + userPoolId?: string; + /** Existing Cognito Identity Pool ID */ + identityPoolId?: string; + /** IAM role ARN for authenticated users */ + authRoleArn?: string; + /** IAM role ARN for unauthenticated users */ + unauthRoleArn?: string; + /** Existing User Pool Client ID */ + userPoolClientId?: string; + /** Existing user groups mapping */ + groups?: Record; +}; + +/** + * Complete authentication configuration definition + * + * This interface represents the full auth configuration that will be + * transformed into Gen 2 TypeScript code. It encompasses all possible + * auth features including login methods, MFA, user attributes, Lambda + * triggers, and external provider integrations. + */ +export interface AuthDefinition { + /** Login method configurations */ + loginOptions?: LoginOptions; + /** User groups to create */ + groups?: Group[]; + /** Multi-factor authentication settings */ + mfa?: MultifactorOptions; + /** Standard Cognito user attributes */ + standardUserAttributes?: StandardAttributes; + /** Custom user attributes */ + customUserAttributes?: CustomAttributes; + /** CloudFormation policy overrides */ + userPoolOverrides?: PolicyOverrides; + /** Lambda function triggers */ + lambdaTriggers?: Partial; + /** Enable unauthenticated access */ + guestLogin?: boolean; + /** Custom Identity Pool name */ + identityPoolName?: string; + /** OAuth 2.0 flows to enable */ + oAuthFlows?: string[]; + /** Attributes that can be read */ + readAttributes?: string[]; + /** Attributes that can be written */ + writeAttributes?: string[]; + /** Reference to existing auth resources */ + referenceAuth?: ReferenceAuth; + /** Existing User Pool Client configuration */ + userPoolClient?: UserPoolClientType; +} + +// TypeScript AST factory for creating nodes +const factory = ts.factory; + +// Secret management identifier for Gen 2 +const secretIdentifier = factory.createIdentifier('secret'); + +// Social provider secret key constants +/** Google OAuth credentials */ +const googleClientID = 'GOOGLE_CLIENT_ID'; +const googleClientSecret = 'GOOGLE_CLIENT_SECRET'; + +/** Amazon Login with Amazon credentials */ +const amazonClientID = 'LOGINWITHAMAZON_CLIENT_ID'; +const amazonClientSecret = 'LOGINWITHAMAZON_CLIENT_SECRET'; + +/** Facebook Login credentials */ +const facebookClientID = 'FACEBOOK_CLIENT_ID'; +const facebookClientSecret = 'FACEBOOK_CLIENT_SECRET'; + +/** Apple Sign In With Apple credentials */ +const appleClientID = 'SIWA_CLIENT_ID'; +const appleKeyId = 'SIWA_KEY_ID'; +const applePrivateKey = 'SIWA_PRIVATE_KEY'; +const appleTeamID = 'SIWA_TEAM_ID'; + +/** OpenID Connect credentials */ +const oidcClientID = 'OIDC_CLIENT_ID'; +const oidcClientSecret = 'OIDC_CLIENT_SECRET'; + +/** + * Creates TypeScript AST for social provider configuration + * + * Generates object literal with secret() calls for credentials and + * optional attribute mapping configuration. + * + * @example + * ```typescript + * // Input: + * config = { clientId: 'GOOGLE_CLIENT_ID', clientSecret: 'GOOGLE_CLIENT_SECRET' } + * attributeMapping = { email: 'email', name: 'name' } + * + * // Output (TypeScript code): + * { + * clientId: secret('GOOGLE_CLIENT_ID'), + * clientSecret: secret('GOOGLE_CLIENT_SECRET'), + * attributeMapping: { + * email: 'email', + * name: 'name' + * } + * } + * ``` + * + * @param config - Provider credentials (clientId, clientSecret, etc.) + * @param attributeMapping - Optional mapping of provider attributes to Cognito attributes + * @returns Array of TypeScript property assignments + */ +function createProviderConfig(config: Record, attributeMapping: AttributeMappingRule | undefined) { + const properties: ts.ObjectLiteralElementLike[] = []; + + Object.entries(config).map(([key, value]) => + properties.push( + factory.createPropertyAssignment( + factory.createIdentifier(key), + factory.createCallExpression(secretIdentifier, undefined, [factory.createStringLiteral(value)]), + ), + ), + ); + + if (attributeMapping) { + const mappingProperties: ts.ObjectLiteralElementLike[] = []; + + Object.entries(attributeMapping).map(([key, value]) => + mappingProperties.push(factory.createPropertyAssignment(factory.createIdentifier(key), factory.createStringLiteral(value))), + ); + + properties.push( + factory.createPropertyAssignment( + factory.createIdentifier('attributeMapping'), + factory.createObjectLiteralExpression(mappingProperties, true), + ), + ); + } + + return properties; +} + +/** + * Creates a property assignment for a social login provider + * + * @example + * ```typescript + * // Input: + * createProviderPropertyAssignment('google', + * { clientId: 'GOOGLE_CLIENT_ID', clientSecret: 'GOOGLE_CLIENT_SECRET' }, + * { email: 'email' } + * ) + * + * // Output (TypeScript code): + * google: { + * clientId: secret('GOOGLE_CLIENT_ID'), + * clientSecret: secret('GOOGLE_CLIENT_SECRET'), + * attributeMapping: { + * email: 'email' + * } + * } + * ``` + * + * @param name - Provider name (e.g., 'google', 'facebook') + * @param config - Provider configuration (credentials) + * @param attributeMapping - Optional attribute mapping + * @returns TypeScript property assignment for the provider + */ +function createProviderPropertyAssignment( + name: string, + config: Record, + attributeMapping: AttributeMappingRule | undefined, +) { + return factory.createPropertyAssignment( + factory.createIdentifier(name), + factory.createObjectLiteralExpression(createProviderConfig(config, attributeMapping), true), + ); +} + +/** + * Creates property assignments for OIDC/SAML provider configuration + * + * Recursively processes nested configuration objects to create + * TypeScript AST nodes for complex provider settings. + * + * @example + * ```typescript + * // Input: + * config = { + * issuerUrl: 'https://example.com', + * endpoints: { + * authorization: 'https://example.com/auth', + * token: 'https://example.com/token' + * } + * } + * + * // Output (TypeScript code): + * { + * issuerUrl: 'https://example.com', + * endpoints: { + * authorization: 'https://example.com/auth', + * token: 'https://example.com/token' + * } + * } + * ``` + * + * @param config - OIDC/SAML configuration object + * @returns Array of TypeScript property assignments + */ +function createOidcSamlPropertyAssignments( + config: Record, +): PropertyAssignment[] { + return Object.entries(config).flatMap(([key, value]) => { + if (typeof value === 'string') { + return [factory.createPropertyAssignment(factory.createIdentifier(key), factory.createStringLiteral(value))]; + } else if (typeof value === 'object' && value !== null) { + return [ + factory.createPropertyAssignment( + factory.createIdentifier(key), + factory.createObjectLiteralExpression(createOidcSamlPropertyAssignments(value), true), + ), + ]; + } + return []; + }); +} + +/** + * Creates error statements for missing secrets + * + * Generates throw statements that provide helpful error messages + * with CLI commands to set missing secrets. + * + * @example + * ```typescript + * // Input: + * createSecretErrorStatements(['GOOGLE_CLIENT_ID', 'GOOGLE_CLIENT_SECRET']) + * + * // Output (TypeScript code): + * throw new Error('Secrets need to be reset, use `npx ampx sandbox secret set GOOGLE_CLIENT_ID` to set the value'); + * throw new Error('Secrets need to be reset, use `npx ampx sandbox secret set GOOGLE_CLIENT_SECRET` to set the value'); + * ``` + * + * @param secretVariables - Array of secret variable names + * @returns Array of TypeScript throw statement nodes + */ +function createSecretErrorStatements(secretVariables: string[]): ts.Node[] { + return secretVariables.map((secret) => + factory.createCallExpression(factory.createIdentifier('throw new Error'), undefined, [ + factory.createStringLiteral(`Secrets need to be reset, use \`npx ampx sandbox secret set ${secret}\` to set the value`), + ]), + ); +} + +/** + * Creates the externalProviders configuration for social login + * + * This is the main function that orchestrates the creation of all + * external authentication providers (Google, Apple, Facebook, Amazon, + * OIDC, SAML) based on the login options provided. + * + * @example + * ```typescript + * // Input: + * loginOptions = { googleLogin: true, facebookLogin: true } + * + * // Output (TypeScript code): + * externalProviders: { + * google: { + * clientId: secret('GOOGLE_CLIENT_ID'), + * clientSecret: secret('GOOGLE_CLIENT_SECRET') + * }, + * facebook: { + * clientId: secret('FACEBOOK_CLIENT_ID'), + * clientSecret: secret('FACEBOOK_CLIENT_SECRET') + * } + * } + * ``` + * + * @param loginOptions - Login configuration with provider flags + * @param callbackUrls - OAuth callback URLs + * @param logoutUrls - OAuth logout URLs + * @param secretErrors - Array to collect secret error statements + * @returns TypeScript object literal expression for externalProviders + */ +function createExternalProvidersPropertyAssignment( + loginOptions: LoginOptions, + callbackUrls?: string[], + logoutUrls?: string[], + secretErrors?: ts.Node[], +) { + const providerAssignments: PropertyAssignment[] = []; + + if (loginOptions.googleLogin) { + providerAssignments.push( + createProviderPropertyAssignment( + 'google', + { + clientId: googleClientID, + clientSecret: googleClientSecret, + }, + loginOptions.googleAttributes, + ), + ); + secretErrors?.push(...createSecretErrorStatements([googleClientID, googleClientSecret])); + } + + if (loginOptions.appleLogin) { + providerAssignments.push( + createProviderPropertyAssignment( + 'signInWithApple', + { + clientId: appleClientID, + keyId: appleKeyId, + privateKey: applePrivateKey, + teamId: appleTeamID, + }, + loginOptions.appleAttributes, + ), + ); + secretErrors?.push(...createSecretErrorStatements([appleClientID, appleKeyId, applePrivateKey, appleTeamID])); + } + + if (loginOptions.amazonLogin) { + providerAssignments.push( + createProviderPropertyAssignment( + 'loginWithAmazon', + { + clientId: amazonClientID, + clientSecret: amazonClientSecret, + }, + loginOptions.amazonAttributes, + ), + ); + secretErrors?.push(...createSecretErrorStatements([amazonClientID, amazonClientSecret])); + } + + if (loginOptions.facebookLogin) { + providerAssignments.push( + createProviderPropertyAssignment( + 'facebook', + { + clientId: facebookClientID, + clientSecret: facebookClientSecret, + }, + loginOptions.facebookAttributes, + ), + ); + secretErrors?.push(...createSecretErrorStatements([facebookClientID, facebookClientSecret])); + } + + if (loginOptions.samlLogin) { + providerAssignments.push( + factory.createPropertyAssignment( + factory.createIdentifier('saml'), + factory.createObjectLiteralExpression(createOidcSamlPropertyAssignments(loginOptions.samlLogin), true), + ), + ); + } + + if (loginOptions.oidcLogin && loginOptions.oidcLogin.length > 0) { + providerAssignments.push( + factory.createPropertyAssignment( + factory.createIdentifier('oidc'), + factory.createArrayLiteralExpression( + loginOptions.oidcLogin.map((oidc, index) => + factory.createObjectLiteralExpression( + [ + factory.createPropertyAssignment( + factory.createIdentifier('clientId'), + factory.createCallExpression(secretIdentifier, undefined, [factory.createStringLiteral(`${oidcClientID}_${index + 1}`)]), + ), + factory.createPropertyAssignment( + factory.createIdentifier('clientSecret'), + factory.createCallExpression(secretIdentifier, undefined, [ + factory.createStringLiteral(`${oidcClientSecret}_${index + 1}`), + ]), + ), + ...createOidcSamlPropertyAssignments(oidc), + ], + true, + ), + ), + true, + ), + ), + ); + secretErrors?.push(...createSecretErrorStatements([oidcClientID, oidcClientSecret])); + } + + if (loginOptions.scopes) { + providerAssignments.push( + factory.createPropertyAssignment( + factory.createIdentifier('scopes'), + factory.createArrayLiteralExpression(loginOptions.scopes.map((scope) => factory.createStringLiteral(scope))), + ), + ); + } + + const properties = [ + ...providerAssignments, + factory.createPropertyAssignment( + factory.createIdentifier('callbackUrls'), + factory.createArrayLiteralExpression(callbackUrls?.map((url) => factory.createStringLiteral(url))), + ), + factory.createPropertyAssignment( + factory.createIdentifier('logoutUrls'), + factory.createArrayLiteralExpression(logoutUrls?.map((url) => factory.createStringLiteral(url))), + ), + ]; + + return factory.createObjectLiteralExpression(properties, true); +} + +/** + * Creates the loginWith property assignment for auth configuration + * + * Processes email/phone login options and integrates external providers. + * Handles custom email verification settings and creates the complete + * loginWith configuration object. + * + * @param logInDefinition - Login options configuration + * @param secretErrors - Array to collect secret error statements + * @returns TypeScript property assignment for loginWith + */ +function createLogInWithPropertyAssignment(logInDefinition: LoginOptions = {}, secretErrors: ts.Node[]) { + const logInWith = factory.createIdentifier('loginWith'); + const assignments: ts.ObjectLiteralElementLike[] = []; + // BUG #1 + // SOLVED IN NEW TOOL + // DOES NOT ACCOUNT FOR THE CASE WHERE EMAIL IS TRUE AND LOGIN OPTIONS IS ALSO TRUE + if (logInDefinition.email === true) { + assignments.push(factory.createPropertyAssignment(factory.createIdentifier('email'), factory.createTrue())); + } + // Custom email messages to send to the user on verification + else if (typeof logInDefinition.emailOptions === 'object') { + const emailDefinitionAssignments: ts.ObjectLiteralElementLike[] = []; + + if (logInDefinition.emailOptions?.emailVerificationSubject) { + emailDefinitionAssignments.push( + factory.createPropertyAssignment( + 'verificationEmailSubject', + factory.createStringLiteral(logInDefinition.emailOptions.emailVerificationSubject), + ), + ); + } + if (logInDefinition.emailOptions?.emailVerificationBody) { + emailDefinitionAssignments.push( + factory.createPropertyAssignment( + 'verificationEmailBody', + factory.createArrowFunction( + undefined, + undefined, + [], + undefined, + undefined, + factory.createStringLiteral(logInDefinition.emailOptions.emailVerificationBody), + ), + ), + ); + } + const emailDefinitionObject = factory.createObjectLiteralExpression(emailDefinitionAssignments, true); + assignments.push(factory.createPropertyAssignment(factory.createIdentifier('email'), emailDefinitionObject)); + } + if (logInDefinition.phone === true) { + assignments.push(factory.createPropertyAssignment(factory.createIdentifier('phone'), factory.createTrue())); + } + if ( + logInDefinition.amazonLogin || + logInDefinition.googleLogin || + logInDefinition.facebookLogin || + logInDefinition.appleLogin || + (logInDefinition.oidcLogin && logInDefinition.oidcLogin.length > 0) || + logInDefinition.samlLogin + ) { + assignments.push( + factory.createPropertyAssignment( + factory.createIdentifier('externalProviders'), + createExternalProvidersPropertyAssignment(logInDefinition, logInDefinition.callbackURLs, logInDefinition.logoutURLs, secretErrors), + ), + ); + } + return factory.createPropertyAssignment(logInWith, factory.createObjectLiteralExpression(assignments, true)); +} + +/** + * Creates TypeScript AST for user attribute definition + * + * Converts attribute configuration objects into TypeScript property + * assignments, handling boolean, string, and number values. + * + * @param attribute - Standard or custom attribute configuration + * @returns TypeScript object literal expression for the attribute + */ +const createStandardAttributeDefinition = (attribute: StandardAttribute | CustomAttribute) => { + const properties: ts.PropertyAssignment[] = []; + + for (const key of Object.keys(attribute)) { + const value = attribute[key as keyof (StandardAttribute | CustomAttribute)]; + + if (typeof value === 'boolean') { + properties.push( + factory.createPropertyAssignment(factory.createIdentifier(key), value ? factory.createTrue() : factory.createFalse()), + ); + } else if (typeof value === 'string') { + properties.push(factory.createPropertyAssignment(factory.createIdentifier(key), factory.createStringLiteral(value))); + } else if (typeof value === 'number') { + properties.push(factory.createPropertyAssignment(factory.createIdentifier(key), factory.createNumericLiteral(value))); + } + } + + return factory.createObjectLiteralExpression(properties, true); +}; + +/** + * Creates the userAttributes property assignment + * + * Combines standard and custom user attributes into a single + * userAttributes configuration object for the auth definition. + * + * @param standardAttributes - Standard Cognito attributes configuration + * @param customAttributes - Custom attributes configuration + * @returns TypeScript property assignment for userAttributes + */ +const createUserAttributeAssignments = ( + standardAttributes: StandardAttributes | undefined, + customAttributes: CustomAttributes | undefined, +) => { + const userAttributeIdentifier = factory.createIdentifier('userAttributes'); + const userAttributeProperties = []; + if (standardAttributes !== undefined) { + const standardAttributeProperties = Object.entries(standardAttributes).map(([key, value]) => { + return factory.createPropertyAssignment(factory.createIdentifier(key), createStandardAttributeDefinition(value)); + }); + userAttributeProperties.push(...standardAttributeProperties); + } + if (customAttributes !== undefined) { + const customAttributeProperties = Object.entries(customAttributes) + .map(([key, value]) => { + if (value !== undefined) { + return factory.createPropertyAssignment(factory.createStringLiteral(key), createStandardAttributeDefinition(value)); + } + return undefined; + }) + .filter((property): property is ts.PropertyAssignment => property !== undefined); + userAttributeProperties.push(...customAttributeProperties); + } + return factory.createPropertyAssignment(userAttributeIdentifier, factory.createObjectLiteralExpression(userAttributeProperties, true)); +}; + +/** + * Main function that converts AuthDefinition to TypeScript AST nodes + * + * This is the primary entry point for auth code generation. It orchestrates + * the entire process of converting a Gen 1 auth configuration into Gen 2 + * TypeScript code by: + * + * 1. Handling reference auth (existing resources) + * 2. Processing login options (email, phone, social providers) + * 3. Setting up user attributes (standard and custom) + * 4. Configuring user groups + * 5. Integrating Lambda triggers + * 6. Setting up MFA configuration + * 7. Managing imports and secret dependencies + * 8. Generating the final TypeScript node array list + * + * @param definition - Complete auth configuration to transform + * @returns TypeScript AST nodes representing the auth resource file + * + * @example + * ```typescript + * const authDef: AuthDefinition = { + * loginOptions: { email: true, googleLogin: true }, + * mfa: { mode: 'OPTIONAL', totp: true } + * }; + * const nodes = renderAuthNode(authDef); + * // Generates: export const auth = defineAuth({ ... }); + * ``` + */ +export function renderAuthNode(definition: AuthDefinition): ts.NodeArray { + // Track required imports from various packages + const namedImports: { [importedPackageName: string]: Set } = { '@aws-amplify/backend': new Set() }; + const refAuth = definition.referenceAuth; + + // Handle reference auth (importing existing auth resources) + if (refAuth) { + const referenceAuthProperties: Array = []; + namedImports['@aws-amplify/backend'].add('referenceAuth'); + for (const [key, value] of Object.entries(refAuth)) { + if (value) { + referenceAuthProperties.push( + factory.createPropertyAssignment( + factory.createIdentifier(key), + typeof value === 'object' + ? factory.createObjectLiteralExpression( + Object.entries(value).map(([_key, _value]) => + factory.createPropertyAssignment(factory.createStringLiteral(_key), factory.createStringLiteral(_value)), + ), + true, + ) + : factory.createStringLiteral(value), + ), + ); + } + } + // Generates ts file + return renderResourceTsFile({ + exportedVariableName: factory.createIdentifier('auth'), + functionCallParameter: factory.createObjectLiteralExpression(referenceAuthProperties, true), + additionalImportedBackendIdentifiers: namedImports, + backendFunctionConstruct: 'referenceAuth', + }); + } + + // Setup phase for new auth resource creation + // Initialize defineAuth configuration + namedImports['@aws-amplify/backend'].add('defineAuth'); + const defineAuthProperties: Array = []; + const secretErrors: ts.Node[] = []; // Collect secret-related error statements + + // Process login configuration (email, phone, social providers) + const logInWithPropertyAssignment = createLogInWithPropertyAssignment(definition.loginOptions, secretErrors); + defineAuthProperties.push(logInWithPropertyAssignment); + + // Add user attributes configuration if present + if (definition.customUserAttributes || definition.standardUserAttributes) { + defineAuthProperties.push(createUserAttributeAssignments(definition.standardUserAttributes, definition.customUserAttributes)); + } + + // Add user groups configuration + if (definition.groups?.length) { + defineAuthProperties.push( + factory.createPropertyAssignment( + factory.createIdentifier('groups'), + factory.createArrayLiteralExpression(definition.groups.map((g) => factory.createStringLiteral(g))), + ), + ); + } + // Check for Lambda triggers and external providers + const hasFunctions = definition.lambdaTriggers && Object.keys(definition.lambdaTriggers).length > 0; + const { loginOptions } = definition; + + // Add secret import if external providers are configured + if ( + loginOptions?.appleLogin || + loginOptions?.amazonLogin || + loginOptions?.googleLogin || + loginOptions?.facebookLogin || + (loginOptions?.oidcLogin && loginOptions.oidcLogin.length > 0) || + loginOptions?.samlLogin + ) { + namedImports['@aws-amplify/backend'].add('secret'); + } + // Process Lambda triggers if present + if (hasFunctions) { + assert(definition.lambdaTriggers); + defineAuthProperties.push(createTriggersProperty(definition.lambdaTriggers)); + + // Add imports for each Lambda function + for (const value of Object.values(definition.lambdaTriggers)) { + const functionName = value.source.split('/')[3]; + if (!namedImports[`./${functionName}/resource`]) { + namedImports[`./${functionName}/resource`] = new Set(); + } + namedImports[`./${functionName}/resource`].add(functionName); + } + } + // Add MFA configuration if present + if (definition.mfa) { + const multifactorProperties = [ + factory.createPropertyAssignment(factory.createIdentifier('mode'), factory.createStringLiteral(definition.mfa.mode)), + ]; + + // Add TOTP configuration + if (definition.mfa.totp !== undefined) { + multifactorProperties.push( + factory.createPropertyAssignment( + factory.createIdentifier('totp'), + definition.mfa.totp ? factory.createTrue() : factory.createFalse(), + ), + ); + } + + // Add SMS configuration + if (definition.mfa.sms !== undefined) { + multifactorProperties.push( + factory.createPropertyAssignment( + factory.createIdentifier('sms'), + definition.mfa.sms ? factory.createTrue() : factory.createFalse(), + ), + ); + } + + defineAuthProperties.push( + factory.createPropertyAssignment( + factory.createIdentifier('multifactor'), + factory.createObjectLiteralExpression(multifactorProperties, true), + ), + ); + } + + // Generate the final TypeScript file with all configurations + return renderResourceTsFile({ + exportedVariableName: factory.createIdentifier('auth'), + functionCallParameter: factory.createObjectLiteralExpression(defineAuthProperties, true), + additionalImportedBackendIdentifiers: namedImports, + backendFunctionConstruct: 'defineAuth', + postImportStatements: secretErrors, // Include secret error handling + }); +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/data/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/data/index.ts new file mode 100644 index 00000000000..619080e8888 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/data/index.ts @@ -0,0 +1,86 @@ +import ts, { ObjectLiteralElementLike, ObjectLiteralExpression } from 'typescript'; +import { renderResourceTsFile } from '../../resource/resource'; +const factory = ts.factory; + +export type DataTableMapping = Record; +export type DataDefinition = { + tableMappings: Record; + schema: string; +}; + +const migratedAmplifyGen1DynamoDbTableMappingsKeyName = 'migratedAmplifyGen1DynamoDbTableMappings'; + +export const generateDataSource = (dataDefinition?: DataDefinition): ts.NodeArray => { + const dataRenderProperties: ObjectLiteralElementLike[] = []; + const namedImports: Record> = { '@aws-amplify/backend': new Set() }; + namedImports['@aws-amplify/backend'].add('defineData'); + + const schemaStatements: ts.Node[] = []; + + if (dataDefinition && dataDefinition.schema) { + const schemaVariableDeclaration = factory.createVariableDeclaration( + 'schema', + undefined, + undefined, + factory.createNoSubstitutionTemplateLiteral(dataDefinition.schema), + ); + const schemaStatementAssignment = factory.createVariableStatement( + [], + factory.createVariableDeclarationList([schemaVariableDeclaration], ts.NodeFlags.Const), + ); + schemaStatements.push(schemaStatementAssignment); + } + + if (dataDefinition?.tableMappings) { + const tableMappingEnvironments: ObjectLiteralExpression[] = []; + for (const [environmentName, tableMapping] of Object.entries(dataDefinition.tableMappings)) { + const tableMappingProperties: ObjectLiteralElementLike[] = []; + if (tableMapping) { + for (const [tableName, tableId] of Object.entries(tableMapping)) { + tableMappingProperties.push( + factory.createPropertyAssignment(factory.createIdentifier(tableName), factory.createStringLiteral(tableId)), + ); + } + } + + const branchNameExpression = ts.addSyntheticLeadingComment( + factory.createPropertyAssignment('branchName', factory.createStringLiteral(environmentName)), + ts.SyntaxKind.SingleLineCommentTrivia, + ` Replace the environment name (${environmentName}) with the corresponding branch name. Use "sandbox" for your sandbox environment.`, + true, + ); + let tableMappingExpression = factory.createPropertyAssignment( + 'modelNameToTableNameMapping', + factory.createObjectLiteralExpression(tableMappingProperties), + ); + if (tableMappingProperties.length === 0) { + tableMappingExpression = ts.addSyntheticLeadingComment( + tableMappingExpression, + ts.SyntaxKind.MultiLineCommentTrivia, + '*\n' + + '* Unable to find the table mapping for this environment.\n' + + '* This could be due the enableGen2Migration feature flag not being set to true for this environment.\n' + + '* Please enable the feature flag and push the backend resources.\n' + + '* If you are not planning to migrate this environment, you can remove this key.\n', + true, + ); + } + const tableMappingForEnvironment = factory.createObjectLiteralExpression([branchNameExpression, tableMappingExpression], true); + tableMappingEnvironments.push(tableMappingForEnvironment); + } + dataRenderProperties.push( + factory.createPropertyAssignment( + migratedAmplifyGen1DynamoDbTableMappingsKeyName, + factory.createArrayLiteralExpression(tableMappingEnvironments), + ), + ); + } + dataRenderProperties.push(factory.createShorthandPropertyAssignment(factory.createIdentifier('schema'))); + return renderResourceTsFile({ + exportedVariableName: factory.createIdentifier('data'), + functionCallParameter: factory.createObjectLiteralExpression(dataRenderProperties, true), + backendFunctionConstruct: 'defineData', + postImportStatements: schemaStatements, + additionalImportedBackendIdentifiers: namedImports, + }); +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/functions/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/functions/index.ts new file mode 100644 index 00000000000..3fc2127fd9f --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/functions/index.ts @@ -0,0 +1,193 @@ +import ts from 'typescript'; +import { ObjectLiteralElementLike, VariableDeclaration, VariableStatement } from 'typescript'; +import type { EnvironmentResponse } from '@aws-sdk/client-lambda'; +import { Runtime } from '@aws-sdk/client-lambda'; +import { renderResourceTsFile } from '../../resource/resource'; +import assert from 'node:assert'; + +export interface FunctionDefinition { + category?: string; + entry?: string; + name?: string; + timeoutSeconds?: number; + memoryMB?: number; + environment?: EnvironmentResponse; + runtime?: Runtime | string; + resourceName?: string; + schedule?: string; +} + +const factory = ts.factory; + +const amplifyGen1EnvName = 'AMPLIFY_GEN_1_ENV_NAME'; + +const createParameter = ( + name: string, + value: ts.LiteralExpression | ts.ObjectLiteralExpression | ts.TemplateExpression, +): ts.PropertyAssignment => factory.createPropertyAssignment(factory.createIdentifier(name), value); + +const createVariableStatement = (variableDeclaration: VariableDeclaration): VariableStatement => { + return factory.createVariableStatement([], factory.createVariableDeclarationList([variableDeclaration], ts.NodeFlags.Const)); +}; + +const createTemplateLiteral = (templateHead: string, templateSpan: string, templateTail: string) => { + return factory.createTemplateExpression(factory.createTemplateHead(templateHead), [ + factory.createTemplateSpan(factory.createIdentifier(templateSpan), factory.createTemplateTail(templateTail)), + ]); +}; + +export function renderFunctions(definition: FunctionDefinition, appId?: string, backendEnvironmentName?: string | undefined) { + const postImportStatements = []; + const namedImports: Record> = { '@aws-amplify/backend': new Set() }; + namedImports['@aws-amplify/backend'].add('defineFunction'); + + postImportStatements.push( + factory.createExpressionStatement( + factory.createCallExpression(factory.createIdentifier('throw new Error'), undefined, [ + factory.createStringLiteral( + `Source code for this function can be found in your Amplify Gen 1 Directory. See .amplify/migration/amplify/backend/function/${definition.resourceName}/src`, + ), + ]), + ), + ); + + const defineFunctionProperty = createFunctionDefinition(definition, postImportStatements, namedImports, appId, backendEnvironmentName); + + const amplifyGen1EnvStatement = createVariableStatement( + factory.createVariableDeclaration( + amplifyGen1EnvName, + undefined, + undefined, + factory.createIdentifier('process.env.AMPLIFY_GEN_1_ENV_NAME ?? "sandbox"'), + ), + ); + postImportStatements.push(amplifyGen1EnvStatement); + + return renderResourceTsFile({ + exportedVariableName: factory.createIdentifier(definition?.resourceName || 'sayHello'), + functionCallParameter: factory.createObjectLiteralExpression(defineFunctionProperty, true), + backendFunctionConstruct: 'defineFunction', + additionalImportedBackendIdentifiers: namedImports, + postImportStatements, + }); +} + +export function createFunctionDefinition( + definition?: FunctionDefinition, + postImportStatements?: (ts.CallExpression | ts.JSDoc | ts.ExpressionStatement)[], + namedImports?: Record>, + appId?: string, + backendEnvironmentName?: string, +) { + const defineFunctionProperties: ObjectLiteralElementLike[] = []; + + if (definition?.entry) { + defineFunctionProperties.push(createParameter('entry', factory.createStringLiteral('./handler.ts'))); + } + if (definition?.name) { + const splitFuncName = definition.name.split('-'); + const funcNameWithoutBackendEnvName = splitFuncName.slice(0, -1).join('-'); + + const funcNameAssignment = createTemplateLiteral(`${funcNameWithoutBackendEnvName}-`, amplifyGen1EnvName, ''); + + defineFunctionProperties.push(createParameter('name', funcNameAssignment)); + } + if (definition?.timeoutSeconds) { + defineFunctionProperties.push(createParameter('timeoutSeconds', factory.createNumericLiteral(definition.timeoutSeconds))); + } + if (definition?.memoryMB) { + defineFunctionProperties.push(createParameter('memoryMB', factory.createNumericLiteral(definition.memoryMB))); + } + + if (definition?.environment?.Variables) { + defineFunctionProperties.push( + createParameter( + 'environment', + factory.createObjectLiteralExpression( + Object.entries(definition.environment.Variables).map(([key, value]) => { + if (key == 'API_KEY' && value.startsWith(`/amplify/${appId}/${backendEnvironmentName}`)) { + postImportStatements?.push( + factory.createCallExpression(factory.createIdentifier('throw new Error'), undefined, [ + // eslint-disable-next-line spellcheck/spell-checker + factory.createStringLiteral('Secrets need to be reset, use `npx ampx sandbox secret set API_KEY` to set the value'), + ]), + ); + if (namedImports && namedImports['@aws-amplify/backend']) { + namedImports['@aws-amplify/backend'].add('secret'); + } else { + const namedImports: Record> = { '@aws-amplify/backend': new Set() }; + namedImports['@aws-amplify/backend'].add('secret'); + } + return factory.createPropertyAssignment( + key, + factory.createCallExpression(factory.createIdentifier('secret'), undefined, [factory.createStringLiteral('API_KEY')]), + ); + } else if (key == 'ENV') { + const envNameAssignment = createTemplateLiteral('', amplifyGen1EnvName, ''); + return createParameter(key, envNameAssignment); + } + + return createParameter(key, factory.createStringLiteral(value)); + }), + ), + ), + ); + } + + const runtime = definition?.runtime; + if (runtime && runtime.includes('nodejs')) { + let nodeRuntime: number | undefined; + switch (runtime) { + case Runtime.nodejs16x: + nodeRuntime = 16; + break; + case Runtime.nodejs18x: + nodeRuntime = 18; + break; + case Runtime.nodejs20x: + nodeRuntime = 20; + break; + case 'nodejs22x': + nodeRuntime = 22; + break; + default: + throw new Error(`Unsupported nodejs runtime for function: ${runtime}`); + } + assert(nodeRuntime, 'Expected nodejs version to be set'); + + defineFunctionProperties.push(createParameter('runtime', factory.createNumericLiteral(nodeRuntime))); + } + + if (definition?.schedule) { + const rawScheduleExpression = definition.schedule; + let scheduleExpression: string | undefined; + const startIndex = rawScheduleExpression.indexOf('(') + 1; + const endIndex = rawScheduleExpression.lastIndexOf(')'); + const scheduleValue = startIndex > 0 && endIndex > startIndex ? rawScheduleExpression.slice(startIndex, endIndex) : undefined; + if (rawScheduleExpression?.startsWith('rate(')) { + // Convert rate expression to a more readable format + const rateValue = scheduleValue; + if (rateValue) { + const [value, unit] = rateValue.split(' '); + const unitMap: Record = { + minute: 'm', + minutes: 'm', + hour: 'h', + hours: 'h', + day: 'd', + days: 'd', + }; + scheduleExpression = `every ${value}${unitMap[unit]}`; + } + } else if (rawScheduleExpression?.startsWith('cron(')) { + // Extract the cron expression as-is + scheduleExpression = scheduleValue; + } + + if (scheduleExpression) { + defineFunctionProperties.push(createParameter('schedule', factory.createStringLiteral(scheduleExpression))); + } + } + + return defineFunctionProperties; +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/functions/lambda.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/functions/lambda.ts new file mode 100644 index 00000000000..4b29418a951 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/functions/lambda.ts @@ -0,0 +1,19 @@ +import ts from 'typescript'; +export type Lambda = { + source: string; +}; + +const factory = ts.factory; + +export const createTriggersProperty = (triggers: Record) => { + return factory.createPropertyAssignment( + factory.createIdentifier('triggers'), + factory.createObjectLiteralExpression( + Object.entries(triggers).map(([key, value]) => { + const functionName = value.source.split('/')[3]; + return factory.createPropertyAssignment(factory.createIdentifier(key), factory.createIdentifier(functionName)); + }), + true, + ), + ); +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/storage/access.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/storage/access.ts new file mode 100644 index 00000000000..de9f4de5698 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/storage/access.ts @@ -0,0 +1,75 @@ +import ts, { CallExpression, Identifier } from 'typescript'; +import { AccessPatterns, Permission } from './index.js'; +const factory = ts.factory; + +/** + * /public/, /protected/{cognito:sub}/, and /private/{cognito:sub}/ + * @see https://docs.amplify.aws/gen1/react/build-a-backend/storage/configure-storage/#s3-access-permissions + */ + +type AccessPath = 'public/*' | 'private/{entity_id}/*' | 'protected/{entity_id}/*'; + +type UserLevel = 'guest' | 'authenticated' | `entity('identity')` | `groups(['${string}'])`; + +const createAllowPattern = (allowIdentifier: Identifier, userLevel: UserLevel, permissions: Permission[]) => { + return factory.createCallExpression( + factory.createPropertyAccessExpression(allowIdentifier, factory.createIdentifier(`${userLevel}.to`)), + undefined, + [factory.createArrayLiteralExpression(permissions.map((p) => factory.createStringLiteral(p)))], + ); +}; + +export const getAccessPatterns = (accessPatterns: AccessPatterns): ts.PropertyAssignment => { + const accessIdentifier = factory.createIdentifier('access'); + const allowIdentifier = factory.createIdentifier('allow'); + + const publicPathAccess = []; + const privatePathAccess = []; + const protectedPathAccess = []; + + if (accessPatterns.guest && accessPatterns.guest.length) { + publicPathAccess.push(createAllowPattern(allowIdentifier, 'guest', accessPatterns.guest ?? [])); + } + if (accessPatterns.auth && accessPatterns.auth.length) { + const accessPattern = createAllowPattern(allowIdentifier, 'authenticated', accessPatterns.auth ?? []); + publicPathAccess.push(accessPattern); + protectedPathAccess.push(accessPattern); + privatePathAccess.push(accessPattern); + } + if (accessPatterns.groups && Object.keys(accessPatterns.groups).length) { + Object.entries(accessPatterns.groups).forEach(([key, value]) => { + publicPathAccess.push(createAllowPattern(allowIdentifier, `groups(['${key}'])`, value)); + privatePathAccess.push(createAllowPattern(allowIdentifier, `groups(['${key}'])`, value)); + protectedPathAccess.push(createAllowPattern(allowIdentifier, `groups(['${key}'])`, value)); + }); + } + + const publicPath: AccessPath = 'public/*'; + const privatePath: AccessPath = 'private/{entity_id}/*'; + const protectedPath: AccessPath = 'protected/{entity_id}/*'; + + const allowAssignments: ts.PropertyAssignment[] = []; + + const createAccessPropertyAssignment = (bucketPath: string, accessArray: CallExpression[]) => + factory.createPropertyAssignment(factory.createStringLiteral(bucketPath), factory.createArrayLiteralExpression(accessArray)); + + if (publicPathAccess.length) { + allowAssignments.push(createAccessPropertyAssignment(publicPath, publicPathAccess)); + } + if (protectedPathAccess.length) { + allowAssignments.push(createAccessPropertyAssignment(protectedPath, protectedPathAccess)); + } + if (privatePathAccess.length) { + allowAssignments.push(createAccessPropertyAssignment(privatePath, privatePathAccess)); + } + + const accessFunction = factory.createArrowFunction( + undefined, + undefined, + [factory.createParameterDeclaration(undefined, undefined, allowIdentifier)], + undefined, + undefined, + factory.createParenthesizedExpression(factory.createObjectLiteralExpression(allowAssignments, true)), + ); + return factory.createPropertyAssignment(accessIdentifier, accessFunction); +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/storage/index.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/storage/index.ts new file mode 100644 index 00000000000..58ddf6f09ed --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/generators/storage/index.ts @@ -0,0 +1,108 @@ +import ts, { VariableDeclaration, VariableStatement } from 'typescript'; +import { getAccessPatterns } from './access'; +import { renderResourceTsFile } from '../../resource/resource'; +import { createTriggersProperty, Lambda } from '../functions/lambda'; +import type { BucketAccelerateStatus, BucketVersioningStatus, ServerSideEncryptionByDefault } from '@aws-sdk/client-s3'; +const factory = ts.factory; + +const amplifyGen1EnvName = 'AMPLIFY_GEN_1_ENV_NAME'; + +export type S3TriggerDefinition = Record; +export type Permission = 'read' | 'write' | 'create' | 'delete'; +export type GroupPermissions = { + [Key in G[number]]: Permission[]; +}; + +export type StorageTriggerEvent = 'onDelete' | 'onUpload'; +export type AccessPatterns = { + auth?: Permission[]; + guest?: Permission[]; + groups?: Record; +}; + +export type ServerSideEncryptionConfiguration = { + serverSideEncryptionByDefault: ServerSideEncryptionByDefault; + bucketKeyEnabled: boolean; +}; + +export interface StorageRenderParameters { + bucketName?: string; + triggers?: Partial>; + accessPatterns?: AccessPatterns; + storageIdentifier?: string; + lambdas?: S3TriggerDefinition[]; + bucketEncryptionAlgorithm?: ServerSideEncryptionConfiguration; + dynamoDB?: string; + accelerateConfiguration?: BucketAccelerateStatus; + versioningConfiguration?: BucketVersioningStatus; +} + +const createVariableStatement = (variableDeclaration: VariableDeclaration): VariableStatement => { + return factory.createVariableStatement([], factory.createVariableDeclarationList([variableDeclaration], ts.NodeFlags.Const)); +}; + +const createTemplateLiteral = (templateHead: string, templateSpan: string, templateTail: string) => { + return factory.createTemplateExpression(factory.createTemplateHead(templateHead), [ + factory.createTemplateSpan(factory.createIdentifier(templateSpan), factory.createTemplateTail(templateTail)), + ]); +}; + +export const renderStorage = (storageParams: StorageRenderParameters = {}) => { + const propertyAssignments: ts.PropertyAssignment[] = []; + const namedImports: Record> = { '@aws-amplify/backend': new Set() }; + namedImports['@aws-amplify/backend'].add('defineStorage'); + const triggers = storageParams.triggers || {}; + + const postImportStatements = []; + const amplifyGen1EnvStatement = createVariableStatement( + factory.createVariableDeclaration( + amplifyGen1EnvName, + undefined, + undefined, + factory.createIdentifier('process.env.AMPLIFY_GEN_1_ENV_NAME ?? "sandbox"'), + ), + ); + postImportStatements.push(amplifyGen1EnvStatement); + + if (storageParams.storageIdentifier) { + const splitStorageIdentifier = storageParams.storageIdentifier.split('-'); + const storageNameWithoutBackendEnvName = splitStorageIdentifier.slice(0, -1).join('-'); + + const storageNameAssignment = createTemplateLiteral(`${storageNameWithoutBackendEnvName}-`, amplifyGen1EnvName, ''); + propertyAssignments.push(factory.createPropertyAssignment(factory.createIdentifier('name'), storageNameAssignment)); + } + if (storageParams.accessPatterns) { + propertyAssignments.push(getAccessPatterns(storageParams.accessPatterns)); + } + if (storageParams.accessPatterns?.groups) { + postImportStatements.push( + factory.createJSDocComment( + factory.createNodeArray([ + factory.createJSDocText('TODO: Your project uses group permissions. Group permissions have changed in Gen 2. '), + factory.createJSDocText( + 'In order to grant permissions to groups in Gen 2, please refer to https://docs.amplify.aws/react/build-a-backend/storage/authorization/#for-gen-1-public-protected-and-private-access-pattern.', + ), + ]), + ), + ); + } + + if (Object.keys(triggers).length) { + propertyAssignments.push(createTriggersProperty(triggers)); + for (const value of Object.values(triggers)) { + const functionName = value.source.split('/')[3]; + if (!namedImports[`./${functionName}/resource`]) { + namedImports[`./${functionName}/resource`] = new Set(); + } + namedImports[`./${functionName}/resource`].add(functionName); + } + } + const storageArgs = factory.createObjectLiteralExpression(propertyAssignments); + return renderResourceTsFile({ + backendFunctionConstruct: 'defineStorage', + exportedVariableName: factory.createIdentifier('storage'), + functionCallParameter: storageArgs, + postImportStatements, + additionalImportedBackendIdentifiers: namedImports, + }); +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/npm_package/renderer.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/npm_package/renderer.ts new file mode 100644 index 00000000000..b59b780df3a --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/npm_package/renderer.ts @@ -0,0 +1,53 @@ +export type AmplifyDevDependencies = { + '@aws-amplify/backend': string; + '@aws-amplify/backend-cli': string; + '@aws-amplify/backend-data': string; + 'aws-cdk': string; + 'aws-cdk-lib': string; + 'ci-info': string; + constructs: string; + esbuild: string; + tsx: string; + typescript: string; + '@types/node': string; +}; +export type AmplifyDependencies = { + 'aws-amplify': string; +}; +export type AmplifyPackageVersions = AmplifyDevDependencies & AmplifyDependencies; + +export type PackageJsonDependencies = { + devDependencies?: Record; + dependencies?: Record; +}; + +export type PackageJson = { + name: string; + scripts?: Record; +} & PackageJsonDependencies; + +const withDefault = (version?: string) => version ?? '*'; + +export const patchNpmPackageJson = (packageJson: PackageJson, packageVersions: Partial = {}): PackageJson => { + return { + ...packageJson, + devDependencies: { + ...(packageJson.devDependencies ?? {}), + '@aws-amplify/backend': withDefault(packageVersions['@aws-amplify/backend']), + '@aws-amplify/backend-cli': withDefault(packageVersions['@aws-amplify/backend-cli']), + '@aws-amplify/backend-data': withDefault(packageVersions['@aws-amplify/backend-data']), + 'aws-cdk': withDefault(packageVersions['aws-cdk']), + 'aws-cdk-lib': withDefault(packageVersions['aws-cdk-lib']), + 'ci-info': withDefault(packageVersions['ci-info']), + constructs: withDefault(packageVersions.constructs), + esbuild: withDefault(packageVersions.esbuild), + tsx: withDefault(packageVersions.tsx), + typescript: withDefault(packageVersions.typescript), + '@types/node': withDefault(packageVersions['@types/node']), + }, + dependencies: { + ...(packageJson.dependencies ?? {}), + 'aws-amplify': withDefault(packageVersions['aws-amplify']), + }, + }; +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/render_pipeline.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/render_pipeline.ts new file mode 100644 index 00000000000..7a33f0fc688 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/render_pipeline.ts @@ -0,0 +1,12 @@ +export interface Renderer { + render(): Promise; +} +export class RenderPipeline implements Renderer { + constructor(private renderers: Renderer[]) {} + + render = async (): Promise => { + for (const renderer of this.renderers) { + await renderer.render(); + } + }; +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/ensure_directory.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/ensure_directory.ts new file mode 100644 index 00000000000..c3fb802a076 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/ensure_directory.ts @@ -0,0 +1,9 @@ +import fs from 'node:fs/promises'; +import { Renderer } from '../render_pipeline'; + +export class EnsureDirectory implements Renderer { + constructor(private directory: string) {} + render = async (): Promise => { + await fs.mkdir(this.directory, { recursive: true }); + }; +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/package_json.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/package_json.ts new file mode 100644 index 00000000000..1f8f4424ae0 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/package_json.ts @@ -0,0 +1,10 @@ +import { Renderer } from '../render_pipeline'; + +export class JsonRenderer implements Renderer { + constructor(private createJson: () => Promise>, private writeFile: (content: string) => Promise) {} + + render = async (): Promise => { + const packageJson = await this.createJson(); + await this.writeFile(JSON.stringify(packageJson, null, 2)); + }; +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/typescript_block_node.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/typescript_block_node.ts new file mode 100644 index 00000000000..77c0f2bf404 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/renderers/typescript_block_node.ts @@ -0,0 +1,15 @@ +import ts from 'typescript'; +import { Renderer } from '../render_pipeline.js'; +export class TypescriptNodeArrayRenderer implements Renderer { + private printer: ts.Printer; + private sourceFile: ts.SourceFile; + constructor(private blockCreator: () => Promise>, private writer: (content: string) => Promise) { + this.printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + this.sourceFile = ts.createSourceFile('output.ts', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS); + } + render = async (): Promise => { + const block = await this.blockCreator(); + const source = this.printer.printList(ts.ListFormat.MultiLine, block, this.sourceFile); + await this.writer(source); + }; +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/resource/resource.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/resource/resource.ts new file mode 100644 index 00000000000..6d16de7932a --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/resource/resource.ts @@ -0,0 +1,115 @@ +import ts from 'typescript'; +import { newLineIdentifier } from '../ts_factory_utils'; +const factory = ts.factory; +export type ResourceTsParameters = { + additionalImportedBackendIdentifiers?: Record>; + backendFunctionConstruct: string; + functionCallParameter: ts.ObjectLiteralExpression; + exportedVariableName: ts.Identifier; + postImportStatements?: ts.Node[]; + postExportStatements?: ts.Node[]; +}; +// Creates ts file with imports / exports +export function renderResourceTsFile({ + additionalImportedBackendIdentifiers = {}, + backendFunctionConstruct, + functionCallParameter, + exportedVariableName, + postImportStatements, + postExportStatements, +}: ResourceTsParameters): ts.NodeArray { + const backendFunctionIdentifier = factory.createIdentifier(backendFunctionConstruct); + const importStatements = renderImportStatements(additionalImportedBackendIdentifiers); + const functionCall = factory.createCallExpression(backendFunctionIdentifier, undefined, [functionCallParameter]); + const exportedVariable = factory.createVariableDeclaration(exportedVariableName, undefined, undefined, functionCall); + const exportStatement = factory.createVariableStatement( + [factory.createModifier(ts.SyntaxKind.ExportKeyword)], + factory.createVariableDeclarationList([exportedVariable], ts.NodeFlags.Const), + ); + + return factory.createNodeArray([ + ...importStatements, + ...(postImportStatements !== undefined && postImportStatements.length > 0 ? [newLineIdentifier, ...postImportStatements] : []), + newLineIdentifier, + exportStatement, + ...(postExportStatements !== undefined && postExportStatements.length > 0 ? [newLineIdentifier, ...postExportStatements] : []), + ]); +} + +export type ResourceTsParametersList = { + additionalImportedBackendIdentifiers?: Record>; + backendFunctionConstruct: string; + functionCallParameter: ts.ObjectLiteralExpression[]; + exportedVariableName: ts.Identifier[]; + postImportStatements?: ts.Node[]; + postExportStatements?: ts.Node[]; +}; + +export function renderResourceTsFilesForFunction({ + additionalImportedBackendIdentifiers = {}, + backendFunctionConstruct, + functionCallParameter, + exportedVariableName, + postImportStatements, + postExportStatements, +}: ResourceTsParametersList): ts.NodeArray { + const importStatements = renderImportStatements(additionalImportedBackendIdentifiers); + const exportStatements = renderExportStatementsForFunctions(backendFunctionConstruct, functionCallParameter, exportedVariableName); + + return factory.createNodeArray([ + ...importStatements, + ...(postImportStatements !== undefined && postImportStatements.length > 0 ? [newLineIdentifier, ...postImportStatements] : []), + ...(exportStatements ? [newLineIdentifier, ...exportStatements] : []), + ...(postExportStatements !== undefined && postExportStatements.length > 0 ? [newLineIdentifier, ...postExportStatements] : []), + ]); +} + +function renderImportStatements(additionalImportedBackendIdentifiers: Record>) { + const importStatements: ts.ImportDeclaration[] = []; + for (const [packageName, identifiers] of Object.entries(additionalImportedBackendIdentifiers)) { + const importSpecifiers: ts.ImportSpecifier[] = []; + + identifiers.forEach((identifier) => { + importSpecifiers.push(factory.createImportSpecifier(false, undefined, factory.createIdentifier(identifier))); + }); + + const importStatement = factory.createImportDeclaration( + undefined, + factory.createImportClause(false, undefined, factory.createNamedImports(importSpecifiers)), + factory.createStringLiteral(packageName), + ); + + importStatements.push(importStatement); + } + + return importStatements; +} + +function renderExportStatementsForFunctions( + backendFunctionConstruct: string, + functionCallParameter: ts.ObjectLiteralExpression[], + exportedVariableName: ts.Identifier[], +) { + const exportStatementList: ts.VariableStatement[] = []; + let i = 0; + for (const functionCallParam of functionCallParameter) { + const backendFunctionIdentifier = factory.createIdentifier(backendFunctionConstruct); + const functionCall = factory.createCallExpression(backendFunctionIdentifier, undefined, [functionCallParam]); + const exportedVariable = factory.createVariableDeclaration(exportedVariableName[i], undefined, undefined, functionCall); + const exportStatement = factory.createVariableStatement( + [factory.createModifier(ts.SyntaxKind.ExportKeyword)], + factory.createVariableDeclarationList([exportedVariable], ts.NodeFlags.Const), + ); + exportStatementList.push( + ts.addSyntheticLeadingComment( + exportStatement, + ts.SyntaxKind.MultiLineCommentTrivia, + `\nSource code for this function can be found in your Amplify Gen 1 Directory.\nSee amplify/backend/function/${exportedVariableName[i].escapedText}/src \n`, + true, + ), + ); + i++; + } + + return exportStatementList; +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/test_utils/import_regex.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/test_utils/import_regex.ts new file mode 100644 index 00000000000..2dbcae92550 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/test_utils/import_regex.ts @@ -0,0 +1,2 @@ +export const getImportRegex = (importIdentifier: string, importPackage: string) => + new RegExp(`import[\\s\\{a-zA-Z,]*${importIdentifier}[\\s,a-zA-Z]*\\} from "${importPackage}";`); diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/test_utils/ts_node_printer.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/test_utils/ts_node_printer.ts new file mode 100644 index 00000000000..30d588bb1d0 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/test_utils/ts_node_printer.ts @@ -0,0 +1,14 @@ +import ts from 'typescript'; + +export const printNode = (node: ts.Node) => { + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const sourceFile = ts.createSourceFile('output.ts', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS); + const source = printer.printNode(ts.EmitHint.Unspecified, node, sourceFile); + return source; +}; +export const printNodeArray = (nodeArray: ts.NodeArray) => { + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }); + const sourceFile = ts.createSourceFile('output.ts', '', ts.ScriptTarget.Latest, false, ts.ScriptKind.TS); + const source = printer.printList(ts.ListFormat.MultiLine, nodeArray, sourceFile); + return source; +}; diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/todo_error.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/todo_error.ts new file mode 100644 index 00000000000..07ea383bed2 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/todo_error.ts @@ -0,0 +1,7 @@ +import ts from 'typescript'; +const factory = ts.factory; + +export const createTodoError = (todoMessage: string) => + factory.createThrowStatement( + factory.createNewExpression(factory.createIdentifier('Error'), undefined, [factory.createStringLiteral(`TODO: ${todoMessage}`)]), + ); diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/ts_factory_utils.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/ts_factory_utils.ts new file mode 100644 index 00000000000..b394ea02ec6 --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/ts_factory_utils.ts @@ -0,0 +1,5 @@ +import ts from 'typescript'; + +const factory = ts.factory; + +export const newLineIdentifier = factory.createIdentifier('\n'); diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/types.ts b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/types.ts new file mode 100644 index 00000000000..74657e0d21a --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/src/types.ts @@ -0,0 +1,5 @@ +// Type definitions for Gen 1 project configuration +export interface Gen1ProjectConfig { + // Add project configuration types as needed + [key: string]: any; +} diff --git a/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/tsconfig.json b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/tsconfig.json new file mode 100644 index 00000000000..d19e5ef452a --- /dev/null +++ b/packages/amplify-cli/src/commands/gen2-migration/amplify-gen2-migration-codegen-dg/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../../../tsconfig.json", + "compilerOptions": { + "strict": false, + "skipLibCheck": true, + "moduleResolution": "node", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "rootDir": "src", + "outDir": "lib" + }, + "include": [ + "src/**/*" + ], + "exclude": [] +} diff --git a/packages/amplify-cli/tsconfig.json b/packages/amplify-cli/tsconfig.json index fbb60ae8c2c..9b9cfd02994 100644 --- a/packages/amplify-cli/tsconfig.json +++ b/packages/amplify-cli/tsconfig.json @@ -1,13 +1,15 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { - "strict": true, + "strict": false, "noImplicitAny": false, "rootDir": "src", "outDir": "lib", "forceConsistentCasingInFileNames": true }, - "include": ["src/**/*"], + "include": [ + "src/**/*" + ], "references": [ { "path": "../amplify-category-function" diff --git a/tsconfig.base.json b/tsconfig.base.json index 867b63270c6..53a6f7a716a 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -3,7 +3,10 @@ /* Basic Options */ "target": "ES2018" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, "module": "commonjs" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, - "lib": ["DOM", "ESnext"] /* Specify library files to be included in the compilation. */, + "lib": [ + "DOM", + "ESnext" + ] /* Specify library files to be included in the compilation. */, //"allowJs": true, /* Allow javascript files to be compiled. */ //"checkJs": true, /* Report errors in .js files. */ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ @@ -20,7 +23,6 @@ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ - /* Strict Type-Checking Options */ "strict": true /* Enable all strict type-checking options. */, "useUnknownInCatchVariables": false, @@ -30,13 +32,11 @@ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ - /* Additional Checks */ // "noUnusedLocals": true, /* Report errors on unused locals. */ // "noUnusedParameters": true, /* Report errors on unused parameters. */ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - /* Module Resolution Options */ "moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ @@ -47,13 +47,11 @@ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */, // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ - /* Source Map Options */ // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ - /* Experimental Options */ "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */, "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */, @@ -62,5 +60,9 @@ "pretty": true, "stripInternal": true }, - "exclude": ["**/__mocks__/**/*", "**/__tests__/**/*", "**/lib/**/*"] + "exclude": [ + "**/__mocks__/**/*", + "**/__tests__/**/*", + "**/lib/**/*" + ], } diff --git a/yarn.lock b/yarn.lock index aaf9601456c..012cfc3afdd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1153,6 +1153,8 @@ __metadata: "@aws-cdk/cloudformation-diff": ~2.68.0 "@aws-sdk/client-amplify": ^3.624.0 "@aws-sdk/client-cognito-identity-provider": ^3.624.0 + "@aws-sdk/client-lambda": ^3.624.0 + "@aws-sdk/client-s3": ^3.624.0 "@types/archiver": ^5.3.1 "@types/columnify": ^1.5.1 "@types/folder-hash": ^4.0.1 @@ -2406,52 +2408,52 @@ __metadata: linkType: hard "@aws-sdk/client-cloudformation@npm:^3.624.0": - version: 3.891.0 - resolution: "@aws-sdk/client-cloudformation@npm:3.891.0" + version: 3.844.0 + resolution: "@aws-sdk/client-cloudformation@npm:3.844.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.890.0 - "@aws-sdk/credential-provider-node": 3.891.0 - "@aws-sdk/middleware-host-header": 3.891.0 - "@aws-sdk/middleware-logger": 3.891.0 - "@aws-sdk/middleware-recursion-detection": 3.891.0 - "@aws-sdk/middleware-user-agent": 3.891.0 - "@aws-sdk/region-config-resolver": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@aws-sdk/util-endpoints": 3.891.0 - "@aws-sdk/util-user-agent-browser": 3.887.0 - "@aws-sdk/util-user-agent-node": 3.891.0 - "@smithy/config-resolver": ^4.2.2 - "@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.2 - "@smithy/middleware-retry": ^4.2.3 - "@smithy/middleware-serde": ^4.1.1 - "@smithy/middleware-stack": ^4.1.1 - "@smithy/node-config-provider": ^4.2.2 - "@smithy/node-http-handler": ^4.2.1 - "@smithy/protocol-http": ^5.2.1 - "@smithy/smithy-client": ^4.6.2 - "@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.2 - "@smithy/util-defaults-mode-node": ^4.1.2 - "@smithy/util-endpoints": ^3.1.2 - "@smithy/util-middleware": ^4.1.1 - "@smithy/util-retry": ^4.1.2 - "@smithy/util-utf8": ^4.1.0 - "@smithy/util-waiter": ^4.1.1 + "@aws-sdk/core": 3.844.0 + "@aws-sdk/credential-provider-node": 3.844.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.844.0 + "@aws-sdk/region-config-resolver": 3.840.0 + "@aws-sdk/types": 3.840.0 + "@aws-sdk/util-endpoints": 3.844.0 + "@aws-sdk/util-user-agent-browser": 3.840.0 + "@aws-sdk/util-user-agent-node": 3.844.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.14 + "@smithy/middleware-retry": ^4.1.15 + "@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.6 + "@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.22 + "@smithy/util-defaults-mode-node": ^4.0.22 + "@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-waiter": ^4.0.6 "@types/uuid": ^9.0.1 tslib: ^2.6.2 uuid: ^9.0.1 - checksum: eac848cb46a39a07529afe9b9c46e997495af8e16f34fd3b03c9ed5576676b4de2ff9a906c152b5f21937af85232dd15a3688bf77046a7167c4a03b429c298c6 + checksum: 872fe9c27a4dd519e4328ca45f82fc86f2802b196c7b78c9a73d7a4e0ac60b6be53246846865eaf67abf68ee4e4c3f080502ca375804cccbf21a0e9e59238baa languageName: node linkType: hard @@ -2678,49 +2680,49 @@ __metadata: linkType: hard "@aws-sdk/client-dynamodb-streams@npm:^3.624.0": - version: 3.891.0 - resolution: "@aws-sdk/client-dynamodb-streams@npm:3.891.0" + version: 3.916.0 + resolution: "@aws-sdk/client-dynamodb-streams@npm:3.916.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.890.0 - "@aws-sdk/credential-provider-node": 3.891.0 - "@aws-sdk/middleware-host-header": 3.891.0 - "@aws-sdk/middleware-logger": 3.891.0 - "@aws-sdk/middleware-recursion-detection": 3.891.0 - "@aws-sdk/middleware-user-agent": 3.891.0 - "@aws-sdk/region-config-resolver": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@aws-sdk/util-endpoints": 3.891.0 - "@aws-sdk/util-user-agent-browser": 3.887.0 - "@aws-sdk/util-user-agent-node": 3.891.0 - "@smithy/config-resolver": ^4.2.2 - "@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.2 - "@smithy/middleware-retry": ^4.2.3 - "@smithy/middleware-serde": ^4.1.1 - "@smithy/middleware-stack": ^4.1.1 - "@smithy/node-config-provider": ^4.2.2 - "@smithy/node-http-handler": ^4.2.1 - "@smithy/protocol-http": ^5.2.1 - "@smithy/smithy-client": ^4.6.2 - "@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.2 - "@smithy/util-defaults-mode-node": ^4.1.2 - "@smithy/util-endpoints": ^3.1.2 - "@smithy/util-middleware": ^4.1.1 - "@smithy/util-retry": ^4.1.2 - "@smithy/util-utf8": ^4.1.0 - tslib: ^2.6.2 - checksum: 0f3a2af784560e3fa0f4864635c984df22959c27de6af718ad2f2538970911ad0b0f713695c288d9412772da8009e4446cc2047084ad8f29c6c3ed64f17a73aa + "@aws-sdk/core": 3.916.0 + "@aws-sdk/credential-provider-node": 3.916.0 + "@aws-sdk/middleware-host-header": 3.914.0 + "@aws-sdk/middleware-logger": 3.914.0 + "@aws-sdk/middleware-recursion-detection": 3.914.0 + "@aws-sdk/middleware-user-agent": 3.916.0 + "@aws-sdk/region-config-resolver": 3.914.0 + "@aws-sdk/types": 3.914.0 + "@aws-sdk/util-endpoints": 3.916.0 + "@aws-sdk/util-user-agent-browser": 3.914.0 + "@aws-sdk/util-user-agent-node": 3.916.0 + "@smithy/config-resolver": ^4.4.0 + "@smithy/core": ^3.17.1 + "@smithy/fetch-http-handler": ^5.3.4 + "@smithy/hash-node": ^4.2.3 + "@smithy/invalid-dependency": ^4.2.3 + "@smithy/middleware-content-length": ^4.2.3 + "@smithy/middleware-endpoint": ^4.3.5 + "@smithy/middleware-retry": ^4.4.5 + "@smithy/middleware-serde": ^4.2.3 + "@smithy/middleware-stack": ^4.2.3 + "@smithy/node-config-provider": ^4.3.3 + "@smithy/node-http-handler": ^4.4.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + "@smithy/url-parser": ^4.2.3 + "@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.4 + "@smithy/util-defaults-mode-node": ^4.2.6 + "@smithy/util-endpoints": ^3.2.3 + "@smithy/util-middleware": ^4.2.3 + "@smithy/util-retry": ^4.2.3 + "@smithy/util-utf8": ^4.2.0 + tslib: ^2.6.2 + checksum: f7d7a9dd85827cc2033610f7c5d85079356cdf049633b19a92fc21c31503ea87ee08640e7410fda47d0c97f20d74bca67e58c5aef9583f7c72d4497f8a7cce3c languageName: node linkType: hard @@ -2777,52 +2779,53 @@ __metadata: linkType: hard "@aws-sdk/client-dynamodb@npm:^3.515.0, @aws-sdk/client-dynamodb@npm:^3.624.0": - version: 3.902.0 - resolution: "@aws-sdk/client-dynamodb@npm:3.902.0" + version: 3.844.0 + resolution: "@aws-sdk/client-dynamodb@npm:3.844.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.901.0 - "@aws-sdk/credential-provider-node": 3.901.0 - "@aws-sdk/middleware-endpoint-discovery": 3.901.0 - "@aws-sdk/middleware-host-header": 3.901.0 - "@aws-sdk/middleware-logger": 3.901.0 - "@aws-sdk/middleware-recursion-detection": 3.901.0 - "@aws-sdk/middleware-user-agent": 3.901.0 - "@aws-sdk/region-config-resolver": 3.901.0 - "@aws-sdk/types": 3.901.0 - "@aws-sdk/util-endpoints": 3.901.0 - "@aws-sdk/util-user-agent-browser": 3.901.0 - "@aws-sdk/util-user-agent-node": 3.901.0 - "@smithy/config-resolver": ^4.3.0 - "@smithy/core": ^3.14.0 - "@smithy/fetch-http-handler": ^5.3.0 - "@smithy/hash-node": ^4.2.0 - "@smithy/invalid-dependency": ^4.2.0 - "@smithy/middleware-content-length": ^4.2.0 - "@smithy/middleware-endpoint": ^4.3.0 - "@smithy/middleware-retry": ^4.4.0 - "@smithy/middleware-serde": ^4.2.0 - "@smithy/middleware-stack": ^4.2.0 - "@smithy/node-config-provider": ^4.3.0 - "@smithy/node-http-handler": ^4.3.0 - "@smithy/protocol-http": ^5.3.0 - "@smithy/smithy-client": ^4.7.0 - "@smithy/types": ^4.6.0 - "@smithy/url-parser": ^4.2.0 - "@smithy/util-base64": ^4.2.0 - "@smithy/util-body-length-browser": ^4.2.0 - "@smithy/util-body-length-node": ^4.2.0 - "@smithy/util-defaults-mode-browser": ^4.2.0 - "@smithy/util-defaults-mode-node": ^4.2.0 - "@smithy/util-endpoints": ^3.2.0 - "@smithy/util-middleware": ^4.2.0 - "@smithy/util-retry": ^4.2.0 - "@smithy/util-utf8": ^4.2.0 - "@smithy/util-waiter": ^4.2.0 - "@smithy/uuid": ^1.1.0 + "@aws-sdk/core": 3.844.0 + "@aws-sdk/credential-provider-node": 3.844.0 + "@aws-sdk/middleware-endpoint-discovery": 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-user-agent": 3.844.0 + "@aws-sdk/region-config-resolver": 3.840.0 + "@aws-sdk/types": 3.840.0 + "@aws-sdk/util-endpoints": 3.844.0 + "@aws-sdk/util-user-agent-browser": 3.840.0 + "@aws-sdk/util-user-agent-node": 3.844.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.14 + "@smithy/middleware-retry": ^4.1.15 + "@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.6 + "@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.22 + "@smithy/util-defaults-mode-node": ^4.0.22 + "@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-waiter": ^4.0.6 + "@types/uuid": ^9.0.1 tslib: ^2.6.2 - checksum: f9e7d5dc6e9d09614fcde0ed29a0ddf21d8f43d8f527d9a38250df70a938de0e1c0d55759f377ad3e089eb5dc21397c16afa1ad1bec2a435c8da5ed0f4b9a68a + uuid: ^9.0.1 + checksum: 1d00e78cebddbecc7a281c490a866c4a21be7c44b96beeea02b653ff52e6e618201f32dd0964fbb15a9f529921e90c356d4a02450293cbd30900246b12108abb languageName: node linkType: hard @@ -4137,52 +4140,52 @@ __metadata: linkType: hard "@aws-sdk/client-ssm@npm:^3.624.0": - version: 3.891.0 - resolution: "@aws-sdk/client-ssm@npm:3.891.0" + version: 3.844.0 + resolution: "@aws-sdk/client-ssm@npm:3.844.0" dependencies: "@aws-crypto/sha256-browser": 5.2.0 "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.890.0 - "@aws-sdk/credential-provider-node": 3.891.0 - "@aws-sdk/middleware-host-header": 3.891.0 - "@aws-sdk/middleware-logger": 3.891.0 - "@aws-sdk/middleware-recursion-detection": 3.891.0 - "@aws-sdk/middleware-user-agent": 3.891.0 - "@aws-sdk/region-config-resolver": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@aws-sdk/util-endpoints": 3.891.0 - "@aws-sdk/util-user-agent-browser": 3.887.0 - "@aws-sdk/util-user-agent-node": 3.891.0 - "@smithy/config-resolver": ^4.2.2 - "@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.2 - "@smithy/middleware-retry": ^4.2.3 - "@smithy/middleware-serde": ^4.1.1 - "@smithy/middleware-stack": ^4.1.1 - "@smithy/node-config-provider": ^4.2.2 - "@smithy/node-http-handler": ^4.2.1 - "@smithy/protocol-http": ^5.2.1 - "@smithy/smithy-client": ^4.6.2 - "@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.2 - "@smithy/util-defaults-mode-node": ^4.1.2 - "@smithy/util-endpoints": ^3.1.2 - "@smithy/util-middleware": ^4.1.1 - "@smithy/util-retry": ^4.1.2 - "@smithy/util-utf8": ^4.1.0 - "@smithy/util-waiter": ^4.1.1 + "@aws-sdk/core": 3.844.0 + "@aws-sdk/credential-provider-node": 3.844.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.844.0 + "@aws-sdk/region-config-resolver": 3.840.0 + "@aws-sdk/types": 3.840.0 + "@aws-sdk/util-endpoints": 3.844.0 + "@aws-sdk/util-user-agent-browser": 3.840.0 + "@aws-sdk/util-user-agent-node": 3.844.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.14 + "@smithy/middleware-retry": ^4.1.15 + "@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.6 + "@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.22 + "@smithy/util-defaults-mode-node": ^4.0.22 + "@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-waiter": ^4.0.6 "@types/uuid": ^9.0.1 tslib: ^2.6.2 uuid: ^9.0.1 - checksum: 8607a2c2440f984237f2d3c1ce3ebd033a8d4114b9842423cc6f3bb1e8dbdb67f9f30b430a3072b0ab75ee3672d021379273f40925cc81eca46ad72dd628ae72 + checksum: 726b62e961883f15f522e5783eb31a91f5050234031abf02232e56609a1047e0c4f5c069deee22d3beeb19469a53090f42bcb3ac95c32336407a0266ad54bc4a languageName: node linkType: hard @@ -4550,52 +4553,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/client-sso@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/client-sso@npm:3.891.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.890.0 - "@aws-sdk/middleware-host-header": 3.891.0 - "@aws-sdk/middleware-logger": 3.891.0 - "@aws-sdk/middleware-recursion-detection": 3.891.0 - "@aws-sdk/middleware-user-agent": 3.891.0 - "@aws-sdk/region-config-resolver": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@aws-sdk/util-endpoints": 3.891.0 - "@aws-sdk/util-user-agent-browser": 3.887.0 - "@aws-sdk/util-user-agent-node": 3.891.0 - "@smithy/config-resolver": ^4.2.2 - "@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.2 - "@smithy/middleware-retry": ^4.2.3 - "@smithy/middleware-serde": ^4.1.1 - "@smithy/middleware-stack": ^4.1.1 - "@smithy/node-config-provider": ^4.2.2 - "@smithy/node-http-handler": ^4.2.1 - "@smithy/protocol-http": ^5.2.1 - "@smithy/smithy-client": ^4.6.2 - "@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.2 - "@smithy/util-defaults-mode-node": ^4.1.2 - "@smithy/util-endpoints": ^3.1.2 - "@smithy/util-middleware": ^4.1.1 - "@smithy/util-retry": ^4.1.2 - "@smithy/util-utf8": ^4.1.0 - tslib: ^2.6.2 - checksum: 5e52e5b6fb6935c38a0453a9aa70ccdb7c82c71d9148466dfaa5b0741e8ea962843b245c3b08945feee38e718351f47d167a8bd3ac158b25bc0b778f41559a69 - languageName: node - linkType: hard - "@aws-sdk/client-sso@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/client-sso@npm:3.901.0" @@ -4642,6 +4599,52 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/client-sso@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/client-sso@npm:3.916.0" + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.916.0 + "@aws-sdk/middleware-host-header": 3.914.0 + "@aws-sdk/middleware-logger": 3.914.0 + "@aws-sdk/middleware-recursion-detection": 3.914.0 + "@aws-sdk/middleware-user-agent": 3.916.0 + "@aws-sdk/region-config-resolver": 3.914.0 + "@aws-sdk/types": 3.914.0 + "@aws-sdk/util-endpoints": 3.916.0 + "@aws-sdk/util-user-agent-browser": 3.914.0 + "@aws-sdk/util-user-agent-node": 3.916.0 + "@smithy/config-resolver": ^4.4.0 + "@smithy/core": ^3.17.1 + "@smithy/fetch-http-handler": ^5.3.4 + "@smithy/hash-node": ^4.2.3 + "@smithy/invalid-dependency": ^4.2.3 + "@smithy/middleware-content-length": ^4.2.3 + "@smithy/middleware-endpoint": ^4.3.5 + "@smithy/middleware-retry": ^4.4.5 + "@smithy/middleware-serde": ^4.2.3 + "@smithy/middleware-stack": ^4.2.3 + "@smithy/node-config-provider": ^4.3.3 + "@smithy/node-http-handler": ^4.4.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + "@smithy/url-parser": ^4.2.3 + "@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.4 + "@smithy/util-defaults-mode-node": ^4.2.6 + "@smithy/util-endpoints": ^3.2.3 + "@smithy/util-middleware": ^4.2.3 + "@smithy/util-retry": ^4.2.3 + "@smithy/util-utf8": ^4.2.0 + tslib: ^2.6.2 + checksum: ce90c351bfeb207198136c378bd13fbceaec46b6306c62ea8b65d218391e5219afcfe6686313c7de13076f4e630dafb2c689639a0d76bd0773f09e09723fd2cc + languageName: node + linkType: hard + "@aws-sdk/client-sts@npm:3.186.3": version: 3.186.3 resolution: "@aws-sdk/client-sts@npm:3.186.3" @@ -4993,29 +4996,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/core@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/core@npm:3.890.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.2 - "@smithy/property-provider": ^4.1.1 - "@smithy/protocol-http": ^5.2.1 - "@smithy/signature-v4": ^5.2.1 - "@smithy/smithy-client": ^4.6.2 - "@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 - checksum: 20794214024add4ea9a9806659c9507b5914664d63c31dc78eb6fe3cf0f2bfdc435895292a706eaa358c5bac2643232d859408897f74a3334f588c2cdfa30fd2 - languageName: node - linkType: hard - "@aws-sdk/core@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/core@npm:3.901.0" @@ -5037,6 +5017,27 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/core@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/core@npm:3.916.0" + dependencies: + "@aws-sdk/types": 3.914.0 + "@aws-sdk/xml-builder": 3.914.0 + "@smithy/core": ^3.17.1 + "@smithy/node-config-provider": ^4.3.3 + "@smithy/property-provider": ^4.2.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/signature-v4": ^5.3.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + "@smithy/util-base64": ^4.3.0 + "@smithy/util-middleware": ^4.2.3 + "@smithy/util-utf8": ^4.2.0 + tslib: ^2.6.2 + checksum: ee4d6b11e7b070376e2af698fabaeb8bce77dc3f752a4f2843e3fcce9fb9a3e2a41a9b24b6c19f26312cda83ef1f825756b7a07532d061e192307c1a2abcf93b + languageName: node + linkType: hard + "@aws-sdk/credential-provider-cognito-identity@npm:3.624.0": version: 3.624.0 resolution: "@aws-sdk/credential-provider-cognito-identity@npm:3.624.0" @@ -5149,19 +5150,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-env@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-env@npm:3.890.0" - dependencies: - "@aws-sdk/core": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@smithy/property-provider": ^4.1.1 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 52d648a385a25daf95e6884e2849158f6bf7f3f502258167d83fc278fd79b79d32408bbcacf2de5ff71f5e81b1b48f6133538f487de07210a3c5d97a235bb5d1 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-env@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/credential-provider-env@npm:3.901.0" @@ -5175,6 +5163,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-env@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/credential-provider-env@npm:3.916.0" + dependencies: + "@aws-sdk/core": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/property-provider": ^4.2.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 6a05a282c8599231b5e9af3cdd20abdc2ae0aff2fb2a126ca1fc171fed6cbe457e866d7791dca94d709b0b227a1fb59a63e35a806e6f3257a5d8ff32076b0e75 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-http@npm:3.622.0": version: 3.622.0 resolution: "@aws-sdk/credential-provider-http@npm:3.622.0" @@ -5264,24 +5265,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-http@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-http@npm:3.890.0" - dependencies: - "@aws-sdk/core": 3.890.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.1.1 - "@smithy/protocol-http": ^5.2.1 - "@smithy/smithy-client": ^4.6.2 - "@smithy/types": ^4.5.0 - "@smithy/util-stream": ^4.3.1 - tslib: ^2.6.2 - checksum: c48bc17cacddfc47a1f5dbb8be2fdff68ae0c80cdab1192e406bc65744b13412f9100bc1af2126efafea427fafd9d58284e6d095c63a3957ac0dd087c5fc360b - languageName: node - linkType: hard - "@aws-sdk/credential-provider-http@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/credential-provider-http@npm:3.901.0" @@ -5300,6 +5283,24 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-http@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/credential-provider-http@npm:3.916.0" + dependencies: + "@aws-sdk/core": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/fetch-http-handler": ^5.3.4 + "@smithy/node-http-handler": ^4.4.3 + "@smithy/property-provider": ^4.2.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + "@smithy/util-stream": ^4.5.4 + tslib: ^2.6.2 + checksum: 482012b32e01118196af4f8018bfcc154f085b9a1ea1d419b2287a364d34674d58ead4d95d931c66160d698d1a1e414b3b6ddc0f8e6995a597f3f207699538ed + languageName: node + linkType: hard + "@aws-sdk/credential-provider-imds@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/credential-provider-imds@npm:3.186.0" @@ -5478,27 +5479,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-ini@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-ini@npm:3.891.0" - dependencies: - "@aws-sdk/core": 3.890.0 - "@aws-sdk/credential-provider-env": 3.890.0 - "@aws-sdk/credential-provider-http": 3.890.0 - "@aws-sdk/credential-provider-process": 3.890.0 - "@aws-sdk/credential-provider-sso": 3.891.0 - "@aws-sdk/credential-provider-web-identity": 3.891.0 - "@aws-sdk/nested-clients": 3.891.0 - "@aws-sdk/types": 3.887.0 - "@smithy/credential-provider-imds": ^4.1.2 - "@smithy/property-provider": ^4.1.1 - "@smithy/shared-ini-file-loader": ^4.2.0 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 642d533f8e94c6b3b94659a7c8985d072c423fdd7d3d340875366656441857c83e1965a6305a438ce8db451ec83f597916bb01815baa0a0c12d8c75f4b0d9adf - languageName: node - linkType: hard - "@aws-sdk/credential-provider-ini@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/credential-provider-ini@npm:3.901.0" @@ -5520,6 +5500,27 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-ini@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/credential-provider-ini@npm:3.916.0" + dependencies: + "@aws-sdk/core": 3.916.0 + "@aws-sdk/credential-provider-env": 3.916.0 + "@aws-sdk/credential-provider-http": 3.916.0 + "@aws-sdk/credential-provider-process": 3.916.0 + "@aws-sdk/credential-provider-sso": 3.916.0 + "@aws-sdk/credential-provider-web-identity": 3.916.0 + "@aws-sdk/nested-clients": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/credential-provider-imds": ^4.2.3 + "@smithy/property-provider": ^4.2.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 3cc7f56ba723e809009dd9771f0eb5362e07bbb0085d8789b356e0aeea008e7d31280a921847502007847510dc1857133bf5485eb253aea1a6bca89871a6ff4e + languageName: node + linkType: hard + "@aws-sdk/credential-provider-node@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/credential-provider-node@npm:3.186.0" @@ -5674,26 +5675,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-node@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-node@npm:3.891.0" - dependencies: - "@aws-sdk/credential-provider-env": 3.890.0 - "@aws-sdk/credential-provider-http": 3.890.0 - "@aws-sdk/credential-provider-ini": 3.891.0 - "@aws-sdk/credential-provider-process": 3.890.0 - "@aws-sdk/credential-provider-sso": 3.891.0 - "@aws-sdk/credential-provider-web-identity": 3.891.0 - "@aws-sdk/types": 3.887.0 - "@smithy/credential-provider-imds": ^4.1.2 - "@smithy/property-provider": ^4.1.1 - "@smithy/shared-ini-file-loader": ^4.2.0 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 9f701c7fcf58f9421ede8ceeaa8d261a835216eb9f7910fc3ecf8f59ff4f4a84008be335ae329816ddc6119e30aa358ae92133081daa97ef2363561b81b44b5f - languageName: node - linkType: hard - "@aws-sdk/credential-provider-node@npm:3.901.0, @aws-sdk/credential-provider-node@npm:^3.624.0": version: 3.901.0 resolution: "@aws-sdk/credential-provider-node@npm:3.901.0" @@ -5714,6 +5695,26 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-node@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/credential-provider-node@npm:3.916.0" + dependencies: + "@aws-sdk/credential-provider-env": 3.916.0 + "@aws-sdk/credential-provider-http": 3.916.0 + "@aws-sdk/credential-provider-ini": 3.916.0 + "@aws-sdk/credential-provider-process": 3.916.0 + "@aws-sdk/credential-provider-sso": 3.916.0 + "@aws-sdk/credential-provider-web-identity": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/credential-provider-imds": ^4.2.3 + "@smithy/property-provider": ^4.2.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 6c54373d510dd2a794fb48710c7373c471c93ba26b22268a02a3032951dced923f242bfb959d67e6fda07e0130cd6c94cf59699085bd846c86b44f17e16f440a + languageName: node + linkType: hard + "@aws-sdk/credential-provider-process@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/credential-provider-process@npm:3.186.0" @@ -5808,20 +5809,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-process@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/credential-provider-process@npm:3.890.0" - dependencies: - "@aws-sdk/core": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@smithy/property-provider": ^4.1.1 - "@smithy/shared-ini-file-loader": ^4.2.0 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 4cb1864ad5318ceb8d6b6c0b97f1991ea309776139a19469128d19ebfe01127dbafc2f8cf7cf04e2308cedbf1ba5bee9129fadf07c66b6a88c91ecc819e2058a - languageName: node - linkType: hard - "@aws-sdk/credential-provider-process@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/credential-provider-process@npm:3.901.0" @@ -5836,6 +5823,20 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-process@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/credential-provider-process@npm:3.916.0" + dependencies: + "@aws-sdk/core": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/property-provider": ^4.2.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: a0cb35f6c79435613f7d4025fd7d8a898566d3c3c42cef76e9b01768d151193c0d235344134fa4514d65d76aa954633c9c424c95095e11b066bd8d01aea63126 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-sso@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.186.0" @@ -5944,22 +5945,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-sso@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-sso@npm:3.891.0" - dependencies: - "@aws-sdk/client-sso": 3.891.0 - "@aws-sdk/core": 3.890.0 - "@aws-sdk/token-providers": 3.891.0 - "@aws-sdk/types": 3.887.0 - "@smithy/property-provider": ^4.1.1 - "@smithy/shared-ini-file-loader": ^4.2.0 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 618e4ef6b6b0a58ddfa28cb80d883eb947be4ca6a91c3c62c6d83c615ccf4bb9ae5c371beac03fed31c3afde13dfea0c6ca6483ca5aa9baee7e41b4b94e4e006 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-sso@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/credential-provider-sso@npm:3.901.0" @@ -5976,6 +5961,22 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-sso@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/credential-provider-sso@npm:3.916.0" + dependencies: + "@aws-sdk/client-sso": 3.916.0 + "@aws-sdk/core": 3.916.0 + "@aws-sdk/token-providers": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/property-provider": ^4.2.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: f9cd04514d0bc6495fb6cf8172e0cd202e19262b036ff06bbd4244a6c3573fa7d0b1f5d23aa5267a4b9606eeba8145831eccc7fd75d4a929e3fc893bf26776f0 + languageName: node + linkType: hard + "@aws-sdk/credential-provider-web-identity@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.186.0" @@ -6071,21 +6072,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/credential-provider-web-identity@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/credential-provider-web-identity@npm:3.891.0" - dependencies: - "@aws-sdk/core": 3.890.0 - "@aws-sdk/nested-clients": 3.891.0 - "@aws-sdk/types": 3.887.0 - "@smithy/property-provider": ^4.1.1 - "@smithy/shared-ini-file-loader": ^4.2.0 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 3efbf1c8bcb9438bf09673a6eaf6cb0ad1a1b39635e7462f515818f66748ca9dafe58208be152574c6b967d061616822f6dfd702bb385f32bc7090e981300e49 - languageName: node - linkType: hard - "@aws-sdk/credential-provider-web-identity@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/credential-provider-web-identity@npm:3.901.0" @@ -6101,6 +6087,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/credential-provider-web-identity@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/credential-provider-web-identity@npm:3.916.0" + dependencies: + "@aws-sdk/core": 3.916.0 + "@aws-sdk/nested-clients": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/property-provider": ^4.2.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 42dc589134730af1941d1657aa4d0129e7efe01324c1355f1b9dbe35a2472b0d6af61f3d638c73659720f9c92fb88e25e483df07f8b16f6cb64cd5b93778726a + languageName: node + linkType: hard + "@aws-sdk/credential-providers@npm:3.624.0": version: 3.624.0 resolution: "@aws-sdk/credential-providers@npm:3.624.0" @@ -6162,13 +6163,13 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/endpoint-cache@npm:3.893.0": - version: 3.893.0 - resolution: "@aws-sdk/endpoint-cache@npm:3.893.0" +"@aws-sdk/endpoint-cache@npm:3.804.0": + version: 3.804.0 + resolution: "@aws-sdk/endpoint-cache@npm:3.804.0" dependencies: mnemonist: 0.38.3 tslib: ^2.6.2 - checksum: 6f7725ab605b57ef6d19eec78cff1e3b21296640e16da496216671583fe0aef69f6bc4b982110460784c8c2c607f034944c88eda32a36da87482081847a9ce9e + checksum: 566bb7bb8633e95d40b8f622c3ff53d193b6b6e5f3e09ee86ef62d885e73ad5b75822e85c8ca920b0d8badc4e2c2b54697b2d87a8afae8920b4108798138d28a languageName: node linkType: hard @@ -6512,17 +6513,17 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-endpoint-discovery@npm:3.901.0": - version: 3.901.0 - resolution: "@aws-sdk/middleware-endpoint-discovery@npm:3.901.0" +"@aws-sdk/middleware-endpoint-discovery@npm:3.840.0": + version: 3.840.0 + resolution: "@aws-sdk/middleware-endpoint-discovery@npm:3.840.0" dependencies: - "@aws-sdk/endpoint-cache": 3.893.0 - "@aws-sdk/types": 3.901.0 - "@smithy/node-config-provider": ^4.3.0 - "@smithy/protocol-http": ^5.3.0 - "@smithy/types": ^4.6.0 + "@aws-sdk/endpoint-cache": 3.804.0 + "@aws-sdk/types": 3.840.0 + "@smithy/node-config-provider": ^4.1.3 + "@smithy/protocol-http": ^5.1.2 + "@smithy/types": ^4.3.1 tslib: ^2.6.2 - checksum: acbabdc1626dabb47a47c76f36e9388c5618a0939858aa2a21822dab4286f3caa08a033b41d4b357e54c8a0989a4ea1dd8e901106ed8a6d968d7f3cd1717aa33 + checksum: 683e23d0538f68e655c9db7a3f4e26149210aa7bb43edef6ab2163156694df41dced69580144e252bbba2f83b37c2c3b0e9952cb805b18c12dcc5a01b001c936 languageName: node linkType: hard @@ -6668,18 +6669,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-host-header@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-host-header@npm:3.891.0" - dependencies: - "@aws-sdk/types": 3.887.0 - "@smithy/protocol-http": ^5.2.1 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 5716641a3732ffcae51387af289888dd771260b783e75b8c1c137ba18565a1e3a33318a1673f736baec36aaeba7f7cfd3446ce4844caed3fa2c080cf23d523f4 - languageName: node - linkType: hard - "@aws-sdk/middleware-host-header@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/middleware-host-header@npm:3.901.0" @@ -6692,6 +6681,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-host-header@npm:3.914.0": + version: 3.914.0 + resolution: "@aws-sdk/middleware-host-header@npm:3.914.0" + dependencies: + "@aws-sdk/types": 3.914.0 + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: f5141335b89132a7e54b799fb5e849a2162a79c9f3ff287e497938a6ddc9f81e2ebca7888759f83633cc4347c2510f937442695e24b9c5de07964e3545345cdd + languageName: node + linkType: hard + "@aws-sdk/middleware-location-constraint@npm:3.609.0": version: 3.609.0 resolution: "@aws-sdk/middleware-location-constraint@npm:3.609.0" @@ -6778,17 +6779,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-logger@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-logger@npm:3.891.0" - dependencies: - "@aws-sdk/types": 3.887.0 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 6eab8cb71b14597e30334df164e211fadd093a380811efef156baa126b9ed42fdf005f54447cd48050e211e277719cd182f4534a44757d799b21a77ef39b460d - languageName: node - linkType: hard - "@aws-sdk/middleware-logger@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/middleware-logger@npm:3.901.0" @@ -6800,6 +6790,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-logger@npm:3.914.0": + version: 3.914.0 + resolution: "@aws-sdk/middleware-logger@npm:3.914.0" + dependencies: + "@aws-sdk/types": 3.914.0 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: d9011740d92d20b451a82e442069f81e57b5e86608573d753e4dedf80d9bfb5660fe2651aa542f26be7a16d97ec2aad708a80c1ae197ef0700ddfc6bc90e4554 + languageName: node + linkType: hard + "@aws-sdk/middleware-recursion-detection@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/middleware-recursion-detection@npm:3.186.0" @@ -6859,19 +6860,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-recursion-detection@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-recursion-detection@npm:3.891.0" - dependencies: - "@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 - checksum: 3e8af5cc39f1d85a91d7856cce38070948e90b9cb0068e8e5cc861ce91d3d9370cdbdbef305bd5770e31e0f4fea330e3447df4030f1b9ce51c4e9974d0e001ad - languageName: node - linkType: hard - "@aws-sdk/middleware-recursion-detection@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/middleware-recursion-detection@npm:3.901.0" @@ -6885,6 +6873,19 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-recursion-detection@npm:3.914.0": + version: 3.914.0 + resolution: "@aws-sdk/middleware-recursion-detection@npm:3.914.0" + dependencies: + "@aws-sdk/types": 3.914.0 + "@aws/lambda-invoke-store": ^0.0.1 + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 45f5dfb4352e2554642eed38cee2bb7265ecbff2144671656f87d8f52948f11a9c401e08e6e1e054cd84e9ade32e86648f8de5266a342cc2d1efd6709c7f1574 + languageName: node + linkType: hard + "@aws-sdk/middleware-retry@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/middleware-retry@npm:3.186.0" @@ -7259,21 +7260,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/middleware-user-agent@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/middleware-user-agent@npm:3.891.0" - dependencies: - "@aws-sdk/core": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@aws-sdk/util-endpoints": 3.891.0 - "@smithy/core": ^3.11.0 - "@smithy/protocol-http": ^5.2.1 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 9a9bd85ebccbf705a40c53490e523a5e4a311fe9f8eb9d3e5cd8593b84011db03d90a153dcb2f984cb908b6e7e65fa23ecf0bc48234e73aca3ebf3b031bd0202 - languageName: node - linkType: hard - "@aws-sdk/middleware-user-agent@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/middleware-user-agent@npm:3.901.0" @@ -7289,6 +7275,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/middleware-user-agent@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/middleware-user-agent@npm:3.916.0" + dependencies: + "@aws-sdk/core": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@aws-sdk/util-endpoints": 3.916.0 + "@smithy/core": ^3.17.1 + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 4ad432b4fcc7c473c4b4dc2cf1fc7f2db8afbcb834471b746515f5f0c4b049276acd83a6dee59172166aa2df2288a821e0ee39d711dcd15fddc56ef62820d855 + languageName: node + linkType: hard + "@aws-sdk/nested-clients@npm:3.830.0": version: 3.830.0 resolution: "@aws-sdk/nested-clients@npm:3.830.0" @@ -7519,52 +7520,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/nested-clients@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/nested-clients@npm:3.891.0" - dependencies: - "@aws-crypto/sha256-browser": 5.2.0 - "@aws-crypto/sha256-js": 5.2.0 - "@aws-sdk/core": 3.890.0 - "@aws-sdk/middleware-host-header": 3.891.0 - "@aws-sdk/middleware-logger": 3.891.0 - "@aws-sdk/middleware-recursion-detection": 3.891.0 - "@aws-sdk/middleware-user-agent": 3.891.0 - "@aws-sdk/region-config-resolver": 3.890.0 - "@aws-sdk/types": 3.887.0 - "@aws-sdk/util-endpoints": 3.891.0 - "@aws-sdk/util-user-agent-browser": 3.887.0 - "@aws-sdk/util-user-agent-node": 3.891.0 - "@smithy/config-resolver": ^4.2.2 - "@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.2 - "@smithy/middleware-retry": ^4.2.3 - "@smithy/middleware-serde": ^4.1.1 - "@smithy/middleware-stack": ^4.1.1 - "@smithy/node-config-provider": ^4.2.2 - "@smithy/node-http-handler": ^4.2.1 - "@smithy/protocol-http": ^5.2.1 - "@smithy/smithy-client": ^4.6.2 - "@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.2 - "@smithy/util-defaults-mode-node": ^4.1.2 - "@smithy/util-endpoints": ^3.1.2 - "@smithy/util-middleware": ^4.1.1 - "@smithy/util-retry": ^4.1.2 - "@smithy/util-utf8": ^4.1.0 - tslib: ^2.6.2 - checksum: f69d9f9cf0f94558367312e47741cdfe94472d7a3e94f44723c22fe796f007207bebc19c6fe2b12ac0f44bb067f7cd65499a0936ec91e94f445579e7147a7813 - languageName: node - linkType: hard - "@aws-sdk/nested-clients@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/nested-clients@npm:3.901.0" @@ -7611,6 +7566,52 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/nested-clients@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/nested-clients@npm:3.916.0" + dependencies: + "@aws-crypto/sha256-browser": 5.2.0 + "@aws-crypto/sha256-js": 5.2.0 + "@aws-sdk/core": 3.916.0 + "@aws-sdk/middleware-host-header": 3.914.0 + "@aws-sdk/middleware-logger": 3.914.0 + "@aws-sdk/middleware-recursion-detection": 3.914.0 + "@aws-sdk/middleware-user-agent": 3.916.0 + "@aws-sdk/region-config-resolver": 3.914.0 + "@aws-sdk/types": 3.914.0 + "@aws-sdk/util-endpoints": 3.916.0 + "@aws-sdk/util-user-agent-browser": 3.914.0 + "@aws-sdk/util-user-agent-node": 3.916.0 + "@smithy/config-resolver": ^4.4.0 + "@smithy/core": ^3.17.1 + "@smithy/fetch-http-handler": ^5.3.4 + "@smithy/hash-node": ^4.2.3 + "@smithy/invalid-dependency": ^4.2.3 + "@smithy/middleware-content-length": ^4.2.3 + "@smithy/middleware-endpoint": ^4.3.5 + "@smithy/middleware-retry": ^4.4.5 + "@smithy/middleware-serde": ^4.2.3 + "@smithy/middleware-stack": ^4.2.3 + "@smithy/node-config-provider": ^4.3.3 + "@smithy/node-http-handler": ^4.4.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + "@smithy/url-parser": ^4.2.3 + "@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.4 + "@smithy/util-defaults-mode-node": ^4.2.6 + "@smithy/util-endpoints": ^3.2.3 + "@smithy/util-middleware": ^4.2.3 + "@smithy/util-retry": ^4.2.3 + "@smithy/util-utf8": ^4.2.0 + tslib: ^2.6.2 + checksum: fd77d4cb08f3176ee87f18f5771039f883d76013b3cfd0440c2592b8e953ef775d2058c2c485c1b8df27a6e6ae56de6560fbd824ac5a5fff98b6f20376857158 + languageName: node + linkType: hard + "@aws-sdk/node-config-provider@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/node-config-provider@npm:3.186.0" @@ -7799,20 +7800,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/region-config-resolver@npm:3.890.0": - version: 3.890.0 - resolution: "@aws-sdk/region-config-resolver@npm:3.890.0" - dependencies: - "@aws-sdk/types": 3.887.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 - checksum: a95432f7fc38653cd31b58c9ccc543d63a79184b7a67d8e880b3c171576b548616c8dcf0b12a995d78ace1f4893f0b3ed3cef6d9e8c65cf54683fe6bd7cf99c1 - languageName: node - linkType: hard - "@aws-sdk/region-config-resolver@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/region-config-resolver@npm:3.901.0" @@ -7827,6 +7814,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/region-config-resolver@npm:3.914.0": + version: 3.914.0 + resolution: "@aws-sdk/region-config-resolver@npm:3.914.0" + dependencies: + "@aws-sdk/types": 3.914.0 + "@smithy/config-resolver": ^4.4.0 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: a473db628478a4403c34121231ed03c4b9c148659d797f8daa1ed7608b86bb23b1f85c63a99abb0efe9f540659d424d9e720b2e689cbcd7d61d888de610d4513 + languageName: node + linkType: hard + "@aws-sdk/s3-request-presigner@npm:^3.624.0": version: 3.844.0 resolution: "@aws-sdk/s3-request-presigner@npm:3.844.0" @@ -8057,21 +8056,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/token-providers@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/token-providers@npm:3.891.0" - dependencies: - "@aws-sdk/core": 3.890.0 - "@aws-sdk/nested-clients": 3.891.0 - "@aws-sdk/types": 3.887.0 - "@smithy/property-provider": ^4.1.1 - "@smithy/shared-ini-file-loader": ^4.2.0 - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: ed6f689a9e643dc240b65d8b109b841694f71cb9aeaf73df185b757be3311165b90bd5068437857e347094a4338deb2036b084eef7e66845f9f905342918c773 - languageName: node - linkType: hard - "@aws-sdk/token-providers@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/token-providers@npm:3.901.0" @@ -8087,6 +8071,21 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/token-providers@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/token-providers@npm:3.916.0" + dependencies: + "@aws-sdk/core": 3.916.0 + "@aws-sdk/nested-clients": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/property-provider": ^4.2.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 97d7ed9895f59eeadf597ec335d951a552a017e34d1e4283f42b8dc965ce115449d03219ac5364401fe2f82ad2bc32a96139d91be71faf17921886af9653b6a9 + languageName: node + linkType: hard + "@aws-sdk/types@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/types@npm:3.186.0" @@ -8150,16 +8149,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/types@npm:3.887.0": - version: 3.887.0 - resolution: "@aws-sdk/types@npm:3.887.0" - dependencies: - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: 862ad368a8692cf75b0e44e96b2fe96c0e145f3c40bbb4a6fe07de1f5935722f0ecdc983fdf09789527a2555392a3cac08372d9a7cdec5f15849508083104413 - languageName: node - linkType: hard - "@aws-sdk/types@npm:3.901.0, @aws-sdk/types@npm:^3.1.0, @aws-sdk/types@npm:^3.222.0, @aws-sdk/types@npm:^3.25.0, @aws-sdk/types@npm:^3.624.0": version: 3.901.0 resolution: "@aws-sdk/types@npm:3.901.0" @@ -8170,6 +8159,16 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/types@npm:3.914.0": + version: 3.914.0 + resolution: "@aws-sdk/types@npm:3.914.0" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 71de24f076587ffc53acdc62ef16de711bd0c00f9a40491cd12a2c762e794c751e4ab79e0fb798c06a6a0e731cf0716f7833add085b1c85b7bfa2fba75e83937 + languageName: node + linkType: hard + "@aws-sdk/url-parser-native@npm:3.6.1": version: 3.6.1 resolution: "@aws-sdk/url-parser-native@npm:3.6.1" @@ -8373,13 +8372,13 @@ __metadata: linkType: hard "@aws-sdk/util-dynamodb@npm:^3.624.0": - version: 3.891.0 - resolution: "@aws-sdk/util-dynamodb@npm:3.891.0" + version: 3.916.0 + resolution: "@aws-sdk/util-dynamodb@npm:3.916.0" dependencies: tslib: ^2.6.2 peerDependencies: - "@aws-sdk/client-dynamodb": ^3.891.0 - checksum: 0ce33995341973286e89b6af3c750949828fc84e808f9bcd62e978ab8c752611a786e9ceb5f77952a8cd8c7bac626ab97e46ba6d2ca570f9b07314993582a7d4 + "@aws-sdk/client-dynamodb": ^3.916.0 + checksum: 3fa57c799f8e085e8cf88ef374c10e3efe16e8a8f3af9095d7f13a07ea5e8fdd4b70f43dcaf0da3fa7c22f9386ce1e296deb0701e7d4176912f87d741259536f languageName: node linkType: hard @@ -8459,19 +8458,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-endpoints@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/util-endpoints@npm:3.891.0" - dependencies: - "@aws-sdk/types": 3.887.0 - "@smithy/types": ^4.5.0 - "@smithy/url-parser": ^4.1.1 - "@smithy/util-endpoints": ^3.1.2 - tslib: ^2.6.2 - checksum: 78c0cf6956f4b866449ba535a4055a67c801f26f25e9839c96cec899a8e369f6db648739d4428ce7d3799103cd7aed76040bd817b31fdf907fb4bfe10de968d7 - languageName: node - linkType: hard - "@aws-sdk/util-endpoints@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/util-endpoints@npm:3.901.0" @@ -8481,7 +8467,20 @@ __metadata: "@smithy/url-parser": ^4.2.0 "@smithy/util-endpoints": ^3.2.0 tslib: ^2.6.2 - checksum: ae6a2b15975e1b4e36211c30ff7ea2ac080bb5add13a7e5181b348bc393a74f82b6c5afb998c8dde9aedfe97eae23e0ce64da79cbd2b4061c594d1bd3d9d4a65 + checksum: ae6a2b15975e1b4e36211c30ff7ea2ac080bb5add13a7e5181b348bc393a74f82b6c5afb998c8dde9aedfe97eae23e0ce64da79cbd2b4061c594d1bd3d9d4a65 + languageName: node + linkType: hard + +"@aws-sdk/util-endpoints@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/util-endpoints@npm:3.916.0" + dependencies: + "@aws-sdk/types": 3.914.0 + "@smithy/types": ^4.8.0 + "@smithy/url-parser": ^4.2.3 + "@smithy/util-endpoints": ^3.2.3 + tslib: ^2.6.2 + checksum: ea67106b19f10a8cd01bda8dc76978c844723056b2fa8fad637c4a456b2d4a1e131e7f872539f580e25fc41bdce219427b209eceb0fceb3bd610cab82b8025fb languageName: node linkType: hard @@ -8642,18 +8641,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-browser@npm:3.887.0": - version: 3.887.0 - resolution: "@aws-sdk/util-user-agent-browser@npm:3.887.0" - dependencies: - "@aws-sdk/types": 3.887.0 - "@smithy/types": ^4.5.0 - bowser: ^2.11.0 - tslib: ^2.6.2 - checksum: f48410fbdb2f986e798072a7fb55ee0780fe90c57c35f8ad22bd9127914d911ea63b6d43b62ebb81edfb8b82ec5eed1f6bc93135bc55fad294f7e5b638d20f61 - languageName: node - linkType: hard - "@aws-sdk/util-user-agent-browser@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/util-user-agent-browser@npm:3.901.0" @@ -8666,6 +8653,18 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/util-user-agent-browser@npm:3.914.0": + version: 3.914.0 + resolution: "@aws-sdk/util-user-agent-browser@npm:3.914.0" + dependencies: + "@aws-sdk/types": 3.914.0 + "@smithy/types": ^4.8.0 + bowser: ^2.11.0 + tslib: ^2.6.2 + checksum: d9adf87efbd9ecb242cf92b489f1f490008eb0149c182a72452f3352dd4b6bf0a4bf974f18369d780ed5f2341bb0c526e81611da36e5f5bf0613aca1eea3bdab + languageName: node + linkType: hard + "@aws-sdk/util-user-agent-node@npm:3.186.0": version: 3.186.0 resolution: "@aws-sdk/util-user-agent-node@npm:3.186.0" @@ -8800,39 +8799,39 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.891.0": - version: 3.891.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.891.0" +"@aws-sdk/util-user-agent-node@npm:3.901.0": + version: 3.901.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.901.0" dependencies: - "@aws-sdk/middleware-user-agent": 3.891.0 - "@aws-sdk/types": 3.887.0 - "@smithy/node-config-provider": ^4.2.2 - "@smithy/types": ^4.5.0 + "@aws-sdk/middleware-user-agent": 3.901.0 + "@aws-sdk/types": 3.901.0 + "@smithy/node-config-provider": ^4.3.0 + "@smithy/types": ^4.6.0 tslib: ^2.6.2 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: ec0da41bc610859ec2004cbd33cb934091bc92f857d5c4f1d21be5487afd7cc98dfd7afb1170e4507dc7a54f594a8898e0bef80543f5b7c2cfd1b66c680b50f1 + checksum: d18c815bb04186ca4950abaf846d9998afaf4399380c2b6de351cc7d45733fabcd681d3cdc90eca40ce3a574d1d80652817d0d8e292e68710a9aab5d9dc7bd64 languageName: node linkType: hard -"@aws-sdk/util-user-agent-node@npm:3.901.0": - version: 3.901.0 - resolution: "@aws-sdk/util-user-agent-node@npm:3.901.0" +"@aws-sdk/util-user-agent-node@npm:3.916.0": + version: 3.916.0 + resolution: "@aws-sdk/util-user-agent-node@npm:3.916.0" dependencies: - "@aws-sdk/middleware-user-agent": 3.901.0 - "@aws-sdk/types": 3.901.0 - "@smithy/node-config-provider": ^4.3.0 - "@smithy/types": ^4.6.0 + "@aws-sdk/middleware-user-agent": 3.916.0 + "@aws-sdk/types": 3.914.0 + "@smithy/node-config-provider": ^4.3.3 + "@smithy/types": ^4.8.0 tslib: ^2.6.2 peerDependencies: aws-crt: ">=1.0.0" peerDependenciesMeta: aws-crt: optional: true - checksum: d18c815bb04186ca4950abaf846d9998afaf4399380c2b6de351cc7d45733fabcd681d3cdc90eca40ce3a574d1d80652817d0d8e292e68710a9aab5d9dc7bd64 + checksum: 60910c61254d342fd08c22bc781494bb34c2a3e153e6fe787f7e18177677cf8023665bf09ef77669864a69c07cc3fe1fd412bb82e0cc8e665dbbf2b317540860 languageName: node linkType: hard @@ -8925,16 +8924,6 @@ __metadata: languageName: node linkType: hard -"@aws-sdk/xml-builder@npm:3.887.0": - version: 3.887.0 - resolution: "@aws-sdk/xml-builder@npm:3.887.0" - dependencies: - "@smithy/types": ^4.5.0 - tslib: ^2.6.2 - checksum: a8ec9b57934cba380ee72f7d5bab5305e61ffd12f8eed5957d062db0983de58a8a9f62f4979c036eccad4b74d8cf9267e8e6d21601f2dc85cc1db54a5eb17ce9 - languageName: node - linkType: hard - "@aws-sdk/xml-builder@npm:3.901.0": version: 3.901.0 resolution: "@aws-sdk/xml-builder@npm:3.901.0" @@ -8946,6 +8935,17 @@ __metadata: languageName: node linkType: hard +"@aws-sdk/xml-builder@npm:3.914.0": + version: 3.914.0 + resolution: "@aws-sdk/xml-builder@npm:3.914.0" + dependencies: + "@smithy/types": ^4.8.0 + fast-xml-parser: 5.2.5 + tslib: ^2.6.2 + checksum: d229350c17594a04165ed812e79f01f7ddc1ae3c562a95684e70e897c5feb5ae9b58a54443808ed5f883544d7a8ab720d8a6395dfdb84a6a43587171772ee184 + languageName: node + linkType: hard + "@aws/lambda-invoke-store@npm:^0.0.1": version: 0.0.1 resolution: "@aws/lambda-invoke-store@npm:0.0.1" @@ -11485,12 +11485,12 @@ __metadata: languageName: node linkType: hard -"@jest/expect-utils@npm:30.1.2": - version: 30.1.2 - resolution: "@jest/expect-utils@npm:30.1.2" +"@jest/expect-utils@npm:30.0.4": + version: 30.0.4 + resolution: "@jest/expect-utils@npm:30.0.4" dependencies: - "@jest/get-type": 30.1.0 - checksum: 5b6c4d400ad0bd22960bd77750baf55b24bf1ebdc2cec328afe275967db76bf94f797ca4c9817cdb86bc7820b9219d3f493705f3fa94fe7720960e47805a8e1b + "@jest/get-type": 30.0.1 + checksum: eda2d34b883e72b4ccccac04082701d37d35cc924bba8bbf044578f34257885b04c343fbfa2949831ee75429f665f3b157066025b1e587737b946a64aa75e973 languageName: node linkType: hard @@ -11555,10 +11555,10 @@ __metadata: languageName: node linkType: hard -"@jest/get-type@npm:30.1.0": - version: 30.1.0 - resolution: "@jest/get-type@npm:30.1.0" - checksum: 3e65fd5015f551c51ec68fca31bbd25b466be0e8ee8075d9610fa1c686ea1e70a942a0effc7b10f4ea9a338c24337e1ad97ff69d3ebacc4681b7e3e80d1b24ac +"@jest/get-type@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/get-type@npm:30.0.1" + checksum: 92437ae42d0df57e8acc2d067288151439db4752cde4f5e680c73c8a6e34568bbd8c1c81a2f2f9a637a619c2aac8bc87553fb80e31475b59e2ed789a71e5e540 languageName: node linkType: hard @@ -11632,12 +11632,12 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:30.0.5": - version: 30.0.5 - resolution: "@jest/schemas@npm:30.0.5" +"@jest/schemas@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/schemas@npm:30.0.1" dependencies: "@sinclair/typebox": ^0.34.0 - checksum: 449dcd7ec5c6505e9ac3169d1143937e67044ae3e66a729ce4baf31812dfd30535f2b3b2934393c97cfdf5984ff581120e6b38f62b8560c8b5b7cc07f4175f65 + checksum: 27977359edc4b33293af7c85c53de5014a87c29b9ab98b0a827fedfc6635abdb522aad8c3ff276080080911f519699b094bd6f4e151b43f0cc5856ccc83c04a7 languageName: node linkType: hard @@ -11754,18 +11754,18 @@ __metadata: languageName: node linkType: hard -"@jest/types@npm:30.0.5": - version: 30.0.5 - resolution: "@jest/types@npm:30.0.5" +"@jest/types@npm:30.0.1": + version: 30.0.1 + resolution: "@jest/types@npm:30.0.1" dependencies: "@jest/pattern": 30.0.1 - "@jest/schemas": 30.0.5 + "@jest/schemas": 30.0.1 "@types/istanbul-lib-coverage": ^2.0.6 "@types/istanbul-reports": ^3.0.4 "@types/node": "*" "@types/yargs": ^17.0.33 chalk: ^4.1.2 - checksum: fd097a390e36edacbd2c92a8378ec0cd67abec5e234bab7a80aec6eb8625568052b0c32acf472388d04c4cf384b8fa2871d0d12a56b4b06eaea93f2c6df0ec6c + checksum: 407469331e74f9bb1ffd40202c3a8cece2fd07ba535adeb60557bdcee13713cf2f14cf78869ba7ef50a7e6fe0ed7cc97ec775056dd640fc0a332e8fbfaec1ee8 languageName: node linkType: hard @@ -12910,9 +12910,9 @@ __metadata: linkType: hard "@sinclair/typebox@npm:^0.34.0": - version: 0.34.41 - resolution: "@sinclair/typebox@npm:0.34.41" - checksum: 0fb61fc2f90c25e30b19b0096eb8ab3ccef401d3e2acfce42168ff0ee877ba5981c8243fa6b1035ac756cde95316724e978b2837dd642d7e4e095de03a999c90 + version: 0.34.38 + resolution: "@sinclair/typebox@npm:0.34.38" + checksum: c1b9a1547c64de01ff5c89351baf289d2d5f19cfef3ae30fe4748a103eb58d0842618318543cd3de964cb0370d5a859e24aba231ade9b43ee2ef4d0bb4db7084 languageName: node linkType: hard @@ -13023,7 +13023,7 @@ __metadata: languageName: node linkType: hard -"@smithy/abort-controller@npm:^4.0.4, @smithy/abort-controller@npm:^4.2.0": +"@smithy/abort-controller@npm:^4.0.4, @smithy/abort-controller@npm:^4.0.5, @smithy/abort-controller@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/abort-controller@npm:4.2.0" dependencies: @@ -13033,6 +13033,16 @@ __metadata: languageName: node linkType: hard +"@smithy/abort-controller@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/abort-controller@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: ddb1333f85df6e61e2b4ab9d7ae8c0135fa44e7d81703d18accdefb1c280c00c8f339e157e48ca8a19fbabe3d73e728df8dfca732418268961d6ba93c7b0fb7e + languageName: node + linkType: hard + "@smithy/chunked-blob-reader-native@npm:^3.0.1": version: 3.0.1 resolution: "@smithy/chunked-blob-reader-native@npm:3.0.1" @@ -13084,7 +13094,7 @@ __metadata: languageName: node linkType: hard -"@smithy/config-resolver@npm:^4.1.4, @smithy/config-resolver@npm:^4.1.5, @smithy/config-resolver@npm:^4.2.2, @smithy/config-resolver@npm:^4.3.0": +"@smithy/config-resolver@npm:^4.1.4, @smithy/config-resolver@npm:^4.1.5, @smithy/config-resolver@npm:^4.3.0": version: 4.3.0 resolution: "@smithy/config-resolver@npm:4.3.0" dependencies: @@ -13097,6 +13107,20 @@ __metadata: languageName: node linkType: hard +"@smithy/config-resolver@npm:^4.4.0": + version: 4.4.0 + resolution: "@smithy/config-resolver@npm:4.4.0" + dependencies: + "@smithy/node-config-provider": ^4.3.3 + "@smithy/types": ^4.8.0 + "@smithy/util-config-provider": ^4.2.0 + "@smithy/util-endpoints": ^3.2.3 + "@smithy/util-middleware": ^4.2.3 + tslib: ^2.6.2 + checksum: f33e1c4569980e614dea8b709dbd8e120b725caf4a7cc557d9d31a91df1755ccc1a2179cf26681eebf713e755ad38d6b58f7aca00dfe2c3390e9481221530e43 + languageName: node + linkType: hard + "@smithy/core@npm:^2.3.2, @smithy/core@npm:^2.5.1": version: 2.5.1 resolution: "@smithy/core@npm:2.5.1" @@ -13113,7 +13137,7 @@ __metadata: languageName: node linkType: hard -"@smithy/core@npm:^3.11.0, @smithy/core@npm:^3.14.0, @smithy/core@npm:^3.5.3, @smithy/core@npm:^3.7.0, @smithy/core@npm:^3.8.0": +"@smithy/core@npm:^3.14.0, @smithy/core@npm:^3.5.3, @smithy/core@npm:^3.7.0, @smithy/core@npm:^3.8.0": version: 3.14.0 resolution: "@smithy/core@npm:3.14.0" dependencies: @@ -13131,6 +13155,24 @@ __metadata: languageName: node linkType: hard +"@smithy/core@npm:^3.17.1": + version: 3.17.1 + resolution: "@smithy/core@npm:3.17.1" + dependencies: + "@smithy/middleware-serde": ^4.2.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + "@smithy/util-base64": ^4.3.0 + "@smithy/util-body-length-browser": ^4.2.0 + "@smithy/util-middleware": ^4.2.3 + "@smithy/util-stream": ^4.5.4 + "@smithy/util-utf8": ^4.2.0 + "@smithy/uuid": ^1.1.0 + tslib: ^2.6.2 + checksum: 2b3e9f9c06b73e4e12361bec6bcf59ae6a33f60252a85114be91656765aaa9ff77fa7a9e0129875aba81b21c6630455720b8b174e1145be72aec86245c2dbf4b + languageName: node + linkType: hard + "@smithy/credential-provider-imds@npm:^3.2.0, @smithy/credential-provider-imds@npm:^3.2.5": version: 3.2.5 resolution: "@smithy/credential-provider-imds@npm:3.2.5" @@ -13144,7 +13186,7 @@ __metadata: languageName: node linkType: hard -"@smithy/credential-provider-imds@npm:^4.0.6, @smithy/credential-provider-imds@npm:^4.0.7, @smithy/credential-provider-imds@npm:^4.1.2, @smithy/credential-provider-imds@npm:^4.2.0": +"@smithy/credential-provider-imds@npm:^4.0.6, @smithy/credential-provider-imds@npm:^4.0.7, @smithy/credential-provider-imds@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/credential-provider-imds@npm:4.2.0" dependencies: @@ -13157,6 +13199,19 @@ __metadata: languageName: node linkType: hard +"@smithy/credential-provider-imds@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/credential-provider-imds@npm:4.2.3" + dependencies: + "@smithy/node-config-provider": ^4.3.3 + "@smithy/property-provider": ^4.2.3 + "@smithy/types": ^4.8.0 + "@smithy/url-parser": ^4.2.3 + tslib: ^2.6.2 + checksum: 9ea3eb9f80779180f50e2b5f68fac66f4f144b14d10419e411fcf3d44576be148af5795dde6951816784352d58e6950a0c8b45830f8f1fae9d98ffdf00ba8479 + languageName: node + linkType: hard + "@smithy/eventstream-codec@npm:^3.1.7": version: 3.1.7 resolution: "@smithy/eventstream-codec@npm:3.1.7" @@ -13293,7 +13348,7 @@ __metadata: languageName: node linkType: hard -"@smithy/fetch-http-handler@npm:^5.0.4, @smithy/fetch-http-handler@npm:^5.1.0, @smithy/fetch-http-handler@npm:^5.1.1, @smithy/fetch-http-handler@npm:^5.2.1, @smithy/fetch-http-handler@npm:^5.3.0": +"@smithy/fetch-http-handler@npm:^5.0.4, @smithy/fetch-http-handler@npm:^5.1.0, @smithy/fetch-http-handler@npm:^5.1.1, @smithy/fetch-http-handler@npm:^5.3.0": version: 5.3.0 resolution: "@smithy/fetch-http-handler@npm:5.3.0" dependencies: @@ -13306,6 +13361,19 @@ __metadata: languageName: node linkType: hard +"@smithy/fetch-http-handler@npm:^5.3.4": + version: 5.3.4 + resolution: "@smithy/fetch-http-handler@npm:5.3.4" + dependencies: + "@smithy/protocol-http": ^5.3.3 + "@smithy/querystring-builder": ^4.2.3 + "@smithy/types": ^4.8.0 + "@smithy/util-base64": ^4.3.0 + tslib: ^2.6.2 + checksum: 93ab064fbdc66021975abf070544739d428be79a5c349ada84ca2eac9c8dd23dc1aacc5a13c50d1a0043a91062291659471645a029700a2e1e0ce59b0baba5a0 + languageName: node + linkType: hard + "@smithy/hash-blob-browser@npm:^3.1.2": version: 3.1.7 resolution: "@smithy/hash-blob-browser@npm:3.1.7" @@ -13342,7 +13410,7 @@ __metadata: languageName: node linkType: hard -"@smithy/hash-node@npm:^4.0.4, @smithy/hash-node@npm:^4.0.5, @smithy/hash-node@npm:^4.1.1, @smithy/hash-node@npm:^4.2.0": +"@smithy/hash-node@npm:^4.0.4, @smithy/hash-node@npm:^4.0.5, @smithy/hash-node@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/hash-node@npm:4.2.0" dependencies: @@ -13354,6 +13422,18 @@ __metadata: languageName: node linkType: hard +"@smithy/hash-node@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/hash-node@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + "@smithy/util-buffer-from": ^4.2.0 + "@smithy/util-utf8": ^4.2.0 + tslib: ^2.6.2 + checksum: 8e2945ad4e7dc4e6ef24afea4532a29e79ff787c670085079e9441951ec4a0ebe7fe65127e47dba1d6132d277b8ea619cc4920931f990fb45f209b6a393b8de7 + languageName: node + linkType: hard + "@smithy/hash-stream-node@npm:^3.1.2": version: 3.1.7 resolution: "@smithy/hash-stream-node@npm:3.1.7" @@ -13386,7 +13466,7 @@ __metadata: languageName: node linkType: hard -"@smithy/invalid-dependency@npm:^4.0.4, @smithy/invalid-dependency@npm:^4.0.5, @smithy/invalid-dependency@npm:^4.1.1, @smithy/invalid-dependency@npm:^4.2.0": +"@smithy/invalid-dependency@npm:^4.0.4, @smithy/invalid-dependency@npm:^4.0.5, @smithy/invalid-dependency@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/invalid-dependency@npm:4.2.0" dependencies: @@ -13396,6 +13476,16 @@ __metadata: languageName: node linkType: hard +"@smithy/invalid-dependency@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/invalid-dependency@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 426cde94fc851007ede20cb7b201c03eb91a0d11ef5e0fb0308eb4d2fedbf2d82bc48367c765aa0491cf88fe731eb0c995ca6bcffe7381fd98b748795e2292a4 + languageName: node + linkType: hard + "@smithy/is-array-buffer@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/is-array-buffer@npm:2.0.0" @@ -13456,7 +13546,7 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-content-length@npm:^4.0.4, @smithy/middleware-content-length@npm:^4.0.5, @smithy/middleware-content-length@npm:^4.1.1, @smithy/middleware-content-length@npm:^4.2.0": +"@smithy/middleware-content-length@npm:^4.0.4, @smithy/middleware-content-length@npm:^4.0.5, @smithy/middleware-content-length@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/middleware-content-length@npm:4.2.0" dependencies: @@ -13467,6 +13557,17 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-content-length@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/middleware-content-length@npm:4.2.3" + dependencies: + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 67aabc8c2257299e2985eba32cf0f728c23aeb1ba6f17bab1a99bfde1970a841d709592a855d6fa1ffb10c4c004a76e70d2804622529b010e9ee2e7b243630e6 + languageName: node + linkType: hard + "@smithy/middleware-endpoint@npm:^3.1.0, @smithy/middleware-endpoint@npm:^3.2.1": version: 3.2.1 resolution: "@smithy/middleware-endpoint@npm:3.2.1" @@ -13483,7 +13584,7 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-endpoint@npm:^4.1.11, @smithy/middleware-endpoint@npm:^4.1.14, @smithy/middleware-endpoint@npm:^4.1.15, @smithy/middleware-endpoint@npm:^4.1.18, @smithy/middleware-endpoint@npm:^4.2.2, @smithy/middleware-endpoint@npm:^4.3.0": +"@smithy/middleware-endpoint@npm:^4.1.11, @smithy/middleware-endpoint@npm:^4.1.14, @smithy/middleware-endpoint@npm:^4.1.15, @smithy/middleware-endpoint@npm:^4.1.18, @smithy/middleware-endpoint@npm:^4.3.0": version: 4.3.0 resolution: "@smithy/middleware-endpoint@npm:4.3.0" dependencies: @@ -13499,6 +13600,22 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-endpoint@npm:^4.3.5": + version: 4.3.5 + resolution: "@smithy/middleware-endpoint@npm:4.3.5" + dependencies: + "@smithy/core": ^3.17.1 + "@smithy/middleware-serde": ^4.2.3 + "@smithy/node-config-provider": ^4.3.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + "@smithy/url-parser": ^4.2.3 + "@smithy/util-middleware": ^4.2.3 + tslib: ^2.6.2 + checksum: 397cad4fff38b3d388315bac04499eca34f77cd558115d9b621f145d933a851bcac99a6c4c546f43f119f46d1f6abffb25bafdcf124d1851347cacce7017a626 + languageName: node + linkType: hard + "@smithy/middleware-retry@npm:^3.0.14": version: 3.0.25 resolution: "@smithy/middleware-retry@npm:3.0.25" @@ -13516,7 +13633,7 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-retry@npm:^4.1.12, @smithy/middleware-retry@npm:^4.1.15, @smithy/middleware-retry@npm:^4.1.16, @smithy/middleware-retry@npm:^4.1.19, @smithy/middleware-retry@npm:^4.2.3, @smithy/middleware-retry@npm:^4.4.0": +"@smithy/middleware-retry@npm:^4.1.12, @smithy/middleware-retry@npm:^4.1.15, @smithy/middleware-retry@npm:^4.1.16, @smithy/middleware-retry@npm:^4.1.19, @smithy/middleware-retry@npm:^4.4.0": version: 4.4.0 resolution: "@smithy/middleware-retry@npm:4.4.0" dependencies: @@ -13533,6 +13650,23 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-retry@npm:^4.4.5": + version: 4.4.5 + resolution: "@smithy/middleware-retry@npm:4.4.5" + dependencies: + "@smithy/node-config-provider": ^4.3.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/service-error-classification": ^4.2.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + "@smithy/util-middleware": ^4.2.3 + "@smithy/util-retry": ^4.2.3 + "@smithy/uuid": ^1.1.0 + tslib: ^2.6.2 + checksum: fe196af3b5e91c4c64649425d51f61133e0776a4cb9ea3151a7aab53dea7abdf19fc7582168b615c0f90be570c0e6c2e048927ea012108b708419b1f62217dc6 + languageName: node + linkType: hard + "@smithy/middleware-serde@npm:^3.0.3, @smithy/middleware-serde@npm:^3.0.8": version: 3.0.8 resolution: "@smithy/middleware-serde@npm:3.0.8" @@ -13543,7 +13677,7 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-serde@npm:^4.0.8, @smithy/middleware-serde@npm:^4.0.9, @smithy/middleware-serde@npm:^4.1.1, @smithy/middleware-serde@npm:^4.2.0": +"@smithy/middleware-serde@npm:^4.0.8, @smithy/middleware-serde@npm:^4.0.9, @smithy/middleware-serde@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/middleware-serde@npm:4.2.0" dependencies: @@ -13554,6 +13688,17 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-serde@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/middleware-serde@npm:4.2.3" + dependencies: + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: c8cda503c62e380167595efb1d44b5cc81e23e88c9941f3b7cc485c1948c9d0c379252acdf46419281abb844bc5080a31c54f7e00427c411d8ae929dad1050a1 + languageName: node + linkType: hard + "@smithy/middleware-stack@npm:^3.0.3, @smithy/middleware-stack@npm:^3.0.8": version: 3.0.8 resolution: "@smithy/middleware-stack@npm:3.0.8" @@ -13564,7 +13709,7 @@ __metadata: languageName: node linkType: hard -"@smithy/middleware-stack@npm:^4.0.4, @smithy/middleware-stack@npm:^4.0.5, @smithy/middleware-stack@npm:^4.1.1, @smithy/middleware-stack@npm:^4.2.0": +"@smithy/middleware-stack@npm:^4.0.4, @smithy/middleware-stack@npm:^4.0.5, @smithy/middleware-stack@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/middleware-stack@npm:4.2.0" dependencies: @@ -13574,6 +13719,16 @@ __metadata: languageName: node linkType: hard +"@smithy/middleware-stack@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/middleware-stack@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 4a2cc539a6850501831a502a35eb135d5801003c3061e71e6cfc2cceba94a4db1a81e0c7f06f867871d20fc9b24868bddec513f3759ca484b299b153adf32dae + languageName: node + linkType: hard + "@smithy/node-config-provider@npm:^3.1.4, @smithy/node-config-provider@npm:^3.1.9": version: 3.1.9 resolution: "@smithy/node-config-provider@npm:3.1.9" @@ -13586,7 +13741,7 @@ __metadata: languageName: node linkType: hard -"@smithy/node-config-provider@npm:^4.1.3, @smithy/node-config-provider@npm:^4.1.4, @smithy/node-config-provider@npm:^4.2.2, @smithy/node-config-provider@npm:^4.3.0": +"@smithy/node-config-provider@npm:^4.1.3, @smithy/node-config-provider@npm:^4.1.4, @smithy/node-config-provider@npm:^4.3.0": version: 4.3.0 resolution: "@smithy/node-config-provider@npm:4.3.0" dependencies: @@ -13598,6 +13753,18 @@ __metadata: languageName: node linkType: hard +"@smithy/node-config-provider@npm:^4.3.3": + version: 4.3.3 + resolution: "@smithy/node-config-provider@npm:4.3.3" + dependencies: + "@smithy/property-provider": ^4.2.3 + "@smithy/shared-ini-file-loader": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: f8a6839f5850c289be5cc366fe45c9a0553752c5851f3b2eeb2e0b8cdeda183535767d41f7e9e99bfe3bfe7f6fd50c5861a6acd802e0ec49a12caa4789dde1b8 + languageName: node + linkType: hard + "@smithy/node-http-handler@npm:^3.1.4, @smithy/node-http-handler@npm:^3.2.5": version: 3.2.5 resolution: "@smithy/node-http-handler@npm:3.2.5" @@ -13611,7 +13778,7 @@ __metadata: languageName: node linkType: hard -"@smithy/node-http-handler@npm:^4.0.6, @smithy/node-http-handler@npm:^4.1.0, @smithy/node-http-handler@npm:^4.1.1, @smithy/node-http-handler@npm:^4.2.1, @smithy/node-http-handler@npm:^4.3.0": +"@smithy/node-http-handler@npm:^4.0.6, @smithy/node-http-handler@npm:^4.1.0, @smithy/node-http-handler@npm:^4.1.1, @smithy/node-http-handler@npm:^4.3.0": version: 4.3.0 resolution: "@smithy/node-http-handler@npm:4.3.0" dependencies: @@ -13624,6 +13791,19 @@ __metadata: languageName: node linkType: hard +"@smithy/node-http-handler@npm:^4.4.3": + version: 4.4.3 + resolution: "@smithy/node-http-handler@npm:4.4.3" + dependencies: + "@smithy/abort-controller": ^4.2.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/querystring-builder": ^4.2.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 343ca2d2ce8e8b11f849edaa69b52b439be93cf2351cac78c0c545e41af621b0300eaa32fdeea06e282a6b5801db3b9dc3b339674f7dd427aa1e26fd46968f2a + languageName: node + linkType: hard + "@smithy/property-provider@npm:^3.1.3, @smithy/property-provider@npm:^3.1.8": version: 3.1.8 resolution: "@smithy/property-provider@npm:3.1.8" @@ -13634,7 +13814,7 @@ __metadata: languageName: node linkType: hard -"@smithy/property-provider@npm:^4.0.4, @smithy/property-provider@npm:^4.0.5, @smithy/property-provider@npm:^4.1.1, @smithy/property-provider@npm:^4.2.0": +"@smithy/property-provider@npm:^4.0.4, @smithy/property-provider@npm:^4.0.5, @smithy/property-provider@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/property-provider@npm:4.2.0" dependencies: @@ -13644,6 +13824,16 @@ __metadata: languageName: node linkType: hard +"@smithy/property-provider@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/property-provider@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 1dc7a673023f3f4bb9e6fb879c5e02972d5e8dbc9d3aab36f6a1ef2ee897223416c4f98a2455e7837e42dcd923cbe18dcffd60843c6f8eef632fdfa4ebd529b8 + languageName: node + linkType: hard + "@smithy/protocol-http@npm:^4.1.0, @smithy/protocol-http@npm:^4.1.4, @smithy/protocol-http@npm:^4.1.5": version: 4.1.5 resolution: "@smithy/protocol-http@npm:4.1.5" @@ -13654,7 +13844,7 @@ __metadata: languageName: node linkType: hard -"@smithy/protocol-http@npm:^5.1.2, @smithy/protocol-http@npm:^5.1.3, @smithy/protocol-http@npm:^5.2.1, @smithy/protocol-http@npm:^5.3.0": +"@smithy/protocol-http@npm:^5.1.2, @smithy/protocol-http@npm:^5.1.3, @smithy/protocol-http@npm:^5.3.0": version: 5.3.0 resolution: "@smithy/protocol-http@npm:5.3.0" dependencies: @@ -13664,6 +13854,16 @@ __metadata: languageName: node linkType: hard +"@smithy/protocol-http@npm:^5.3.3": + version: 5.3.3 + resolution: "@smithy/protocol-http@npm:5.3.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: f94d43aefcabc89b3de881b6d11b40ca46367a938be7cb7ebea85a289d373f18b68453c7374e9d254805b84c336b8654fd2c6bbbf34b3974752de2b0774c7023 + languageName: node + linkType: hard + "@smithy/querystring-builder@npm:^3.0.3, @smithy/querystring-builder@npm:^3.0.7, @smithy/querystring-builder@npm:^3.0.8": version: 3.0.8 resolution: "@smithy/querystring-builder@npm:3.0.8" @@ -13686,6 +13886,17 @@ __metadata: languageName: node linkType: hard +"@smithy/querystring-builder@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/querystring-builder@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + "@smithy/util-uri-escape": ^4.2.0 + tslib: ^2.6.2 + checksum: a29741ddde6f9e9e4e3774b4008a12ecc189a9296b6ac6df4a563bd7e3e18352674e754bfbf2a87b2c0e9cede77e51bee88c54fb169d99b30f3f803571cb985e + languageName: node + linkType: hard + "@smithy/querystring-parser@npm:^3.0.8": version: 3.0.8 resolution: "@smithy/querystring-parser@npm:3.0.8" @@ -13706,6 +13917,16 @@ __metadata: languageName: node linkType: hard +"@smithy/querystring-parser@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/querystring-parser@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 974c20463b18dfc90b9446713ab959c1998ffd2269e512942fd16d831f44ef2684db700ba82afe9510c8a59b06e0765cc70a1eacc1ce4d7902a20c3e441e715e + languageName: node + linkType: hard + "@smithy/service-error-classification@npm:^3.0.8": version: 3.0.8 resolution: "@smithy/service-error-classification@npm:3.0.8" @@ -13724,6 +13945,15 @@ __metadata: languageName: node linkType: hard +"@smithy/service-error-classification@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/service-error-classification@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + checksum: 8cd7327515125632a5b7535a9db24ab3f3d733253224d260ac6bf94e04ed3abf99ebd6cfb723d160b3fe49aa87c573dc51775656f4a661939851521e1fd750bb + languageName: node + linkType: hard + "@smithy/shared-ini-file-loader@npm:^3.1.4, @smithy/shared-ini-file-loader@npm:^3.1.9": version: 3.1.9 resolution: "@smithy/shared-ini-file-loader@npm:3.1.9" @@ -13734,7 +13964,7 @@ __metadata: languageName: node linkType: hard -"@smithy/shared-ini-file-loader@npm:^4.0.4, @smithy/shared-ini-file-loader@npm:^4.0.5, @smithy/shared-ini-file-loader@npm:^4.2.0, @smithy/shared-ini-file-loader@npm:^4.3.0": +"@smithy/shared-ini-file-loader@npm:^4.0.4, @smithy/shared-ini-file-loader@npm:^4.0.5, @smithy/shared-ini-file-loader@npm:^4.3.0": version: 4.3.0 resolution: "@smithy/shared-ini-file-loader@npm:4.3.0" dependencies: @@ -13744,6 +13974,16 @@ __metadata: languageName: node linkType: hard +"@smithy/shared-ini-file-loader@npm:^4.3.3": + version: 4.3.3 + resolution: "@smithy/shared-ini-file-loader@npm:4.3.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 8e5092d0be0a45b265d0a469dfded89aa3da93e751262efa71e358ca95902a3e34f6ae1465790c7fea131e6a945f322a357b5d681c1a5f66baf4acbfff347937 + languageName: node + linkType: hard + "@smithy/signature-v4@npm:^4.1.0": version: 4.2.1 resolution: "@smithy/signature-v4@npm:4.2.1" @@ -13760,7 +14000,7 @@ __metadata: languageName: node linkType: hard -"@smithy/signature-v4@npm:^5.1.2, @smithy/signature-v4@npm:^5.1.3, @smithy/signature-v4@npm:^5.2.1, @smithy/signature-v4@npm:^5.3.0": +"@smithy/signature-v4@npm:^5.1.2, @smithy/signature-v4@npm:^5.1.3, @smithy/signature-v4@npm:^5.3.0": version: 5.3.0 resolution: "@smithy/signature-v4@npm:5.3.0" dependencies: @@ -13776,6 +14016,22 @@ __metadata: languageName: node linkType: hard +"@smithy/signature-v4@npm:^5.3.3": + version: 5.3.3 + resolution: "@smithy/signature-v4@npm:5.3.3" + dependencies: + "@smithy/is-array-buffer": ^4.2.0 + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + "@smithy/util-hex-encoding": ^4.2.0 + "@smithy/util-middleware": ^4.2.3 + "@smithy/util-uri-escape": ^4.2.0 + "@smithy/util-utf8": ^4.2.0 + tslib: ^2.6.2 + checksum: 454c5bc2847b066741fed57c7ea4ace1d6c3cb92387c78f3fd1ebf4c4a8629a65322bd13dd6f3dc62ef1f6b2f8d6d4ed88dfe8ce892c2fc6945d78e34e18727c + languageName: node + linkType: hard + "@smithy/smithy-client@npm:^3.1.12, @smithy/smithy-client@npm:^3.4.2": version: 3.4.2 resolution: "@smithy/smithy-client@npm:3.4.2" @@ -13791,7 +14047,7 @@ __metadata: languageName: node linkType: hard -"@smithy/smithy-client@npm:^4.4.10, @smithy/smithy-client@npm:^4.4.3, @smithy/smithy-client@npm:^4.4.6, @smithy/smithy-client@npm:^4.4.7, @smithy/smithy-client@npm:^4.6.2, @smithy/smithy-client@npm:^4.7.0": +"@smithy/smithy-client@npm:^4.4.10, @smithy/smithy-client@npm:^4.4.3, @smithy/smithy-client@npm:^4.4.6, @smithy/smithy-client@npm:^4.4.7, @smithy/smithy-client@npm:^4.7.0": version: 4.7.0 resolution: "@smithy/smithy-client@npm:4.7.0" dependencies: @@ -13806,6 +14062,21 @@ __metadata: languageName: node linkType: hard +"@smithy/smithy-client@npm:^4.9.1": + version: 4.9.1 + resolution: "@smithy/smithy-client@npm:4.9.1" + dependencies: + "@smithy/core": ^3.17.1 + "@smithy/middleware-endpoint": ^4.3.5 + "@smithy/middleware-stack": ^4.2.3 + "@smithy/protocol-http": ^5.3.3 + "@smithy/types": ^4.8.0 + "@smithy/util-stream": ^4.5.4 + tslib: ^2.6.2 + checksum: 6b50a5d00e2b68e72e78d08e6d90587159ed80d6fb9a6fb341cc78a55feca9f12157cb309eb8e22ab8fe6508a63ac4bfa2e42cf6f7077a8d571a30cb33232ce8 + languageName: node + linkType: hard + "@smithy/types@npm:^3.3.0, @smithy/types@npm:^3.5.0, @smithy/types@npm:^3.6.0, @smithy/types@npm:^3.7.2": version: 3.7.2 resolution: "@smithy/types@npm:3.7.2" @@ -13815,7 +14086,7 @@ __metadata: languageName: node linkType: hard -"@smithy/types@npm:^4.3.1, @smithy/types@npm:^4.3.2, @smithy/types@npm:^4.5.0, @smithy/types@npm:^4.6.0": +"@smithy/types@npm:^4.3.1, @smithy/types@npm:^4.3.2, @smithy/types@npm:^4.6.0": version: 4.6.0 resolution: "@smithy/types@npm:4.6.0" dependencies: @@ -13824,6 +14095,15 @@ __metadata: languageName: node linkType: hard +"@smithy/types@npm:^4.8.0": + version: 4.8.0 + resolution: "@smithy/types@npm:4.8.0" + dependencies: + tslib: ^2.6.2 + checksum: 342173aeaa80b3837dce51c393a3fcab7db9b3ec1481cbc6d00298566076481b88e274c258c2dab54112641d66ab678c7ed7dc2c2a4500ffcf407a6d61c33fd0 + languageName: node + linkType: hard + "@smithy/url-parser@npm:^3.0.3, @smithy/url-parser@npm:^3.0.8": version: 3.0.8 resolution: "@smithy/url-parser@npm:3.0.8" @@ -13835,7 +14115,7 @@ __metadata: languageName: node linkType: hard -"@smithy/url-parser@npm:^4.0.4, @smithy/url-parser@npm:^4.0.5, @smithy/url-parser@npm:^4.1.1, @smithy/url-parser@npm:^4.2.0": +"@smithy/url-parser@npm:^4.0.4, @smithy/url-parser@npm:^4.0.5, @smithy/url-parser@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/url-parser@npm:4.2.0" dependencies: @@ -13846,6 +14126,17 @@ __metadata: languageName: node linkType: hard +"@smithy/url-parser@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/url-parser@npm:4.2.3" + dependencies: + "@smithy/querystring-parser": ^4.2.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: fe624e0ed2447a6e27c32560aaf8371847982185743cfefe4d5fd46ddeb05bff12cd9fcdb4e568d1ce0c7dc1e5317e0e3cc5e78096c3ceb0fb77da93f86e7f56 + languageName: node + linkType: hard + "@smithy/util-base64@npm:^3.0.0": version: 3.0.0 resolution: "@smithy/util-base64@npm:3.0.0" @@ -13857,7 +14148,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-base64@npm:^4.0.0, @smithy/util-base64@npm:^4.1.0, @smithy/util-base64@npm:^4.2.0": +"@smithy/util-base64@npm:^4.0.0, @smithy/util-base64@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-base64@npm:4.2.0" dependencies: @@ -13868,6 +14159,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-base64@npm:^4.3.0": + version: 4.3.0 + resolution: "@smithy/util-base64@npm:4.3.0" + dependencies: + "@smithy/util-buffer-from": ^4.2.0 + "@smithy/util-utf8": ^4.2.0 + tslib: ^2.6.2 + checksum: 02dd536b9257914cc9a595a865faac64fc96db10468d52d0cba475df78764fc25ba255707ccd061ee197fca189d7859d70af8cf89b0b0c3e27c1c693676eb6e4 + languageName: node + linkType: hard + "@smithy/util-body-length-browser@npm:^3.0.0": version: 3.0.0 resolution: "@smithy/util-body-length-browser@npm:3.0.0" @@ -13877,7 +14179,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-body-length-browser@npm:^4.0.0, @smithy/util-body-length-browser@npm:^4.1.0, @smithy/util-body-length-browser@npm:^4.2.0": +"@smithy/util-body-length-browser@npm:^4.0.0, @smithy/util-body-length-browser@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-body-length-browser@npm:4.2.0" dependencies: @@ -13895,7 +14197,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-body-length-node@npm:^4.0.0, @smithy/util-body-length-node@npm:^4.1.0, @smithy/util-body-length-node@npm:^4.2.0": +"@smithy/util-body-length-node@npm:^4.0.0, @smithy/util-body-length-node@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-body-length-node@npm:4.2.0" dependencies: @@ -13904,6 +14206,15 @@ __metadata: languageName: node linkType: hard +"@smithy/util-body-length-node@npm:^4.2.1": + version: 4.2.1 + resolution: "@smithy/util-body-length-node@npm:4.2.1" + dependencies: + tslib: ^2.6.2 + checksum: 3c32306735af5b62f75375e976a531ab45f171dfb0dc23ee035478d2132eaf21f244c31b0f3e861c514ff97d8112055e74c98ed44595ad24bd31434d5fdaf4bf + languageName: node + linkType: hard + "@smithy/util-buffer-from@npm:^2.0.0": version: 2.0.0 resolution: "@smithy/util-buffer-from@npm:2.0.0" @@ -13943,7 +14254,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-config-provider@npm:^4.0.0, @smithy/util-config-provider@npm:^4.1.0, @smithy/util-config-provider@npm:^4.2.0": +"@smithy/util-config-provider@npm:^4.0.0, @smithy/util-config-provider@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-config-provider@npm:4.2.0" dependencies: @@ -13965,7 +14276,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-browser@npm:^4.0.19, @smithy/util-defaults-mode-browser@npm:^4.0.22, @smithy/util-defaults-mode-browser@npm:^4.0.23, @smithy/util-defaults-mode-browser@npm:^4.0.26, @smithy/util-defaults-mode-browser@npm:^4.1.2, @smithy/util-defaults-mode-browser@npm:^4.2.0": +"@smithy/util-defaults-mode-browser@npm:^4.0.19, @smithy/util-defaults-mode-browser@npm:^4.0.22, @smithy/util-defaults-mode-browser@npm:^4.0.23, @smithy/util-defaults-mode-browser@npm:^4.0.26, @smithy/util-defaults-mode-browser@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-defaults-mode-browser@npm:4.2.0" dependencies: @@ -13978,6 +14289,18 @@ __metadata: languageName: node linkType: hard +"@smithy/util-defaults-mode-browser@npm:^4.3.4": + version: 4.3.4 + resolution: "@smithy/util-defaults-mode-browser@npm:4.3.4" + dependencies: + "@smithy/property-provider": ^4.2.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: b3e48214a2f9e3b55995e7b44b4531b37c4e83960582afae8991ba98d2552132e1fc1962408be476ec45301cf03887194d5941cc76db500ad2f4fc748552bfee + languageName: node + linkType: hard + "@smithy/util-defaults-mode-node@npm:^3.0.14": version: 3.0.25 resolution: "@smithy/util-defaults-mode-node@npm:3.0.25" @@ -13993,7 +14316,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-defaults-mode-node@npm:^4.0.19, @smithy/util-defaults-mode-node@npm:^4.0.22, @smithy/util-defaults-mode-node@npm:^4.0.23, @smithy/util-defaults-mode-node@npm:^4.0.26, @smithy/util-defaults-mode-node@npm:^4.1.2, @smithy/util-defaults-mode-node@npm:^4.2.0": +"@smithy/util-defaults-mode-node@npm:^4.0.19, @smithy/util-defaults-mode-node@npm:^4.0.22, @smithy/util-defaults-mode-node@npm:^4.0.23, @smithy/util-defaults-mode-node@npm:^4.0.26, @smithy/util-defaults-mode-node@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-defaults-mode-node@npm:4.2.0" dependencies: @@ -14008,6 +14331,21 @@ __metadata: languageName: node linkType: hard +"@smithy/util-defaults-mode-node@npm:^4.2.6": + version: 4.2.6 + resolution: "@smithy/util-defaults-mode-node@npm:4.2.6" + dependencies: + "@smithy/config-resolver": ^4.4.0 + "@smithy/credential-provider-imds": ^4.2.3 + "@smithy/node-config-provider": ^4.3.3 + "@smithy/property-provider": ^4.2.3 + "@smithy/smithy-client": ^4.9.1 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: edd0918a5cff0787dd2fadf8aa36ef603922eaff5f3b2ec620c2c522e2bbda127327c26debe26028544ff34d5726004cfbf8c0a90505b657b852989a94f5c8ab + languageName: node + linkType: hard + "@smithy/util-endpoints@npm:^2.0.5": version: 2.1.4 resolution: "@smithy/util-endpoints@npm:2.1.4" @@ -14019,7 +14357,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-endpoints@npm:^3.0.6, @smithy/util-endpoints@npm:^3.0.7, @smithy/util-endpoints@npm:^3.1.2, @smithy/util-endpoints@npm:^3.2.0": +"@smithy/util-endpoints@npm:^3.0.6, @smithy/util-endpoints@npm:^3.0.7, @smithy/util-endpoints@npm:^3.2.0": version: 3.2.0 resolution: "@smithy/util-endpoints@npm:3.2.0" dependencies: @@ -14030,6 +14368,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-endpoints@npm:^3.2.3": + version: 3.2.3 + resolution: "@smithy/util-endpoints@npm:3.2.3" + dependencies: + "@smithy/node-config-provider": ^4.3.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 49daffb28d384e7c58f04ac3610f295f41b3ceef78f295ebff6d737efa142e9c95e4eed6db06ca085de7497fc95a4dbb2be99050ca31d07f399aaf63ab0adf35 + languageName: node + linkType: hard + "@smithy/util-hex-encoding@npm:^3.0.0": version: 3.0.0 resolution: "@smithy/util-hex-encoding@npm:3.0.0" @@ -14058,7 +14407,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-middleware@npm:^4.0.4, @smithy/util-middleware@npm:^4.0.5, @smithy/util-middleware@npm:^4.1.1, @smithy/util-middleware@npm:^4.2.0": +"@smithy/util-middleware@npm:^4.0.4, @smithy/util-middleware@npm:^4.0.5, @smithy/util-middleware@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-middleware@npm:4.2.0" dependencies: @@ -14068,6 +14417,16 @@ __metadata: languageName: node linkType: hard +"@smithy/util-middleware@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/util-middleware@npm:4.2.3" + dependencies: + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: e98d461754d849b543a69e6a0fa74448cf00cf0954d6f484f735bcbf6c10a51cf63ad2090bcd8f276c19cbe7c413075ee49e6018cad8c15c3844480fa0efd0a1 + languageName: node + linkType: hard + "@smithy/util-retry@npm:^3.0.3, @smithy/util-retry@npm:^3.0.8": version: 3.0.8 resolution: "@smithy/util-retry@npm:3.0.8" @@ -14079,7 +14438,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-retry@npm:^4.0.5, @smithy/util-retry@npm:^4.0.6, @smithy/util-retry@npm:^4.0.7, @smithy/util-retry@npm:^4.1.2, @smithy/util-retry@npm:^4.2.0": +"@smithy/util-retry@npm:^4.0.5, @smithy/util-retry@npm:^4.0.6, @smithy/util-retry@npm:^4.0.7, @smithy/util-retry@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-retry@npm:4.2.0" dependencies: @@ -14090,6 +14449,17 @@ __metadata: languageName: node linkType: hard +"@smithy/util-retry@npm:^4.2.3": + version: 4.2.3 + resolution: "@smithy/util-retry@npm:4.2.3" + dependencies: + "@smithy/service-error-classification": ^4.2.3 + "@smithy/types": ^4.8.0 + tslib: ^2.6.2 + checksum: 9340714056d3ae6513c2527ba0806712aa4e86532ead5150dd0d34210a9f6d10ea1bb55cf4efa3711234444b58dca561a2708d885e61b2dd926a7cb6cf74baa2 + languageName: node + linkType: hard + "@smithy/util-stream@npm:^3.1.3, @smithy/util-stream@npm:^3.2.1": version: 3.2.1 resolution: "@smithy/util-stream@npm:3.2.1" @@ -14106,7 +14476,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-stream@npm:^4.2.2, @smithy/util-stream@npm:^4.2.3, @smithy/util-stream@npm:^4.2.4, @smithy/util-stream@npm:^4.3.1, @smithy/util-stream@npm:^4.4.0": +"@smithy/util-stream@npm:^4.2.2, @smithy/util-stream@npm:^4.2.3, @smithy/util-stream@npm:^4.2.4, @smithy/util-stream@npm:^4.4.0": version: 4.4.0 resolution: "@smithy/util-stream@npm:4.4.0" dependencies: @@ -14122,6 +14492,22 @@ __metadata: languageName: node linkType: hard +"@smithy/util-stream@npm:^4.5.4": + version: 4.5.4 + resolution: "@smithy/util-stream@npm:4.5.4" + dependencies: + "@smithy/fetch-http-handler": ^5.3.4 + "@smithy/node-http-handler": ^4.4.3 + "@smithy/types": ^4.8.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 + checksum: 9c0ea9062b6800a1261524d4268cbbd943e3681367a5c0ff3b3186889b76c28516acfdaf1c47ad71f72a909c796d97204b1e4cd338cd52e54ace808658a826b5 + languageName: node + linkType: hard + "@smithy/util-uri-escape@npm:^3.0.0": version: 3.0.0 resolution: "@smithy/util-uri-escape@npm:3.0.0" @@ -14160,7 +14546,7 @@ __metadata: languageName: node linkType: hard -"@smithy/util-utf8@npm:^4.0.0, @smithy/util-utf8@npm:^4.1.0, @smithy/util-utf8@npm:^4.2.0": +"@smithy/util-utf8@npm:^4.0.0, @smithy/util-utf8@npm:^4.2.0": version: 4.2.0 resolution: "@smithy/util-utf8@npm:4.2.0" dependencies: @@ -14181,14 +14567,14 @@ __metadata: languageName: node linkType: hard -"@smithy/util-waiter@npm:^4.0.6, @smithy/util-waiter@npm:^4.0.7, @smithy/util-waiter@npm:^4.1.1, @smithy/util-waiter@npm:^4.2.0": - version: 4.2.0 - resolution: "@smithy/util-waiter@npm:4.2.0" +"@smithy/util-waiter@npm:^4.0.6, @smithy/util-waiter@npm:^4.0.7": + version: 4.0.7 + resolution: "@smithy/util-waiter@npm:4.0.7" dependencies: - "@smithy/abort-controller": ^4.2.0 - "@smithy/types": ^4.6.0 + "@smithy/abort-controller": ^4.0.5 + "@smithy/types": ^4.3.2 tslib: ^2.6.2 - checksum: fc72b46d83f66172328be84a48df969890ac2f88b449a4937ac1510edfce1f6792f03b28afd337735da6d9469461e35f8d56d69f1aa6f2b3eaf663e791829f42 + checksum: 14caffd913b9b18ff4f33d6bb1f05eef2e354104a6db2b69654d7db4582c4be46b202d46af87a66177a8a3a99082fa8b0948195de8aeb63998c6ed5b04f2bd3d languageName: node linkType: hard @@ -18423,15 +18809,15 @@ __metadata: linkType: hard "chai@npm:^5.2.0": - version: 5.3.3 - resolution: "chai@npm:5.3.3" + version: 5.2.1 + resolution: "chai@npm:5.2.1" dependencies: assertion-error: ^2.0.1 check-error: ^2.1.1 deep-eql: ^5.0.1 loupe: ^3.1.0 pathval: ^2.0.0 - checksum: b360fd4d38861622e5010c2f709736988b05c7f31042305fa3f4e9911f6adb80ccfb4e302068bf8ed10e835c2e2520cba0f5edc13d878b886987e5aa62483f53 + checksum: 58209c03ae9b2fd97cfa1cb0fbe372b1906e6091311b9ba1b0468cc4923b0766a50a1050a164df3ccefb9464944c9216b632f1477c9e429068013bdbb57220f6 languageName: node linkType: hard @@ -21859,16 +22245,16 @@ __metadata: linkType: hard "expect@npm:>28.1.3": - version: 30.1.2 - resolution: "expect@npm:30.1.2" + version: 30.0.4 + resolution: "expect@npm:30.0.4" dependencies: - "@jest/expect-utils": 30.1.2 - "@jest/get-type": 30.1.0 - jest-matcher-utils: 30.1.2 - jest-message-util: 30.1.0 - jest-mock: 30.0.5 - jest-util: 30.0.5 - checksum: 467c1b69549e75a1a09f3feec335e0dc968cd71370361b5d83248351cf77e705e8ddf38a4885e32a50237502ced7fcc9106462f59f33c4796462e95938b8ca19 + "@jest/expect-utils": 30.0.4 + "@jest/get-type": 30.0.1 + jest-matcher-utils: 30.0.4 + jest-message-util: 30.0.2 + jest-mock: 30.0.2 + jest-util: 30.0.2 + checksum: de0c7cf4068591feda6b4b1dfcb5711f085266bfa720a8498ac8c0d03fbfa84881f54b67f25c79bee4bf0f6040ee12ed004b209de7d0cff82fd06d7b42baabc2 languageName: node linkType: hard @@ -25326,15 +25712,15 @@ __metadata: languageName: node linkType: hard -"jest-diff@npm:30.1.2": - version: 30.1.2 - resolution: "jest-diff@npm:30.1.2" +"jest-diff@npm:30.0.4": + version: 30.0.4 + resolution: "jest-diff@npm:30.0.4" dependencies: "@jest/diff-sequences": 30.0.1 - "@jest/get-type": 30.1.0 + "@jest/get-type": 30.0.1 chalk: ^4.1.2 - pretty-format: 30.0.5 - checksum: 5baba5c54d044faf77540d2b97f947ce2a735c529bdca23ccd25669085ba3912eef2a8f66f4d765e8e416b1e10b95cb1dded0ebc1633efdbef37706b4e767ecb + pretty-format: 30.0.2 + checksum: aceae3a2e90ec232305ba43082e34ec5d24867459a6f52169e47edfd5f55457788ad534ff781d12e6606a70bc7ddc5090e45748732772679065dfd56f46f8ab1 languageName: node linkType: hard @@ -25508,15 +25894,15 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:30.1.2": - version: 30.1.2 - resolution: "jest-matcher-utils@npm:30.1.2" +"jest-matcher-utils@npm:30.0.4": + version: 30.0.4 + resolution: "jest-matcher-utils@npm:30.0.4" dependencies: - "@jest/get-type": 30.1.0 + "@jest/get-type": 30.0.1 chalk: ^4.1.2 - jest-diff: 30.1.2 - pretty-format: 30.0.5 - checksum: c4f81fc7d72f94b18dff807adf787d6fd081c3e150148fbbcb1559c353b27890989bcf7e10b15d763625565175bf30019e93a014078ff291646a88a9acdfc9a4 + jest-diff: 30.0.4 + pretty-format: 30.0.2 + checksum: 18f9f808e1de56a466d3a858acd5d253ea13e386619de05fe21b37316305b15feb078f12beae9228c878fc6b60b9bbbd1a6240f1878f80a222d241b38e54b53f languageName: node linkType: hard @@ -25544,20 +25930,20 @@ __metadata: languageName: node linkType: hard -"jest-message-util@npm:30.1.0": - version: 30.1.0 - resolution: "jest-message-util@npm:30.1.0" +"jest-message-util@npm:30.0.2": + version: 30.0.2 + resolution: "jest-message-util@npm:30.0.2" dependencies: "@babel/code-frame": ^7.27.1 - "@jest/types": 30.0.5 + "@jest/types": 30.0.1 "@types/stack-utils": ^2.0.3 chalk: ^4.1.2 graceful-fs: ^4.2.11 micromatch: ^4.0.8 - pretty-format: 30.0.5 + pretty-format: 30.0.2 slash: ^3.0.0 stack-utils: ^2.0.6 - checksum: 3884f7e772d64891eca63870f73b89af4e1dce715611c308e1115f7961ed378560bac66c5f9cbee025b06ca530dbd30685362cb8db7b5a48f5f53b75ba79023e + checksum: c010d5b7d86e735e2fb4c4a220f57004349f488f5d4663240a7e9f2694d01b5228136540d55036777fde4227b5e0b56f08885b7f69395b295cab878357b1aeb1 languageName: node linkType: hard @@ -25612,14 +25998,14 @@ __metadata: languageName: node linkType: hard -"jest-mock@npm:30.0.5": - version: 30.0.5 - resolution: "jest-mock@npm:30.0.5" +"jest-mock@npm:30.0.2": + version: 30.0.2 + resolution: "jest-mock@npm:30.0.2" dependencies: - "@jest/types": 30.0.5 + "@jest/types": 30.0.1 "@types/node": "*" - jest-util: 30.0.5 - checksum: 207fd79297f514a8e26ede9b4b5035e70212b8850a2f460b51d3cc58e8e7c9585bd2dbc5df2475a3321c4cd114b90e0b24190f00d6eeb88c8f088a8ed00416d5 + jest-util: 30.0.2 + checksum: 7728997c1d654475b88e18b7ba33a2a1b9f89ce33a9082bf2d14dcc3e831f372f80c762e481777886a3a04b4489ea5390ecdeb21c4def57fba5b2c77086a3959 languageName: node linkType: hard @@ -25905,17 +26291,17 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:30.0.5": - version: 30.0.5 - resolution: "jest-util@npm:30.0.5" +"jest-util@npm:30.0.2": + version: 30.0.2 + resolution: "jest-util@npm:30.0.2" dependencies: - "@jest/types": 30.0.5 + "@jest/types": 30.0.1 "@types/node": "*" chalk: ^4.1.2 ci-info: ^4.2.0 graceful-fs: ^4.2.11 picomatch: ^4.0.2 - checksum: d3808b5f7720044d0464664c795e2b795ed82edf3b5871db74b8b603c3a0a38107668730348d26f92920ca3b8245a99cbbc2c93e77d0abb1f5e27524079a4ba8 + checksum: 07de384790b8e5a5925fba5448fa1475790a5b52271fbf99958c18e468da1af940f8b45e330d87766576cf6c5d1f4f41ce51c976483a5079653d9fcdba8aac8e languageName: node linkType: hard @@ -27044,9 +27430,9 @@ __metadata: linkType: hard "loupe@npm:^3.1.0, loupe@npm:^3.1.4": - version: 3.2.1 - resolution: "loupe@npm:3.2.1" - checksum: 910c872cba291309664c2d094368d31a68907b6f5913e989d301b5c25f30e97d76d77f23ab3bf3b46d0f601ff0b6af8810c10c31b91d2c6b2f132809ca2cc705 + version: 3.1.4 + resolution: "loupe@npm:3.1.4" + checksum: 5c2e6aefaad25f812d361c750b8cf4ff91d68de289f141d7c85c2ce9bb79eeefa06a93c85f7b87cba940531ed8f15e492f32681d47eed23842ad1963eb3a154d languageName: node linkType: hard @@ -30537,14 +30923,14 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:30.0.5": - version: 30.0.5 - resolution: "pretty-format@npm:30.0.5" +"pretty-format@npm:30.0.2": + version: 30.0.2 + resolution: "pretty-format@npm:30.0.2" dependencies: - "@jest/schemas": 30.0.5 + "@jest/schemas": 30.0.1 ansi-styles: ^5.2.0 react-is: ^18.3.1 - checksum: 9f6cf1af5c3169093866c80adbfdad32f69c692b62f24ba3ca8cdec8519336123323f896396f9fa40346a41b197c5f6be15aec4d8620819f12496afaaca93f81 + checksum: cf542dc2d0be95e2b1c6e3a397a4fc13fce1c9f8feed6b56165c0d23c7a83423abb6b032ed8e3e1b7c1c0709f9b117dd30b5185f107e58f8766616be6de84850 languageName: node linkType: hard @@ -33704,9 +34090,9 @@ __metadata: linkType: hard "tinyspy@npm:^4.0.3": - version: 4.0.4 - resolution: "tinyspy@npm:4.0.4" - checksum: a8020fc17799251e06a8398dcc352601d2770aa91c556b9531ecd7a12581161fd1c14e81cbdaff0c1306c93bfdde8ff6d1c1a3f9bbe6d91604f0fd4e01e2f1eb + version: 4.0.3 + resolution: "tinyspy@npm:4.0.3" + checksum: 0a92a18b5350945cc8a1da3a22c9ad9f4e2945df80aaa0c43e1b3a3cfb64d8501e607ebf0305e048e3c3d3e0e7f8eb10cea27dc17c21effb73e66c4a3be36373 languageName: node linkType: hard